home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- #- Simple cat archive with bzip2 for perl.
- #- read file list and produce a perl script in stdout with hash data and $ARGV[0].cz2 archive file.
- #- hash data is :
- #- { 'filename' => [ $off1, $siz1, $off2, $siz2 ], ... }
- #- bzip2 -d between ..1 and ..2
- use strict qw(subs vars refs);
-
- sub main {
- my ($name, $maxsiz) = @_;
- my ($off1, $siz1, $off2, $siz2) = (0, 0, 0, 0);
- my @filelist = ();
- my %data = ();
-
- die "usage: $0 <name> <maxsiz>" unless $maxsiz > 100000;
-
- unlink "$name.cz2";
-
- foreach (<STDIN>) {
- chomp;
-
- my $file = $_; die "unable to find file $file" unless -e $file;
- $siz2 = -s $file;
-
- push @filelist, $file;
- $data{$file} = [ -1, -1, $off2, $siz2 ];
-
- if ($off2 + $siz2 > $maxsiz) { #- need compression.
- system "cat @filelist | bzip2 -3 >tmp.bz2";
- $siz1 = -s "tmp.bz2";
-
- $data{$_} = [ $off1, $siz1, $data{$_}[2], $data{$_}[3] ] foreach @filelist;
-
- system "cat tmp.bz2 >>$name.cz2";
- $off1 += $siz1;
- $off2 = 0; $siz2 = 0;
- @filelist = ();
- }
- $off2 += $siz2;
- }
- if (scalar @filelist) {
- system "cat @filelist | bzip2 -3 >tmp.bz2";
- $siz1 = -s "tmp.bz2";
-
- $data{$_} = [ $off1, $siz1, $data{$_}[2], $data{$_}[3] ] foreach @filelist;
-
- system "cat tmp.bz2 >>$name.cz2";
- $off1 += $siz1;
- print STDERR "archive size of $name.cz2 is $off1\n";
- }
-
- local *OUTPUT;
- open OUTPUT, ">$name.cz2.pl";
- print OUTPUT "\%data = (\n";
- foreach (keys %data) {
- print OUTPUT "\'$_\' => [ ". join(', ', @{$data{$_}}) ." ],\n";
- }
- print OUTPUT ");\n";
- }
-
- main(@ARGV);
- unlink "tmp.bz2";
-