File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / route_types.pl
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:22:28 2012 UTC (11 years, 9 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, v0_99_22p0, v0_99_22, v0_99_21, HEAD
quagga

    1: #!/usr/bin/perl
    2: ##
    3: ## Scan a file of route-type definitions (see eg route_types.txt) and
    4: ## generate a corresponding header file with:
    5: ##
    6: ## - enum of Zserv route-types
    7: ## - redistribute strings for the various Quagga daemons
    8: ##
    9: ## See route_types.txt for the format.
   10: ##
   11: ##
   12: ## Copyright (C) 2009 David Lamparter.
   13: ## This file is part of GNU Zebra.
   14: ##
   15: ## GNU Zebra is free software; you can redistribute it and/or modify it
   16: ## under the terms of the GNU General Public License as published by the
   17: ## Free Software Foundation; either version 2, or (at your option) any
   18: ## later version.
   19: ##
   20: ## GNU Zebra is distributed in the hope that it will be useful, but
   21: ## WITHOUT ANY WARRANTY; without even the implied warranty of
   22: ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   23: ## General Public License for more details.
   24: ##
   25: ## You should have received a copy of the GNU General Public License
   26: ## along with GNU Zebra; see the file COPYING.  If not, write to the Free
   27: ## Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   28: ## 02111-1307, USA.
   29: ##
   30: 
   31: use strict;
   32: 
   33: # input processing
   34: #
   35: my @protos;
   36: my %protodetail;
   37: 
   38: my %daemons;
   39: 
   40: while (<STDIN>) {
   41: 	# skip comments and empty lines
   42: 	next if (/^\s*(#|$)/);
   43: 
   44: 	# strip whitespace
   45: 	chomp;
   46: 	$_ =~ s/^\s*//;
   47: 	$_ =~ s/\s*$//;
   48: 
   49: 	# match help strings
   50: 	if (/^(ZEBRA_ROUTE_[^\s]+)\s*,\s*"(.*)"$/) {
   51: 		$protodetail{$1}->{'longhelp'} = $2;
   52: 		next;
   53: 	}
   54: 
   55: 	$_ =~ s/\s*,\s*/,/g;
   56: 
   57: 	# else: 7-field line
   58: 	my @f = split(/,/, $_);
   59: 	unless (@f == 7) {
   60: 		die "invalid input on route_types line $.\n";
   61: 	}
   62: 
   63: 	my $proto = $f[0];
   64: 	$f[3] = $1 if ($f[3] =~ /^'(.*)'$/);
   65: 	$f[6] = $1 if ($f[6] =~ /^"(.*)"$/);
   66: 
   67: 	$protodetail{$proto} = {
   68: 		"number" => scalar @protos,
   69: 		"type" => $f[0],
   70: 		"cname" => $f[1],
   71: 		"daemon" => $f[2],
   72: 		"char" => $f[3],
   73: 		"ipv4" => int($f[4]),
   74: 		"ipv6" => int($f[5]),
   75: 		"shorthelp" => $f[6],
   76: 	};
   77: 	push @protos, $proto;
   78: 	$daemons{$f[2]} = {
   79: 		"ipv4" => int($f[4]),
   80: 		"ipv6" => int($f[5])
   81: 	} unless ($f[2] eq "NULL");
   82: }
   83: 
   84: # output
   85: printf <<EOF, $ARGV[0];
   86: /* Auto-generated from route_types.txt by %s. */
   87: /* Do not edit! */
   88: 
   89: #ifndef _QUAGGA_ROUTE_TYPES_H
   90: #define _QUAGGA_ROUTE_TYPES_H
   91: 
   92: /* Zebra route's types. */
   93: EOF
   94: 
   95: push @protos, "ZEBRA_ROUTE_MAX";
   96: my (@protosv4, @protosv6) = ((), ());
   97: for (my $c = 0; $c < @protos; $c++) {
   98: 	my $p = $protos[$c];
   99: 	printf "#define %-32s %d\n", $p, $c;
  100: 	push @protosv4, $p if ($protodetail{$p}->{"ipv4"});
  101: 	push @protosv6, $p if ($protodetail{$p}->{"ipv6"});
  102: }
  103: pop @protos;
  104: 
  105: sub codelist {
  106: 	my (@protos) = @_;
  107: 	my (@lines) = ();
  108: 	my $str = "  \"Codes: ";
  109: 	for my $p (@protos) {
  110: 		my $s = sprintf("%s - %s, ",
  111: 			$protodetail{$p}->{"char"},
  112: 			$protodetail{$p}->{"shorthelp"});
  113: 		if (length($str . $s) > 70) {
  114: 			$str =~ s/ $//;
  115: 			push @lines, $str . "%s\" \\\n";
  116: 			$str = "  \"       ";
  117: 		}
  118: 		$str .= $s;
  119: 	}
  120: 	$str =~ s/ $//;
  121: 	push @lines, $str . "%s\" \\\n";
  122: 	push @lines, "  \"       > - selected route, * - FIB route%s%s\", \\\n";
  123: 	my @nl = ();
  124: 	for (my $c = 0; $c < @lines + 1; $c++) {
  125: 		push @nl, "VTY_NEWLINE"
  126: 	}
  127: 	return join("", @lines) ."  ". join(", ", @nl);
  128: }
  129: 
  130: print "\n";
  131: printf "#define SHOW_ROUTE_V4_HEADER \\\n%s\n", codelist(@protosv4);
  132: printf "#define SHOW_ROUTE_V6_HEADER \\\n%s\n", codelist(@protosv6);
  133: print "\n";
  134: 
  135: sub collect {
  136: 	my ($daemon, $ipv4, $ipv6) = @_;
  137: 	my (@names, @help) = ((), ());
  138: 	for my $p (@protos) {
  139: 		next if ($protodetail{$p}->{"daemon"} eq $daemon && $daemon ne "zebra");
  140: 		next unless (($ipv4 && $protodetail{$p}->{"ipv4"})
  141: 				|| ($ipv6 && $protodetail{$p}->{"ipv6"}));
  142: 		push @names, $protodetail{$p}->{"cname"};
  143: 		push @help, "  \"".$protodetail{$p}->{"longhelp"}."\\n\"";
  144: 	}
  145: 	return ("\"(" . join("|", @names) . ")\"", join(" \\\n", @help));
  146: }
  147: 
  148: for my $daemon (sort keys %daemons) {
  149: 	next unless ($daemons{$daemon}->{"ipv4"} || $daemons{$daemon}->{"ipv6"});
  150: 	printf "/* %s */\n", $daemon;
  151: 	if ($daemons{$daemon}->{"ipv4"} && $daemons{$daemon}->{"ipv6"}) {
  152: 		my ($names, $help) = collect($daemon, 1, 1);
  153: 		printf "#define QUAGGA_REDIST_STR_%s \\\n  %s\n", uc $daemon, $names;
  154: 		printf "#define QUAGGA_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
  155: 		($names, $help) = collect($daemon, 1, 0);
  156: 		printf "#define QUAGGA_IP_REDIST_STR_%s \\\n  %s\n", uc $daemon, $names;
  157: 		printf "#define QUAGGA_IP_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
  158: 		($names, $help) = collect($daemon, 0, 1);
  159: 		printf "#define QUAGGA_IP6_REDIST_STR_%s \\\n  %s\n", uc $daemon, $names;
  160: 		printf "#define QUAGGA_IP6_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
  161: 	} else {
  162: 		my ($names, $help) = collect($daemon,
  163: 			$daemons{$daemon}->{"ipv4"}, $daemons{$daemon}->{"ipv6"});
  164: 		printf "#define QUAGGA_REDIST_STR_%s \\\n  %s\n", uc $daemon, $names;
  165: 		printf "#define QUAGGA_REDIST_HELP_STR_%s \\\n%s\n", uc $daemon, $help;
  166: 	}
  167: 	print "\n";
  168: }
  169: 
  170: print <<EOF;
  171: 
  172: #ifdef QUAGGA_DEFINE_DESC_TABLE
  173: 
  174: struct zebra_desc_table
  175: {
  176:   unsigned int type;
  177:   const char *string;
  178:   char chr;
  179: };
  180: 
  181: #define DESC_ENTRY(T,S,C) [(T)] = { (T), (S), (C) }
  182: static const struct zebra_desc_table route_types[] = {
  183: EOF
  184: 
  185: for (my $c = 0; $c < @protos; $c++) {
  186: 	my $p = $protos[$c];
  187: 	printf "  DESC_ENTRY\t(%s\t \"%s\",\t'%s' ),\n",
  188: 	       $p.",", $protodetail{$p}->{"cname"}, $protodetail{$p}->{"char"};
  189: }
  190: 
  191: print <<EOF;
  192: };
  193: #undef DESC_ENTRY
  194: 
  195: #endif /* QUAGGA_DEFINE_DESC_TABLE */
  196: 
  197: #endif /* _QUAGGA_ROUTE_TYPES_H */
  198: EOF
  199: 
  200: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>