diff options
Diffstat (limited to 'share/attrnew.pl')
-rwxr-xr-x | share/attrnew.pl | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/share/attrnew.pl b/share/attrnew.pl new file mode 100755 index 0000000..3ace68f --- /dev/null +++ b/share/attrnew.pl @@ -0,0 +1,93 @@ +#!/usr/bin/env perl +# +# Print out the ATTRIBUTE's which are defined only once on input, +# and any VALUE's which are defined for those attributes. It does NOT +# print out unique VALUEs for multiple-defined attributes, though. +# +# Usage: cat dictionary1 dictionary2 | ./attrnew.pl > unique +# +# This is a bit of a hack. In order to make it work, you've got to +# add a "fake" attribute to the end of dictionary1, so that you know +# which attributes belong to which dictionary... +# +# $Id$ +# + +$line = 0; +while (<>) { + $line++; + + # + # Get attribute. + # + if (/^ATTRIBUTE\s+([\w-]+)\s+(\w+)\s+(\w+)(.*)/) { + $name=$1; + $value = $2; + $type = $3; + $stuff = $4; + + $value =~ tr/[A-F]/[a-f]/; # normal form for hex + $value =~ tr/X/x/; + + if ($value =~ /^0x/) { + $index = hex $value; + } else { + $index = $value; + } + + if (defined $attributes{$index}) { + $dup{$index}++; + } else { + $first_ref{$line} = $index; + } + + $attributes{$index} = "$name $value $type$stuff"; + $name2val{$name} = $index; + next; + } + + # + # Values. + # + if (/^VALUE\s+([\w-]+)\s+([\w-\/,.]+)\s+(\w+)(.*)/) { + $attr = $1; + $name = $2; + $value = $3; + $stuff = $d; + + $value =~ tr/[A-F]/[a-f]/; # normal form for hex + $value =~ tr/X/x/; + + if ($value =~ /^0x/) { + $index = hex $value; + } else { + $index = $value; + } + + if (!defined $name2val{$attr}) { + print "# FIXME: FORWARD REF?\nVALUE $attr $name $value$stuff\n"; + next; + } + + $values{$name2val{$attr}}{$index} = "$attr $name $value$stuff"; + next; + } +} + +# +# Print out the attributes sorted by number. +# +foreach $line (sort {$a <=> $b} keys %first_ref) { + $attr_val = $first_ref{$line}; + + next if (defined $dup{$attr_val}); + + print "ATTRIBUTE ", $attributes{$attr_val}, "\n"; + + next if (!defined %{$values{$attr_val}}); + + foreach $value (sort {$a <=> $b} keys %{$values{$attr_val}}) { + print "VALUE ", $values{$attr_val}{$value}, "\n"; + } + +} |