#! /usr/bin/perl

use Fcntl ':seek';
use File::Basename;
use File::Path qw(make_path);

my $footerSize = 20,
	$recordSize = 268;

my $dataFile,
	$bytesRead,
	$data;

open($dataFile, '<:raw', 'Data.bcp') or die('Can not open Data.bcp');
seek($dataFile, -$footerSize, SEEK_END);
$bytesRead = read($dataFile, $data, $footerSize);
my ($magicNumber, $dummy, $dummy, $numberOfRecords, $dummy) = unpack('A4 L L L L', $data);

if ($magicNumber ne 'BCPF') {
	die('Not a BCPF file');
}

print "Processing $numberOfRecords records...\n";

for (my $i = 0; $i < $numberOfRecords; $i++) {
	seek($dataFile, -(($numberOfRecords - $i) * $recordSize + $footerSize), SEEK_END);
	$bytesRead = read($dataFile, $data, $recordSize);
	my ($fileName, $position, $length, $length2) = unpack('a256 L L L', $data);
	if (-s $fileName) {
		next;
	}
	if ($length != $length2) {
		die("Length mismatch for file $fileName");
	}

	printf("Reading %s (%i KB)...\n", $fileName, $length / 1024);

	seek($dataFile, $position, SEEK_SET);
	$bytesRead = read($dataFile, $data, $length);
	if ($bytesRead != $length) {
		die("Expected $length bytes for $fileName, got $bytesRead");
	}

	$dirName = dirname($fileName);
	if (not -d $dirName) {
		make_path($dirName);
	}

	open($file, '>:raw', $fileName) or die("Can not open $fileName");
	print $file $data;
	close($file);
}

close($dataFile);
