Annotation of embedaddon/quagga/lib/memtypes.awk, revision 1.1.1.1

1.1       misho       1: # $Id: memtypes.awk,v 1.4 2006/03/30 14:30:19 paul 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>