#!/usr/bin/perl -w my ($state, $iid, $iface, $parent, $methods, $line, %iiddeps, %iiddata, %iidmap) = 0; sub xread { my ($iid) = @_; my $file = "$iid.xpt_dump"; return undef unless -f $file; open XPTDUMP, '<', $file; local $/ = undef; my $line = ; close XPTDUMP; return $line; } sub getifaces { $_ = shift; $_ =~ s/^...........//gm; return grep(!/[(]|^(?:in|out|inout|u?int(?:8|16|32|64)|char|jsval|void|float|double|nsIID|optional|shared|retval|dipper|InterfaceIs|boolean|w?string(?:_s|)|wchar_t|(?:A|C|DOM|UTF8)String|)$/, split /[\s&,);\*\[\]]+/); } sub xbuild { my ($iid, $record) = @_; $iiddata{$iid} = $record; $iidmap{$iface} = $iid; $iiddeps{$iid} = join "\n", ($parent, sort (getifaces($methods))); } sub xwrite { my ($iid, $record) = @_; my $file = "$iid.xpt_dump"; open XPTDUMP, '>', $file; print XPTDUMP $record; close XPTDUMP; } sub xdump { return unless $line; my $record = " $iid = $iface $line "; xbuild($iid, $record); } sub flush { foreach my $iid (keys %iiddata) { my $record = $iiddata{$iid}; unless ($record) { print "EEP $iid\n"; next; } foreach my $id (split /\n/, $iiddeps{$iid}) { my $extra = $iidmap{$id}; unless ($extra) { print "eep $iid:$id\n"; next; } $record .= "$id => $extra\n"; } my $old = xread($iid); if ($old) { rename("$iid.xpt_dump", "$iid-old.xpt_dump"); } xwrite($iid, $record); if ($old && $old ne $record) { print `diff -u $iid-old.xpt_dump $iid.xpt_dump`; } } } sub parse { $_ = shift; #print "$state $_"; if (/^Header:/) { xdump(); $state = 0; } elsif (/^Interface Directory/) { $state = 1; } elsif (($state == 1 || $state == 2 || $state == 3) && /^ - ::(\S+) \((.*)\):/) { xdump(); $line = ''; $state = 2; $iface = $1; $iid = $2; } elsif ($state == 3 && /^ Constants:/) { $line .= $_; $state = 2; } elsif ($state == 2 || $state == 3) { $line .= $_; $state = 2 if /^ No Methods/; $methods .= $_ if $state == 3; if (/\[Unresolved\]/) { $state = 1; $line = ''; } elsif (/^ Parent: ::(\S+)/) { $parent = $1; } elsif (/^ Methods:/) { $state = 3; $methods = ''; } } #print "$state $_"; } foreach $file (@ARGV) { open INPUT, "-|", "./xpt_dump", $file; while () { parse($_); } xdump(); } flush();