| 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 | } |