File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / lib / memtypes.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_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    1: # $Id: memtypes.awk,v 1.1.1.1 2012/02/21 17:26:12 misho Exp $
    2: #
    3: # Scan a file of memory definitions (see eg memtypes.c) and generate
    4: # a corresponding header file with an enum of the MTYPE's and declarations
    5: # for the struct memory_list arrays
    6: #
    7: # struct memory_list's must be declared as:
    8: # '\nstruct memory_list memory_list_<name>[] .....'
    9: #
   10: # Each MTYPE_ within the definition must the second token on the line,
   11: # tokens being delineated by whitespace. It may only consist of the set of
   12: # characters [[:upper:]_[:digit:]]. Eg:
   13: #
   14: # '\n  {  MTYPE_AWESOME_IPV8 , "Amazing new protocol, says genius" {}..boo'
   15: #
   16: # We try to ignore lines whose first token is /* or *, ie C comment lines.
   17: # So the following should work fine:
   18: #
   19: # '/* This is the best memory_list ever!
   20: # ' * It's got all my MTYPE's */
   21: # '
   22: # 'struct memory_list memory_list_my_amazing_mlist[] = =
   23: # '{
   24: # '  { MTYPE_DONGLE, "Dongle widget" }
   25: # '  { MTYPE_FROB, "Frobulator" },
   26: # '{  MTYPE_WIPPLE, "Wipple combombulator"}
   27: # '}}}
   28: #
   29: # Even if it isn't quite a valid C declaration.
   30: #
   31: 
   32: BEGIN {
   33: 	mlistregex = "memory_list_(.*)\\[\\]";
   34: 	mtyperegex = "^(MTYPE_[[:upper:]_[:digit:]]+).*";
   35: 	header = "/* Auto-generated from memtypes.c by " ARGV[0] ". */\n";
   36: 	header = header "/* Do not edit! */\n";
   37: 	header = header "\n#ifndef _QUAGGA_MEMTYPES_H\n";
   38: 	header = header "#define _QUAGGA_MEMTYPES_H\n";
   39: 	footer = "\n#endif /* _QUAGGA_MEMTYPES_H */\n\n";
   40: 	mlistformat = "extern struct memory_list memory_list_%s[];";
   41: 	printf ("%s\n", header);
   42: }
   43: 
   44: # catch lines beginning with 'struct memory list ' and try snag the
   45: # memory_list name. Has to be 3rd field.
   46: ($0 ~ /^struct memory_list /) && (NF >= 3) {
   47: 	mlists[lcount++] = gensub(mlistregex, "\\1", "g",$3);
   48: }
   49: 
   50: # snag the MTYPE, it must self-standing and the second field,
   51: # though we do manage to tolerate the , C seperator being appended
   52: ($1 !~ /^\/?\*/) && ($2 ~ /^MTYPE_/) { 
   53: 	mtype[tcount++] = gensub(mtyperegex, "\\1", "g", $2);
   54: } 
   55: 
   56: END {
   57: 	printf("enum\n{\n  MTYPE_TMP = 1,\n"); 
   58: 	for (i = 0; i < tcount; i++) {
   59: 		if (mtype[i] != "" && mtype[i] != "MTYPE_TMP")
   60: 			printf ("  %s,\n", mtype[i]);
   61: 	}
   62: 	printf ("  MTYPE_MAX,\n};\n\n");
   63: 	for (i = 0; i < lcount; i++) {
   64: 		if (mlists[i] != "")
   65: 			printf (mlistformat "\n", mlists[i]);
   66: 	}
   67: 	printf (footer);
   68: }

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