]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/getconf/fake-gperf.awk
Merge llvm-project release/17.x llvmorg-17.0.3-0-g888437e1b600
[FreeBSD/FreeBSD.git] / usr.bin / getconf / fake-gperf.awk
1 #!/usr/bin/awk -f
2 BEGIN {
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 }
14 state == 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 }
54 state == 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 }
63 state == 3 { print; next; }
64 {
65                                 # eat anything not matched.
66 }