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