1238384Sjkim#!/usr/local/bin/perl 2238384Sjkim 3238384Sjkimuse strict; 4238384Sjkim 5238384Sjkimmy %xref_tbl; 6238384Sjkimmy %oid_tbl; 7238384Sjkim 8238384Sjkimmy ($mac_file, $xref_file) = @ARGV; 9238384Sjkim 10238384Sjkimopen(IN, $mac_file) || die "Can't open $mac_file"; 11238384Sjkim 12238384Sjkim# Read in OID nid values for a lookup table. 13238384Sjkim 14238384Sjkimwhile (<IN>) 15238384Sjkim { 16238384Sjkim chomp; 17238384Sjkim my ($name, $num) = /^(\S+)\s+(\S+)$/; 18238384Sjkim $oid_tbl{$name} = $num; 19238384Sjkim } 20238384Sjkimclose IN; 21238384Sjkim 22238384Sjkimopen(IN, $xref_file) || die "Can't open $xref_file"; 23238384Sjkim 24238384Sjkimmy $ln = 1; 25238384Sjkim 26238384Sjkimwhile (<IN>) 27238384Sjkim { 28238384Sjkim chomp; 29238384Sjkim s/#.*$//; 30238384Sjkim next if (/^\S*$/); 31238384Sjkim my ($xr, $p1, $p2) = /^(\S+)\s+(\S+)\s+(\S+)/; 32238384Sjkim check_oid($xr); 33238384Sjkim check_oid($p1); 34238384Sjkim check_oid($p2); 35238384Sjkim $xref_tbl{$xr} = [$p1, $p2, $ln]; 36238384Sjkim } 37238384Sjkim 38238384Sjkimmy @xrkeys = keys %xref_tbl; 39238384Sjkim 40238384Sjkimmy @srt1 = sort { $oid_tbl{$a} <=> $oid_tbl{$b}} @xrkeys; 41238384Sjkim 42238384Sjkimfor(my $i = 0; $i <= $#srt1; $i++) 43238384Sjkim { 44238384Sjkim $xref_tbl{$srt1[$i]}[2] = $i; 45238384Sjkim } 46238384Sjkim 47238384Sjkimmy @srt2 = sort 48238384Sjkim { 49238384Sjkim my$ap1 = $oid_tbl{$xref_tbl{$a}[0]}; 50238384Sjkim my$bp1 = $oid_tbl{$xref_tbl{$b}[0]}; 51238384Sjkim return $ap1 - $bp1 if ($ap1 != $bp1); 52238384Sjkim my$ap2 = $oid_tbl{$xref_tbl{$a}[1]}; 53238384Sjkim my$bp2 = $oid_tbl{$xref_tbl{$b}[1]}; 54238384Sjkim 55238384Sjkim return $ap2 - $bp2; 56238384Sjkim } @xrkeys; 57238384Sjkim 58238384Sjkimmy $pname = $0; 59238384Sjkim 60238384Sjkim$pname =~ s|^.[^/]/||; 61238384Sjkim 62238384Sjkimprint <<EOF; 63238384Sjkim/* AUTOGENERATED BY $pname, DO NOT EDIT */ 64238384Sjkim 65238384Sjkimtypedef struct 66238384Sjkim { 67238384Sjkim int sign_id; 68238384Sjkim int hash_id; 69238384Sjkim int pkey_id; 70238384Sjkim } nid_triple; 71238384Sjkim 72238384Sjkimstatic const nid_triple sigoid_srt[] = 73238384Sjkim { 74238384SjkimEOF 75238384Sjkim 76238384Sjkimforeach (@srt1) 77238384Sjkim { 78238384Sjkim my $xr = $_; 79238384Sjkim my ($p1, $p2) = @{$xref_tbl{$_}}; 80238384Sjkim print "\t{NID_$xr, NID_$p1, NID_$p2},\n"; 81238384Sjkim } 82238384Sjkim 83238384Sjkimprint "\t};"; 84238384Sjkimprint <<EOF; 85238384Sjkim 86238384Sjkim 87238384Sjkimstatic const nid_triple * const sigoid_srt_xref[] = 88238384Sjkim { 89238384SjkimEOF 90238384Sjkim 91238384Sjkimforeach (@srt2) 92238384Sjkim { 93279264Sdelphij my ($p1, $p2, $x) = @{$xref_tbl{$_}}; 94279264Sdelphij # If digest or signature algorithm is "undef" then the algorithm 95279264Sdelphij # needs special handling and is excluded from the cross reference table. 96279264Sdelphij next if $p1 eq "undef" || $p2 eq "undef"; 97238384Sjkim print "\t\&sigoid_srt\[$x\],\n"; 98238384Sjkim } 99238384Sjkim 100238384Sjkimprint "\t};\n\n"; 101238384Sjkim 102238384Sjkimsub check_oid 103238384Sjkim { 104238384Sjkim my ($chk) = @_; 105238384Sjkim if (!exists $oid_tbl{$chk}) 106238384Sjkim { 107238384Sjkim die "Not Found \"$chk\"\n"; 108238384Sjkim } 109238384Sjkim } 110238384Sjkim 111