1#!/usr/local/bin/perl 2 3use strict; 4 5my %xref_tbl; 6my %oid_tbl; 7 8my ($mac_file, $xref_file) = @ARGV; 9 10open(IN, $mac_file) || die "Can't open $mac_file"; 11 12# Read in OID nid values for a lookup table. 13 14while (<IN>) 15 { 16 chomp; 17 my ($name, $num) = /^(\S+)\s+(\S+)$/; 18 $oid_tbl{$name} = $num; 19 } 20close IN; 21 22open(IN, $xref_file) || die "Can't open $xref_file"; 23 24my $ln = 1; 25 26while (<IN>) 27 { 28 chomp; 29 s/#.*$//; 30 next if (/^\S*$/); 31 my ($xr, $p1, $p2) = /^(\S+)\s+(\S+)\s+(\S+)/; 32 check_oid($xr); 33 check_oid($p1); 34 check_oid($p2); 35 $xref_tbl{$xr} = [$p1, $p2, $ln]; 36 } 37 38my @xrkeys = keys %xref_tbl; 39 40my @srt1 = sort { $oid_tbl{$a} <=> $oid_tbl{$b}} @xrkeys; 41 42for(my $i = 0; $i <= $#srt1; $i++) 43 { 44 $xref_tbl{$srt1[$i]}[2] = $i; 45 } 46 47my @srt2 = sort 48 { 49 my$ap1 = $oid_tbl{$xref_tbl{$a}[0]}; 50 my$bp1 = $oid_tbl{$xref_tbl{$b}[0]}; 51 return $ap1 - $bp1 if ($ap1 != $bp1); 52 my$ap2 = $oid_tbl{$xref_tbl{$a}[1]}; 53 my$bp2 = $oid_tbl{$xref_tbl{$b}[1]}; 54 55 return $ap2 - $bp2; 56 } @xrkeys; 57 58my $pname = $0; 59 60$pname =~ s|^.[^/]/||; 61 62print <<EOF; 63/* AUTOGENERATED BY $pname, DO NOT EDIT */ 64 65typedef struct 66 { 67 int sign_id; 68 int hash_id; 69 int pkey_id; 70 } nid_triple; 71 72static const nid_triple sigoid_srt[] = 73 { 74EOF 75 76foreach (@srt1) 77 { 78 my $xr = $_; 79 my ($p1, $p2) = @{$xref_tbl{$_}}; 80 print "\t{NID_$xr, NID_$p1, NID_$p2},\n"; 81 } 82 83print "\t};"; 84print <<EOF; 85 86 87static const nid_triple * const sigoid_srt_xref[] = 88 { 89EOF 90 91foreach (@srt2) 92 { 93 my $x = $xref_tbl{$_}[2]; 94 print "\t\&sigoid_srt\[$x\],\n"; 95 } 96 97print "\t};\n\n"; 98 99sub check_oid 100 { 101 my ($chk) = @_; 102 if (!exists $oid_tbl{$chk}) 103 { 104 die "Not Found \"$chk\"\n"; 105 } 106 } 107 108