1 # $Id: memtypes.awk,v 1.4 2006/03/30 14:30:19 paul Exp $
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
7 # struct memory_list's must be declared as:
8 # '\nstruct memory_list memory_list_<name>[] .....'
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:
14 # '\n { MTYPE_AWESOME_IPV8 , "Amazing new protocol, says genius" {}..boo'
16 # We try to ignore lines whose first token is /* or *, ie C comment lines.
17 # So the following should work fine:
19 # '/* This is the best memory_list ever!
20 # ' * It's got all my MTYPE's */
22 # 'struct memory_list memory_list_my_amazing_mlist[] = =
24 # ' { MTYPE_DONGLE, "Dongle widget" }
25 # ' { MTYPE_FROB, "Frobulator" },
26 # '{ MTYPE_WIPPLE, "Wipple combombulator"}
29 # Even if it isn't quite a valid C declaration.
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
);
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);
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);
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
]);
62 printf (" MTYPE_MAX,\n};\n\n");
63 for (i =
0; i
< lcount
; i
++) {
65 printf (mlistformat
"\n", mlists
[i
]);