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