1103516Swollman#!/usr/bin/awk -f
2103516Swollman# $FreeBSD: stable/11/usr.bin/getconf/fake-gperf.awk 321152 2017-07-18 18:33:07Z ngie $
3103516SwollmanBEGIN {
4103516Swollman  state = 0;
5103591Swollman  struct_seen = "";
6103516Swollman}
7103516Swollman/^%{$/ && state == 0 {
8103516Swollman  state = 1;
9103516Swollman  next;
10103516Swollman}
11103516Swollman/^%}$/ && state == 1 {
12103516Swollman  state = 0;
13103516Swollman  next;
14103516Swollman}
15103516Swollmanstate == 1 { print; next; }
16103591Swollman/^struct/ && state == 0 {
17103591Swollman  print;
18103591Swollman  struct_seen = $2;
19103591Swollman  next;
20103591Swollman}
21103516Swollman/^%%$/ && state == 0 {
22103516Swollman  state = 2;
23103591Swollman  if (struct_seen !~ /^$/) {
24103591Swollman    print "static const struct", struct_seen, "wordlist[] = {";
25103591Swollman  } else {
26103591Swollman    print "static const struct map {";
27103591Swollman    print "\tconst char *name;";
28103591Swollman    print "\tint key;";
29103591Swollman    print "\tint valid;";
30103591Swollman    print "} wordlist[] = {";
31103591Swollman    struct_seen = "map";
32103591Swollman  }
33103516Swollman  next;
34103516Swollman}
35103516Swollman/^%%$/ && state == 2 {
36103516Swollman  state = 3;
37119312Smarkm  print "\t{ NULL, 0, 0 }";
38103516Swollman  print "};";
39321152Sngie  print "#include <sys/param.h>";
40321152Sngie  print "#define\tNWORDS\t(nitems(wordlist) - 1)";
41103516Swollman  print "static const struct map *";
42119312Smarkm  print "in_word_set(const char *word)";
43103516Swollman  print "{";
44103591Swollman  print "\tconst struct", struct_seen, "*mp;";
45103516Swollman  print "";
46103516Swollman  print "\tfor (mp = wordlist; mp < &wordlist[NWORDS]; mp++) {";
47103516Swollman  print "\t\tif (strcmp(word, mp->name) == 0)";
48103516Swollman  print "\t\t\treturn (mp);";
49103516Swollman  print "\t}";
50103516Swollman  print "\treturn (NULL);";
51103516Swollman  print "}";
52103516Swollman  print "";
53103516Swollman  next;
54103516Swollman}
55103516Swollmanstate == 2 && NF == 2 {
56103516Swollman  name = substr($1, 1, length($1) - 1);
57103591Swollman  printf "#ifdef %s\n", $2;
58103591Swollman  printf "\t{ \"%s\", %s, 1 },\n", name, $2;
59103591Swollman  print "#else";
60103591Swollman  printf "\t{ \"%s\", 0, 0 },\n", name, $2;
61103591Swollman  print "#endif"
62103516Swollman  next;
63103516Swollman}
64103516Swollmanstate == 3 { print; next; }
65103516Swollman{
66103516Swollman				# eat anything not matched.
67103516Swollman}
68