diff options
author | John Millaway <john43@users.sourceforge.net> | 2002-09-09 19:25:56 +0000 |
---|---|---|
committer | John Millaway <john43@users.sourceforge.net> | 2002-09-09 19:25:56 +0000 |
commit | b670bc6c09e8bd33f48db9f1db3782eac0b0b0b4 (patch) | |
tree | 6581909a842d6bc1ed15f0af17cee697600fe5c1 /devel | |
parent | a953d6fb60d4221ef08d90820f015fb58678b48a (diff) |
Table deserialization works for everything except --fast scanners.
Scanners can auto-verify serialized table integrity via --tables-verify.
Added tables API items to TODO list.
test-table-opts is becoming exhaustive (a good thing).
Diffstat (limited to 'devel')
-rw-r--r-- | devel/dump-tables.pl | 94 |
1 files changed, 10 insertions, 84 deletions
diff --git a/devel/dump-tables.pl b/devel/dump-tables.pl index 31919f6..1515e18 100644 --- a/devel/dump-tables.pl +++ b/devel/dump-tables.pl @@ -1,95 +1,21 @@ #! /usr/bin/perl -w # vim:set ft=perl ai si et ts=4 sts=4 sw=4 tw=0: -# USAGE: dump-tables.pl FILE +# USAGE: dump-tables.pl FILE [max-data] use strict; -@ARGV == 1 || die "\nUSAGE: dump-tables.pl FILE\n"; -open FD, $ARGV[0] or die "$ARGV[0]: $!"; - -my ($magic,$hsize) = (read32(),read32()); -my $rest = readn($hsize - 8); -my ($ssize,$flags,$version,$name) = unpack 'Nna*', $rest; -($version,$name) = split /\0/, $version; +my $dir = $0; +$dir =~ s:/[^/]+$::; +push @INC, $dir; +require "tables.pl"; -printf "th_magic: %08X\n", $magic; -print "th_hsize: $hsize\n"; -print "th_ssize: $ssize\n"; -print "th_flags: $flags\n"; -print "th_version: $version\n"; -print "th_name: $name\n"; +@ARGV == 1 || @ARGV == 2 || die "\nUSAGE: dump-tables.pl FILE [max-data]\n"; +open FD, $ARGV[0] or die "$ARGV[0]: $!"; -my $bytes = $hsize; +dump_hdr(read_hdr()); while(!eof FD){ - dump_table(); -} - - -sub readn { my $s; read FD, $s, shift; return $s } -sub read32 { my $n; read FD, $n, 4; return unpack 'i', pack 'i', unpack 'N',$n } -sub read16 { my $n; read FD, $n, 2; return unpack 's', pack 's', unpack 'n',$n } -sub read8 { my $n; read FD, $n, 1; return unpack 'c',$n } - -sub dump_table { - my ($id,$flags,$hi,$lo) = (read16(),read16(),read32(),read32()); - my $max = 40; - print "td_id: $id ($::TID{$id})\n". - "td_flags: $flags (@{[TFLAGS($flags)]})\n". - "td_hilen: $hi\n". - "td_lolen: $lo\n"; - - my $read = $::TFLAGS{$flags}->[1]; - - my $tot = $lo * ($hi?$hi:1); - $tot *=2 if $::TID{$id}eq 'YYT_ID_TRANSITION'; - - my @d; - for(1..$tot){ - my $v = $read->(); - if($max-- > 0){ - push @d, $v; - } - } - print "td_data: "; - print join ', ', @d; - my $pad = pad64(tell FD); - print "\npadding: $pad\n"; - while($pad-- > 0){ read8() } - return tell FD; -} - -sub TFLAGS { - my @s; - my $f = shift; - foreach(keys %::TFLAGS){ - if ($f & $_){ - push @s, $::TFLAGS{$_}->[0] - } - } - return join '|', @s; -} - -sub pad64{ return ((8-((shift)%8))%8) } - -BEGIN { - %::TID = ( - 0x01 => 'YYT_ID_ACCEPT' , - 0x02 => 'YYT_ID_BASE' , - 0x03 => 'YYT_ID_CHK' , - 0x04 => 'YYT_ID_DEF' , - 0x05 => 'YYT_ID_EC' , - 0x06 => 'YYT_ID_META' , - 0x07 => 'YYT_ID_NUL_TRANS' , - 0x08 => 'YYT_ID_NXT' , - 0x09 => 'YYT_ID_RULE_CAN_MATCH_EOL' , - 0x0A => 'YYT_ID_START_STATE_LIST' , - 0x0B => 'YYT_ID_TRANSITION'); - - %::TFLAGS = ( - 0x01 => ['YYT_DATA8',\&read8] , - 0x02 => ['YYT_DATA16',\&read16] , - 0x04 => ['YYT_DATA32',\&read32] , - 0x08 => ['YYT_PTRANS',sub{}]); + dump_table(read_table(),$ARGV[1]); } +close FD; 1 __END__ |