lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame] | 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 | |
| 6 | BEGIN { |
| 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 | |
| 51 | END { |
| 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 | } |