#! /usr/bin/perl

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

my $footerSize = 16,
	$recordSize = 68;

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, $footerSize);
my ($magicNumber, $dummy, $numberOfRecords, $dummy) = unpack('A4 L L L', $data);

if ($magicNumber ne 'OoSD') {
	die('Not a OoSD 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, $dummy, $position, $length, $dummy) = unpack('a52 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);
