gen-oid.pl
1 #!/usr/bin/perl 2 # 3 # Copyright (c) 2010 Kungliga Tekniska Högskolan 4 # (Royal Institute of Technology, Stockholm, Sweden). 5 # All rights reserved. 6 # 7 # Redistribution and use in source and binary forms, with or without 8 # modification, are permitted provided that the following conditions 9 # are met: 10 # 11 # 1. Redistributions of source code must retain the above copyright 12 # notice, this list of conditions and the following disclaimer. 13 # 14 # 2. Redistributions in binary form must reproduce the above copyright 15 # notice, this list of conditions and the following disclaimer in the 16 # documentation and/or other materials provided with the distribution. 17 # 18 # 3. Neither the name of the Institute nor the names of its contributors 19 # may be used to endorse or promote products derived from this software 20 # without specific prior written permission. 21 # 22 # THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 23 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 # ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 26 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 # SUCH DAMAGE. 33 34 require 'getopts.pl'; 35 36 my $output; 37 my $CFILE, $HFILE; 38 my $onlybase; 39 my $header = 0; 40 my $export_file = 0; 41 42 Getopts('b:he') || die "foo"; 43 44 if($opt_b) { 45 $onlybase = $opt_b; 46 } 47 48 $export_file = 1 if ($opt_e); 49 $header = 1 if ($opt_h); 50 51 if ($export_file) { 52 printf "# Generated file\n"; 53 } else { 54 printf "/* Generated file */\n"; 55 } 56 57 if ($header) { 58 printf "#ifndef GSSAPI_GSSAPI_OID\n"; 59 printf "#define GSSAPI_GSSAPI_OID 1\n\n"; 60 } elsif (!$export_file) { 61 printf "#include \"mech_locl.h\"\n\n"; 62 } 63 64 my %tables; 65 my %types; 66 67 while(<>) { 68 69 if (/^\w*#(.*)/) { 70 my $comment = $1; 71 72 if ($header) { 73 printf("$comment\n"); 74 } 75 76 } elsif (/^oid\s+([\w\.]+)\s+(\w+)\s+([\w\.]+)/) { 77 my ($base, $name, $oid) = ($1, $2, $3); 78 79 next if (defined $onlybase and $onlybase ne $base); 80 81 my $store = "__" . lc($name) . "_oid_desc"; 82 83 # encode oid 84 85 my @array = split(/\./, $oid); 86 my $length = 0; 87 my $data = ""; 88 89 my $num; 90 91 $n = $#array; 92 while ($n > 1) { 93 $num = $array[$n]; 94 95 my $p = int($num % 128); 96 $data = sprintf("\\x%02x", $p) . $data; 97 98 $num = int($num / 128); 99 100 $length += 1; 101 102 while ($num > 0) { 103 $p = int($num % 128) + 128; 104 $num = int($num / 128); 105 $data = sprintf("\\x%02x", $p) . $data; 106 $length += 1; 107 } 108 $n--; 109 } 110 $num = int($array[0] * 40 + $array[1]); 111 112 $data = sprintf("\\x%x", $num) . $data; 113 $length += 1; 114 115 if ($export_file) { 116 printf "&$store\n"; 117 } elsif ($header) { 118 printf "extern GSSAPI_LIB_VARIABLE gss_OID_desc $store;\n"; 119 printf "#define $name (&$store)\n\n"; 120 } else { 121 printf "/* $name - $oid */\n"; 122 printf "gss_OID_desc GSSAPI_LIB_VARIABLE $store = { $length, rk_UNCONST(\"$data\") };\n\n"; 123 } 124 } elsif (/^desc\s+([\w]+)\s+(\w+)\s+(\"[^\"]*\")\s+(\"[^\"]*\")/) { 125 my ($type, $oid, $short, $long) = ($1, $2, $3, $4); 126 my $object = { type=> $type, oid => $oid, short => $short, long => $long }; 127 128 $tables{$oid} = \$object; 129 $types{$type} = 1; 130 } 131 132 } 133 134 if (!$header && !$export_file) { 135 foreach my $k (sort keys %types) { 136 print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n"; 137 foreach my $m (sort values %tables) { 138 if ($$m->{type} eq $k) { 139 printf " { %s, \"%s\", %s, %s },\n", $$m->{oid}, $$m->{oid}, $$m->{short}, $$m->{long}; 140 } 141 } 142 printf " { NULL }\n"; 143 printf "};\n\n"; 144 145 } 146 } 147 148 if ($header) { 149 printf "#endif /* GSSAPI_GSSAPI_OID */\n"; 150 }