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