#! /usr/bin/perl

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

my $headerSize = 16,
    $recordSize = 144;

my $dataFile,
	$bytesRead,
	$data;

open($dataFile, '<:raw', 'data.oos') or die('Can not open data.oos');
# seek($dataFile, -$footerSize, SEEK_END);
$bytesRead = read($dataFile, $data, $headerSize);
my ($magicNumber, $dummy, $numberOfRecords, $dummy) = unpack('a7 L L a1', $data);

if ($magicNumber ne '!OoSRes') {
	die('Not an !OoSRes file');
}

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

for (my $i = 0; $i < $numberOfRecords; $i++) {
	seek($dataFile, $headerSize + $i * $recordSize, SEEK_SET);
	$bytesRead = read($dataFile, $data, $recordSize);
	my ($fileName, $position, $dummy, $length, $dummy) = unpack('a128 L L L L', $data);
	if (-s $fileName) {
		next;
	}

	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);
