fake-gperf.awk revision 103591
1103516Swollman#!/usr/bin/awk -f
2103516Swollman# $FreeBSD: head/usr.bin/getconf/fake-gperf.awk 103591 2002-09-19 03:39:03Z wollman $
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;
23103516Swollman  print "#include <stddef.h>";
24103516Swollman  print "#include <string.h>";
25103591Swollman  if (struct_seen !~ /^$/) {
26103591Swollman    print "static const struct", struct_seen, "wordlist[] = {";
27103591Swollman  } else {
28103591Swollman    print "static const struct map {";
29103591Swollman    print "\tconst char *name;";
30103591Swollman    print "\tint key;";
31103591Swollman    print "\tint valid;";
32103591Swollman    print "} wordlist[] = {";
33103591Swollman    struct_seen = "map";
34103591Swollman  }
35103516Swollman  next;
36103516Swollman}
37103516Swollman/^%%$/ && state == 2 {
38103516Swollman  state = 3;
39103516Swollman  print "\t{ NULL }";
40103516Swollman  print "};";
41103591Swollman  print "#define\tNWORDS\t(sizeof(wordlist)/sizeof(wordlist[0]) - 1)";
42103516Swollman  print "static const struct map *";
43103516Swollman  print "in_word_set(const char *word, unsigned int len)";
44103516Swollman  print "{";
45103591Swollman  print "\tconst struct", struct_seen, "*mp;";
46103516Swollman  print "";
47103516Swollman  print "\tfor (mp = wordlist; mp < &wordlist[NWORDS]; mp++) {";
48103516Swollman  print "\t\tif (strcmp(word, mp->name) == 0)";
49103516Swollman  print "\t\t\treturn (mp);";
50103516Swollman  print "\t}";
51103516Swollman  print "\treturn (NULL);";
52103516Swollman  print "}";
53103516Swollman  print "";
54103516Swollman  next;
55103516Swollman}
56103516Swollmanstate == 2 && NF == 2 {
57103516Swollman  name = substr($1, 1, length($1) - 1);
58103591Swollman  printf "#ifdef %s\n", $2;
59103591Swollman  printf "\t{ \"%s\", %s, 1 },\n", name, $2;
60103591Swollman  print "#else";
61103591Swollman  printf "\t{ \"%s\", 0, 0 },\n", name, $2;
62103591Swollman  print "#endif"
63103516Swollman  next;
64103516Swollman}
65103516Swollmanstate == 3 { print; next; }
66103516Swollman{
67103516Swollman				# eat anything not matched.
68103516Swollman}
69