** (process:23326): WARNING **: Field 'Reserved bit(s)' does not have an
[obnox/wireshark/wip.git] / tools / make-sminmpec.pl
1 #!/usr/bin/perl -w
2 # create the sminmpec.c file from
3 # http://www.iana.org/assignments/enterprise-numbers
4 #
5 # $Id$
6 #
7 # Wireshark - Network traffic analyzer
8 # By Gerald Combs <gerald@wireshark.org>
9 # Copyright 2004 Gerald Combs
10 #
11 # This program is free software; you can redistribute it and/or
12 # modify it under the terms of the GNU General Public License
13 # as published by the Free Software Foundation; either version 2
14 # of the License, or (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24 use strict;
25
26 my $in = shift;
27
28 $in = "http://www.iana.org/assignments/enterprise-numbers" unless(defined $in);
29
30 my @in_lines;
31
32 if($in =~ m/^http:/i) {
33         eval "require LWP::UserAgent;";
34         die "LWP isn't installed. It is part of the standard Perl module libwww." if $@;
35
36         my $agent    = LWP::UserAgent->new;
37
38         warn "starting to fetch $in ...\n";
39
40         my $request  = HTTP::Request->new(GET => $in);
41
42
43         if (-f "enterprise-numbers") {
44                 my $mtime;
45                 (undef,undef,undef,undef,undef,undef,undef,undef,undef,$mtime,undef,undef,undef) = stat("enterprise-numbers");
46                 $request->if_modified_since( $mtime );
47         }
48
49         my $result   = $agent->request($request);
50
51         if ($result->code eq 200) {
52                 warn "done fetching $in\n";
53                 @in_lines = split /\n/, $result->content;
54                 open ENFILE, "> enterprise-numbers";
55
56                 for (@in_lines) {
57                         chomp;
58                         print ENFILE "$_\n";
59                 }
60
61                 close ENFILE;
62         } elsif ($result->code eq 304) {
63                 warn "enterprise-numbers was up-to-date\n";
64                 open IN, "< enterprise-numbers";
65                 @in_lines = <IN>;
66                 close IN;
67         } else {
68                 die "request for $in failed with result code:" . $result->code;
69         }
70
71 } else {
72   open IN, "< $in";
73   @in_lines = <IN>;
74   close IN;
75 }
76
77
78 open OUT, "> sminmpec.c";
79
80 my $body = '';
81 my $code;
82 my $prev_code = -1;  ## Assumption: First code in enterprise file is 0;
83
84 sub escape_non_ascii {
85     my $val = unpack 'C', $_[0];
86     return sprintf '\0%.3o',$val;
87 }
88
89
90 for(@in_lines) {
91         s/[\000-\037]//g;
92         s/\\/\\\\/g;
93         s/"/\\"/g;
94         s/([\x80-\xFF])/escape_non_ascii($1)/ge;
95
96         if (/^(\d+)/) {
97                 $code = sprintf("%5d", $1);
98         } if (/^  (\S.*)/ ) {
99                 my $name = $1;
100                 if ($code < $prev_code) {
101                         print STDERR ("Input 'Codes' not sorted in ascending order (or duplicate codes)): $prev_code $code\n");
102                         exit 1;
103                 }
104                 while ($code > ($prev_code+1)) {
105                         $prev_code = sprintf("%5d", $prev_code+1);
106                         $body .= "    { $prev_code, sminmpec_unknown },  /* (Added by Wireshark) */\n";
107                 }
108                 $prev_code = $code;
109                 $body .= "    { $code, \"$name\" },\n";
110         }
111 }
112
113 print OUT <<"_SMINMPEC";
114 /*
115  * \$Id\$
116  *
117  * THIS FILE IS AUTOGENERATED, DO NOT EDIT
118  * generated from http://www.iana.org/assignments/enterprise-numbers
119  * run "tools/make-sminmspec <infile> <outfile>" to regenerate
120  *
121  * Note: "Gaps" in the iana enterprise-numbers list have been "filled in"
122  *       with "(Unknown)" as the name so that direct (indexed) access
123  *       to the list is possible.
124  */
125 #ifdef HAVE_CONFIG_H
126 # include "config.h"
127 #endif
128
129 #include <glib.h>
130
131 #include <epan/value_string.h>
132 #include <epan/sminmpec.h>
133
134 static const gchar sminmpec_unknown[] = "(Unknown)";
135
136 const value_string sminmpec_values[] = {
137 $body    {    0, NULL}
138 };
139
140 #define array_length(x) (sizeof x / sizeof x[0])
141
142 value_string_ext sminmpec_values_ext = VALUE_STRING_EXT_INIT(sminmpec_values);
143
144 _SMINMPEC
145
146 close OUT;