File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / route_types.awk
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_20_1, v0_99_20, HEAD
quagga

# Scan a file of route-type definitions (see eg route_types.txt) and
# generate a corresponding header file with:
#
# - enum of Zserv route-types
# - redistribute strings for the various Quagga daemons
#
# See route_types.txt for the format.
#
#

BEGIN {
	FS="[,]";
	
	# globals
	exitret = 0;
	tcount = 0;
	
	# formats for output
	## the define format
	redist_def_fmt = "#define QUAGGA_REDIST_STR_%s \\\n";
	## DEFUN/vty route-type argument
	redist_str_fmt = "\"(%s)\"\n";
	redist_help_def_fmt = "#define QUAGGA_REDIST_HELP_STR_%s";
	redist_help_str_fmt = " \\\n  \"%s\\n\"";
	
	# header
	header = "/* Auto-generated from route_types.txt by " ARGV[0] ". */\n";
	header = header "/* Do not edit! */\n";
	header = header "\n#ifndef _QUAGGA_ROUTE_TYPES_H\n";
	header = header "#define _QUAGGA_ROUTE_TYPES_H\n";
	footer = "#endif /* _QUAGGA_ROUTE_TYPES_H */\n";
	printf ("%s\n", header);
}

# Chomp comment lines
($0 ~ /^#/) { 
	next;
}

# get rid of the commas, leading/trailling whitespace and
# quotes
{
	for (i = 1; i <= NF; i++) {
		#print "before:" $i;
		$i = gensub(/^[[:blank:]]*(.*)[,]*.*/, "\\1", "g",$i);
		$i = gensub(/^["](.*)["]$/, "\\1", "g", $i);
		#print "after :" $i;
	}
}

# 7 field format:
#  type                 cname      daemon  C    4  6  short help
(NF >= 7) {
	#print "7", $1, $0;
	
	if ($1 in types) {
		print "error: attempt to redefine", $1;
		exitret = 1;
		exit exitret;
	}
	
	typesbynum[tcount] = $1;
	types[$1,"num"] = tcount++; 
	types[$1,"cname"] = $2;
	types[$1,"daemon"] = $3;
	types[$1,"C"] = $4;
	types[$1,"4"] = strtonum($5);
	types[$1,"6"] = strtonum($6);
	types[$1,"shelp"] = $7;
	
	#print "num   :", types[$1,"num"]
	#print "cname :", types[$1,"cname"]
	#print "daemon:", types[$1,"daemon"];
	#print "char  :", types[$1,"C"];
};

# 2 field: type "long description"
(NF == 2) {
	#print "2", $1, $2;
	
	if (!(($1 SUBSEP "num") in types)) {
		print "error: type", $1, "must be defined before help str";
		exitret = 2;
		exit exitret;
	}
	
	types[$1,"lhelp"] = $2;
}

END {
	if (exitret)
		exit exitret;
	
	# The enums
	# not yet...
	#printf("enum\n{\n");
	#for (i = 0; i < tcount; i++) {
	#	type = typesbynum[i];
	#	if (type != "" && types[type,"num"] == i)
	#		printf ("  %s,\n", type);
	#}
	#printf ("  ZEBRA_ROUTE_MAX,\n};\n\n");
	
	# the redistribute defines
	for (i = 0; i < tcount; i++) {
		type = typesbynum[i];
		
		# must be a type, and must cross-check against recorded type
		if (type == "" || types[type,"num"] != i)
			continue;
		
		# ignore route types that can't be redistributed
		if (!(types[type,"4"] || types[type,"6"]))
			continue;
		
		# must have a daemon name
		if (!((type SUBSEP "daemon") in types))
			continue;
		if (!(daemon = types[type,"daemon"]))
			continue;
		
		# might have done this daemon already?
		if (daemon in seen_daemons)
			continue;
		
		cname = types[type,"cname"];
		all = all "|" cname;
		rstr = "";
		hstr = "";
		
		# add it to the others
		for (j = 0; j < tcount; j++) {
			# ignore self
			if (i == j)
				continue;
			
			type2 = typesbynum[j];
			
			# type2 must be valid, and self-check.
			if (type2 == "" || types[type2,"num"] != j)
				continue;
			
			# ignore different route types for the same daemon
			# (eg system/kernel/connected)
			if (types[type2,"daemon"] == daemon)
				continue;
			
			if ((types[type2,"4"] && types[type,"4"]) \
			    || (types[type2,"6"] && types[type,"6"])) {
			    	
			    	if (rstr == "")
			    		rstr = types[type2,"cname"];
				else
					rstr = rstr "|" types[type2,"cname"];
				
				if ((type2 SUBSEP "lhelp") in types)
				  hstr2 = types[type2,"lhelp"];
				else if ((type2 SUBSEP "shelp") in types)
				  hstr2 = types[type2,"shelp"];
				else
				  hstr2 = types[type2,"cname"];
				
				hstr = hstr sprintf(redist_help_str_fmt, hstr2);
			}
		}
		
		# dont double-process daemons.
		seen_daemons[daemon] = 1;
		
		printf("/* %s */\n", daemon);
		printf(redist_def_fmt, toupper(daemon));
		printf(redist_str_fmt, rstr);
		printf(redist_help_def_fmt, toupper(daemon));
		printf("%s", hstr);
		printf("\n\n");
	}
	
	#printf("#define QUAGGA_REDIST_STR_ALL %s\n",all);
			
#	for (i = 0; i < lcount; i++) {
#		if (mlists[i] != "")
#			printf (mlistformat "\n", mlists[i]);
#	}
	printf (footer);
}

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