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