#!/usr/bin/perl

use strict qw(subs refs);

sub catsksz {
    my ($input, $seek, $siz, $output) = @_;
    my ($buf, $sz);

    while (($sz = sysread($input, $buf, $seek > 4096 ? 4096 : $seek))) {
	$seek -= $sz;
	last unless $seek > 0;
    }
    while (($sz = sysread($input, $buf, $siz > 4096 ? 4096 : $siz))) {
	$siz -= $sz;
	syswrite($output, $buf);
	last unless $siz > 0;
    }
}

sub main {
    my ($basename, $dir, $file) = @_;
    my %data;

    eval `cat $basename.cz2.pl`;

    die "unable to find file $file in archive $basename.cz2" unless $data{$file};

#    system "head < $name.cz2 -c ". ($data{$file}[0] + $data{$file}[1]) ." | tail -c ". $data{$file}[1] ."| bzip2 -d | head -c ". ($data{$file}[2] + $data{$file}[3]) ." | tail -c ". $data{$file}[3] ." > $file.from_archive";
#    system "./catsksz < $name.cz2 $data{$file}[0] $data{$file}[1] | bzip2 -d | ./catsksz $data{$file}[2] $data{$file}[3] > $file.from_archive";

    local *OUTPUT;
    if (open OUTPUT, "-|") {
	local *FILE;
	open FILE, $dir ? ">$dir/$file" : ">&STDOUT";
	catsksz(\*OUTPUT, $data{$file}[2], $data{$file}[3], \*FILE);
    } else {
	local *BUNZIP2;
	open BUNZIP2, "| bzip2 -d";
	local *ARCHIVE;
	open ARCHIVE, "<$basename.cz2" or die "cannot open archive $basename.bz2";
	catsksz(\*ARCHIVE, $data{$file}[0], $data{$file}[1], \*BUNZIP2);
	exec 'true';
    }
}

main(@ARGV);
