1#!/usr/bin/awk -f
2BEGIN {
3  state = 0;
4  struct_seen = "";
5}
6/^%{$/ && state == 0 {
7  state = 1;
8  next;
9}
10/^%}$/ && state == 1 {
11  state = 0;
12  next;
13}
14state == 1 { print; next; }
15/^struct/ && state == 0 {
16  print;
17  struct_seen = $2;
18  next;
19}
20/^%%$/ && state == 0 {
21  state = 2;
22  if (struct_seen !~ /^$/) {
23    print "static const struct", struct_seen, "wordlist[] = {";
24  } else {
25    print "static const struct map {";
26    print "\tconst char *name;";
27    print "\tint key;";
28    print "\tint valid;";
29    print "} wordlist[] = {";
30    struct_seen = "map";
31  }
32  next;
33}
34/^%%$/ && state == 2 {
35  state = 3;
36  print "\t{ NULL, 0, 0 }";
37  print "};";
38  print "#include <sys/param.h>";
39  print "#define\tNWORDS\t(nitems(wordlist) - 1)";
40  print "static const struct map *";
41  print "in_word_set(const char *word)";
42  print "{";
43  print "\tconst struct", struct_seen, "*mp;";
44  print "";
45  print "\tfor (mp = wordlist; mp < &wordlist[NWORDS]; mp++) {";
46  print "\t\tif (strcmp(word, mp->name) == 0)";
47  print "\t\t\treturn (mp);";
48  print "\t}";
49  print "\treturn (NULL);";
50  print "}";
51  print "";
52  next;
53}
54state == 2 && NF == 2 {
55  name = substr($1, 1, length($1) - 1);
56  printf "#ifdef %s\n", $2;
57  printf "\t{ \"%s\", %s, 1 },\n", name, $2;
58  print "#else";
59  printf "\t{ \"%s\", 0, 0 },\n", name, $2;
60  print "#endif"
61  next;
62}
63state == 3 { print; next; }
64{
65				# eat anything not matched.
66}
67