patch-2.1.15 linux/net/802/transit/compile.awk

Next file: linux/net/802/transit/pdutr.h
Previous file: linux/net/802/transit/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.14/linux/net/802/transit/compile.awk linux/net/802/transit/compile.awk
@@ -0,0 +1,81 @@
+# to run: awk -f transit.awk transit.p0
+#
+BEGIN { "date" | getline
+	enable_index = 1
+	today = $0
+	printf("\n/* this file was generated on %s  */\n", today )
+	not_firstone = 0	# flag to avoid empty entry in 1st table
+	fpe = 0			# entry tbl array fill pointer
+	fpeo = 0		# entry tbl offset list fill pointer
+	fpdef = 0 		# define list fill pointer
+}
+
+### /^;/ { }			# line starting with a semicolon is comment 
+
+/^[A-Z]/ {			# table name
+	if ( $1 == "TABLE" ) {
+	   tbl = $2		# get table name
+	   newtbl( tbl )
+	}
+	else if ( $1 == "COMPILE" ) {
+	   array_name = $2
+	   if ( $3 == "NOINDEX" ) { enable_index = 0 }
+	}
+	else {			# table entry
+	   ec = ec +1
+	   n = split( $0, fld, " " )
+	   action = fld[ n-1 ]
+	   newstate = fld[ n ]
+	   store( action, newstate )
+	   ecct = ecct +1
+	}
+}
+
+END {	store( action, newstate )
+
+	if ( enable_index ) {
+	    printf( "\n/* index name #defines: */\n\n",
+		 ec, ecct )
+
+	    for( ii = 1; ii <= fpeo; ii++ ){
+	       printf( "#define %-12s %3d\n", define[ ii ], ii -1 )
+	    }
+	}
+
+	printf( "\n\n/* size of transition table is %d bytes */\n",
+		 fpe )
+
+	if ( enable_index ) {
+	    printf( "\nstatic short int %s_offset [ ] ={", array_name )
+	    for( ii = 1; ii <= fpeo; ii++ ){
+	        if ( (ii % 10) == 1 ) printf("\n  ")
+	        printf( " %4d", entry_offset[ ii ] )
+	        if ( ii < fpeo ) printf( "," )
+	    }
+	    printf(" };\n")
+	}
+
+	printf( "\nstatic char %s_entry [ ] = {", array_name )
+	for( ii = 1; ii <= fpe; ii++ ){
+	    if ( (ii % 6) == 1 ) printf("\n  ")
+	    printf( " %-14s", entry[ ii ] )
+	    if ( ii < fpe ) printf( "," )
+	}
+	printf(" };\n")
+
+}
+
+function store(  act, ns ){
+#	printf( "%s %s\n",  act, ns )
+	entry[ ++fpe ] = act
+	entry[ ++fpe ] = ns 
+}
+
+function newtbl( tbl ){
+	   if ( not_firstone ) {
+		store( action, newstate )
+	   }
+	   not_firstone = 1
+	   entry_offset[ ++fpeo ] = fpe		# entry tbl offset list
+	   define[ ++fpdef ] = tbl	# state name to define
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov