diff options
Diffstat (limited to 'tools/make-sminmpec.pl')
-rwxr-xr-x | tools/make-sminmpec.pl | 104 |
1 files changed, 27 insertions, 77 deletions
diff --git a/tools/make-sminmpec.pl b/tools/make-sminmpec.pl index 339532f459..a30e717f71 100755 --- a/tools/make-sminmpec.pl +++ b/tools/make-sminmpec.pl @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# create the sminmpec.c file from +# create the enterprises file from # http://www.iana.org/assignments/enterprise-numbers # # Wireshark - Network traffic analyzer @@ -23,9 +23,9 @@ use strict; use File::Spec; -my ($vol, $script_dir, $file) = File::Spec->splitpath( __FILE__ ); -my $epan_dir = File::Spec->catpath($vol, $script_dir, '../epan'); -chdir($epan_dir) || die("Can't find $epan_dir"); +my ($vol, $script_dir) = File::Spec->splitpath( __FILE__ ); +my $root_dir = File::Spec->catpath($vol, $script_dir, ".."); +chdir($root_dir) || die("Can't find $root_dir"); my $in = shift; @@ -54,100 +54,50 @@ if($in =~ m/^http:/i) { if ($result->code eq 200) { warn "done fetching $in\n"; @in_lines = split /\n/, $result->content; - open ENFILE, "> enterprise-numbers"; - - for (@in_lines) { - chomp; - print ENFILE "$_\n"; - } - - close ENFILE; - } elsif ($result->code eq 304) { - warn "enterprise-numbers was up-to-date\n"; - open IN, "< enterprise-numbers"; - @in_lines = <IN>; - close IN; } else { die "request for $in failed with result code:" . $result->code; } - } else { open IN, "< $in"; @in_lines = <IN>; close IN; } - my $body = ''; my $code; -my $prev_code = -1; ## Assumption: First code in enterprise file is 0; - -sub escape_non_ascii { - my $val = unpack 'C', $_[0]; - return sprintf '\0%.3o',$val; -} - +my $name; +my $last_updated = "(last updated ???)"; +my $end_of_document = 0; for(@in_lines) { - s/[\000-\037]//g; - s/\\/\\\\/g; - s/"/\\"/g; - s/([\x80-\xFF])/escape_non_ascii($1)/ge; + chomp; if (/^(\d+)/) { - $code = sprintf("%5d", $1); - } if (/^ (\S.*)/ ) { - my $name = $1; - if ($code < $prev_code) { - print STDERR ("Input 'Codes' not sorted in ascending order (or duplicate codes)): $prev_code $code\n"); - exit 1; - } - while ($code > ($prev_code+1)) { - $prev_code = sprintf("%5d", $prev_code+1); - $body .= " { $prev_code, sminmpec_unknown }, /* (Added by Wireshark) */\n"; - } - $prev_code = $code; - $body .= " { $code, \"$name\" },\n"; - $smi_total++; + $code = sprintf("%d", $1); + } elsif (/^ ?(\S.*)/ ) { # up to three spaces because of formatting errors in the source + $name = $1; + next if (/^\s*\(?\s*unassigned/i); + $name =~ s/\s+$//; + $name =~ s/ \((formerly .*)\)/\t# $1/; + $body .= "\n$code\t$name"; + } elsif (/\(last updated/i) { + $last_updated = $_; + } elsif (/^ *End of Document/) { + $end_of_document = 1; } } -# If this happens check what IANA is serving. -# XXX We already overwrote enterprise-numbers above. -if ($smi_total < $smi_total) { die "Too few SMI entries ($smi_total)\n"; } +die "\"End of Document\" not found. Truncated source file?" unless ($end_of_document); -open OUT, "> sminmpec.c"; +open OUT, "> enterprises"; print OUT <<"_SMINMPEC"; -/* - * THIS FILE IS AUTOGENERATED, DO NOT EDIT - * generated from http://www.iana.org/assignments/enterprise-numbers - * run "tools/make-sminmpec.pl <infile> <outfile>" to regenerate - * - * Note 1: "Gaps" in the iana enterprise-numbers list have been "filled in" - * with "(Unknown)" as the name so that direct (indexed) access to - * the list is possible. - * - * Note 2: We should probably parse "enterprise-numbers" at program start - * instead of generating this file. - */ -#include "config.h" - -#include <glib.h> - -#include <epan/value_string.h> -#include <epan/sminmpec.h> - -static const gchar sminmpec_unknown[] = "(Unknown)"; - -const value_string sminmpec_values[] = { -$body { 0, NULL} -}; - -#define array_length(x) (sizeof x / sizeof x[0]) - -value_string_ext sminmpec_values_ext = VALUE_STRING_EXT_INIT(sminmpec_values); - +# +# generated from http://www.iana.org/assignments/enterprise-numbers +# run "tools/make-sminmpec.pl [infile]" to regenerate +# +# $last_updated +$body _SMINMPEC close OUT; |