#!/usr/bin/env perl use strict; $^W=1; my $file = 'hyperref.dtx'; my $count = 0; my %map = ( 'HyPsd@DieFace' => '', 'HyPsd@MoonPha' => '', ); my $err = 0; open(IN, '<', $file) or die "!!! Error: Cannot open file `$file'!\n"; while () { if (/\\DeclareTextCommand{\\([^}]+)}{PU}{([^}]*)}%?(\*?)/) { $count++; my $name = $1; my $value = $2; my $star = $3 eq '*' ? 1 : 0; if (exists $map{$name}) { if (not($map{$name} eq $value)) { $err++; print "!!! Error: Mismatch for \\$name!\n"; } } else { $map{$name} = $value; } if ($star) { if ($name =~ /^text/) { $name =~ s/^text//; if (exists $map{$name}) { if (not($map{$name} eq $value)) { $err++; print "!!! Error: Mismatch for \\(text)$name!\n"; } } else { $map{$name} = $value; } } else { $err++; print "!!! Error: %* for \\$name!\n"; } } next; } if (/^%\* \\([^ ]+) -> \\([^ ]+)/) { $count++; my $name = $2; my $key = $1; if (exists $map{$key}) { if (exists $map{$name}) { if (not($map{$name} eq $map{$key})) { $err++; print "!!! Error: Mismatch for \\$name!\n"; } } else { $map{$name} = $map{$key}; } } else { $err++; print "!!! Error: \"%* \\$name -> \\$key\" is undefined!\n"; } } if (/(\\[89]\d+\\\d+)/) { my $str = $1; if ($str !~ /^\\8[0-7]\\[0-7]{3}$/ and $str !~ /^\\9[0-7]{3}\\[0-7]{3}$/) { next if /^ /; $err++; print "!!! Error: Invalid octal sequence `$str'!\n"; } } } close(IN); my $num = keys %map; print "==> $count lines found with $num entries.\n"; die "!!! Error: $err error(s)!\n" if $err; 1;