Annotation of embedaddon/quagga/lib/memtypes.awk, revision 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>