1# Generate posix-conf-vars-def.h with definitions for CONF_DEF{CONF} for each
2# configuration variable that getconf or sysconf may use.  Currently it is
3# equipped only to generate such macros for specification macros and for
4# SYSCONF macros in the _POSIX namespace.
5
6BEGIN {
7  prefix = ""
8}
9
10$1 ~ /^#/ || $0 ~ /^\s*$/ {
11  next
12}
13
14# Begin a new prefix.
15$NF == "{" {
16  type = $1
17  prefix = $2
18
19  if (NF == 4)
20    sc_prefix = $3
21  else
22    sc_prefix = "_SC"
23
24  next
25}
26
27$1 == "}" {
28  prefix = ""
29  type = ""
30  sc_prefix = ""
31  next
32}
33
34{
35  if (prefix == "" && type == "" && sc_prefix == "") {
36    printf ("Syntax error at %s:%d\n", FILENAME, FNR) > "/dev/stderr"
37    exit 1
38  }
39
40  # The prefix and variable names are indices and the value indicates what type
41  # of variable it is.  The possible options are:
42  # CONFSTR: A configuration string
43  # SYSCONF: A numeric value
44  # SPEC: A specification
45  c = prefix "_" $1
46  sc_prefixes[c] = sc_prefix
47  prefix_conf[c] = type
48  conf[c] = $1
49}
50
51END {
52  print "/* AUTOGENERATED by gen-posix-conf-vars.awk.  DO NOT EDIT.  */\n"
53
54  # Generate macros that specify if a sysconf macro is defined and/or set.
55  for (c in prefix_conf) {
56    printf "#ifndef _%s\n", c
57    printf "# define CONF_DEF_%s CONF_DEF_UNDEFINED\n", c
58    # CONFSTR have string values and they are not set or unset.
59    if (prefix_conf[c] != "CONFSTR") {
60      printf "#else\n"
61      printf "# if _%s > 0\n", c
62      printf "#  define CONF_DEF_%s CONF_DEF_DEFINED_SET\n", c
63      printf "# else\n"
64      printf "#  define CONF_DEF_%s CONF_DEF_DEFINED_UNSET\n", c
65      printf "# endif\n"
66    }
67    printf "#endif\n\n"
68
69    # Build a name -> sysconf number associative array to print a C array at
70    # the end.
71    if (prefix_conf[c] == "SPEC")
72      spec[c] = sc_prefixes[c] "_" conf[c]
73  }
74
75  # Print the specification array.  Define the macro NEED_SPEC_ARRAY before
76  # including posix-conf-vars.h to make it available in the compilation unit.
77  print "#if NEED_SPEC_ARRAY"
78  print "static const struct { const char *name; int num; } specs[] ="
79  print "  {"
80  for (s in spec) {
81    printf "    { \"%s\", %s },\n", s, spec[s]
82  }
83  print "  };"
84  print "static const size_t nspecs = sizeof (specs) / sizeof (specs[0]);"
85  print "#endif"
86}
87