#! /usr/bin/perl

use Compress::Zlib;

open IMG, "<$ARGV[0]" or die "can't open image: $!";

sysread IMG, $header, 8;
my ($major, $minor, $count) = unpack('vvN', $header);
print "TFFS $major.$minor ($count)\n";

while(1) {
  sysread IMG, $header, 4;
  last unless length($header);
  my ($type, $len) = unpack('vv', $header);
  last if ($type == 0xFFFF);
  my $abslen;
  { use integer; $abslen = (($len+3)/4)*4; }
  sysread IMG, $value, $abslen;
  $value = substr($value, 0, $len-1);
#  print "type: $type ($len) = $value\n";
  if ($type == 0x1ff) { # env dictionary
    while($len >= 4) {
      my ($namidx, $namlen) = unpack('vv', substr($value, 0, 4));
      $value = substr($value, 4); $len -= 4;
      my $name = unpack("Z*", $value);
      my $nlen;
      { use integer; $nlen = (length($name)/4+1)*4; }
      $value = substr($value, $nlen); $len -= $nlen;
#      print "namidx: $namidx ($nlen) = $name\n";
      if ($namidx == 0x1fe) {
        print "nametable version: $name\n";
      } else {
        $index{$name} = $namidx;
      }
    }
  } elsif ($type >= 0x100) {
    $value{$type} = $value;
  } elsif ($type) {
    if (defined($data{$type})) {
      print "double: $type\n";
    } else {
      $data{$type} = $value;
    }
  }
}

#foreach $key (sort keys %index) {
#  print "$key => $index{$key},\n";
#}
#exit;

foreach $key (sort keys %index) {
  printf "$key = %s\n", defined $value{$index{$key}}?$value{$index{$key}}:"<undef>";
}

foreach $key (sort keys %data) {
  print "$key = ", unpack("H*", substr($data{$key}, 0, 32)), "\n";
  ($i, $status) = inflateInit();
  ($out, $status) = $i->inflate($data{$key});
  print "inflate status: $status $out\n";
}
