> Date: Wed, 05 Jun 2013 20:59:39 -0400
> From: Ted Unangst <[email protected]>
>
> Something that comes up from time to time is the question of whether
> to import bzip2 into base or not. Turns out the question is moot
> because already have imported it. There's a copy in perl. (I didn't
> know this until I happened to be watching a build closer than usual.)
>
> Since we already have the code built, why not let people use it? This
> is a small perl script that implements the 90% subset of functionality
> people expect from the regular bzip2 and bunzip2 utilities. It's not
> really complete or perfect, but I haven't spent all that much time on
> it.
<full disclosure>
I'm a Perl hater
</full disclosure>
I've ranted before about implementing "standard" tools in Perl. The
user experience just isn't the same as with C code.
But even more so than with nl(1), why would we want to use something
that's different from what everybody else uses? If we want bzip2 in
base (and I think there are good reasons for having it) we should
simply use the standard bzip2 code.
> --- /dev/null Wed Jun 5 20:54:56 2013
> +++ bzip2/Makefile Wed Jun 5 20:51:51 2013
> @@ -0,0 +1,15 @@
> +# $OpenBSD$
> +
> +.include <bsd.own.mk>
> +
> +MAN=
> +
> +SCRIPT=bzip2.pl
> +LINKS=${BINDIR}/bzip2 ${BINDIR}/bunzip2
> +
> +realinstall:
> + ${INSTALL} ${INSTALL_COPY} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \
> + ${.CURDIR}/${SCRIPT} ${DESTDIR}${BINDIR}/bzip2
> +
> +
> +.include <bsd.prog.mk>
> --- /dev/null Wed Jun 5 20:55:02 2013
> +++ bzip2/bzip2.pl Wed Jun 5 20:53:23 2013
> @@ -0,0 +1,113 @@
> +#!/usr/bin/perl -w
> +# $OpenBSD$
> +# Copyright (c) Ted Unangst <[email protected]>
> +#
> +# Permission to use, copy, modify, and distribute this software for any
> +# purpose with or without fee is hereby granted, provided that the above
> +# copyright notice and this permission notice appear in all copies.
> +#
> +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> +
> +use strict;
> +use Getopt::Long qw(:config posix_default bundling no_ignore_case);
> +use IO::Compress::Bzip2 qw(bzip2);
> +
> +
> +my $usestdout;
> +my $level = 9;
> +my $reqlevel; # requested level, who cares?
> +GetOptions(
> + "c|stdout" => \$usestdout,
> + "1|2|3|4|5|6|7|8|9|fast|best" => \$reqlevel
> +);
> +
> +sub bzipfile {
> + my $fname = shift;
> + my $ofname;
> + my $in;
> + if ($fname ne "-") {
> + if ($usestdout) {
> + $ofname = "-";
> + } else {
> + $ofname = $fname . ".bz2";
> + if (-e $ofname) {
> + warn "Output file $ofname already exists.\n";
> + return;
> + }
> + }
> + $in = new IO::File "<$fname";
> + if (!$in) {
> + warn "Can't open input file $fname.\n";
> + return;
> + }
> + } else {
> + $in = "-";
> + $ofname = "-";
> + }
> + if ($ofname eq "-" && -t STDOUT) {
> + warn "I won't write compressed data to a terminal.\n";
> + return;
> + }
> + if (not bzip2 $in => $ofname, BlockSize100K => $level) {
> + warn "failz";
> + return;
> + }
> + if ($ofname ne "-") {
> + unlink($fname);
> + }
> +}
> +
> +sub bunzipfile {
> +print "bunzipping\n";
> + my $fname = shift;
> + my $ofname;
> + my $in;
> + if ($fname ne "-") {
> + if ($usestdout) {
> + $ofname = "-";
> + } else {
> + $ofname = $fname;
> + $ofname =~ s/\.bz2$//;
> + if (-e $ofname) {
> + warn "Output file $ofname already exists.\n";
> + return;
> + }
> + }
> + $in = new IO::File "<$fname";
> + if (!$in) {
> + warn "Can't open input file $fname.\n";
> + return;
> + }
> + } else {
> + $in = "-";
> + $ofname = "-";
> + }
> + if (not bunzip2 $in => $ofname) {
> + warn "failz";
> + return;
> + }
> + if ($ofname ne "-") {
> + unlink($fname);
> + }
> +}
> +
> +my $main;
> +if ($0 =~ /bunzip2$/) {
> + $main = \&bunzipfile;
> +} else {
> + $main = \&bzipfile;
> +}
> +
> +if (@ARGV == 0) {
> + &$main("-");
> +} else {
> + foreach my $f (@ARGV) {
> + &$main($f);
> + }
> +}
>
>