#!/usr/bin/perl -w

$BUFS = (16*1024);

$pat = "^"; 
while ($ARGV[0]) { 
	$pat .= "|$ARGV[0]"; 
	shift(@ARGV); 
} 

while ($p = <STDIN>) { 
	my ($fn) = ($p =~ /^(\S+)/);
	my ($mode) = ($' =~ /(\d+)/); 
	my ($size) = ($p =~ /\s(\d+)$/); 
	$fn =~ s|^/||; 
	unless ($fn =~ /$pat/) { 
		print "skipping $fn\n";
		next;
	}
	
	printf "%-9d %s\n",$size,$fn; 

	if (oct($mode) & 020000000000) { 
		mkdir($fn, $mode & 0xffff);
		next;
	} 
	
	my $dir = dirname($fn); 
	unless (-d $dir) {
		my $m = $mode & 0xffff;
		$cmd = ("mkdir -p $dir"); 
		print "$cmd\n";
		system($cmd);
	}

	next unless $size > 0 ;

	open(F,">$fn") || die "cannot open $fn"; 
	while ($size > 0 && ($n = read STDIN,$buffer,
			$size > $BUFS ? $BUFS : $size) > 0) { 
		print F $buffer;
		$size -= $n; 
	} 
	close F; 
}	

sub dirname($) { 
	my ($fn) = (@_); 
	return "." unless ($fn =~ m|/|); 
	my ($dir) = ($fn =~ m|(.*)/[^/]+$|);
	return $dir;
} 

