# Generate posix-conf-vars-def.h with definitions for CONF_DEF{CONF} for each # configuration variable that getconf or sysconf may use. Currently it is # equipped only to generate such macros for specification macros and for # SYSCONF macros in the _POSIX namespace. BEGIN { prefix = "" } $1 ~ /^#/ || $0 ~ /^\s*$/ { next } # Begin a new prefix. $NF == "{" { type = $1 prefix = $2 if (NF == 4) sc_prefix = $3 else sc_prefix = "_SC" next } $1 == "}" { prefix = "" type = "" sc_prefix = "" next } { if (prefix == "" && type == "" && sc_prefix == "") { printf ("Syntax error at %s:%d\n", FILENAME, FNR) > "/dev/stderr" exit 1 } # The prefix and variable names are indices and the value indicates what type # of variable it is. The possible options are: # CONFSTR: A configuration string # SYSCONF: A numeric value # SPEC: A specification c = prefix "_" $1 sc_prefixes[c] = sc_prefix prefix_conf[c] = type conf[c] = $1 } END { print "/* AUTOGENERATED by gen-posix-conf-vars.awk. DO NOT EDIT. */\n" # Generate macros that specify if a sysconf macro is defined and/or set. for (c in prefix_conf) { printf "#ifndef _%s\n", c printf "# define CONF_DEF_%s CONF_DEF_UNDEFINED\n", c # CONFSTR have string values and they are not set or unset. if (prefix_conf[c] != "CONFSTR") { printf "#else\n" printf "# if _%s > 0\n", c printf "# define CONF_DEF_%s CONF_DEF_DEFINED_SET\n", c printf "# else\n" printf "# define CONF_DEF_%s CONF_DEF_DEFINED_UNSET\n", c printf "# endif\n" } printf "#endif\n\n" # Build a name -> sysconf number associative array to print a C array at # the end. if (prefix_conf[c] == "SPEC") { name = sprintf ("%s", c) num = sprintf ("%s_%s", sc_prefixes[c], conf[c]) spec[name] = num } } # Print the specification array. Define the macro NEED_SPEC_ARRAY before # including posix-conf-vars.h to make it available in the compilation unit. print "#if NEED_SPEC_ARRAY" print "static const struct { const char *name; int num; } specs[] =" print " {" for (s in spec) { printf " { \"%s\", %s },\n", s, spec[s] } print " };" print "static const size_t nspecs = sizeof (specs) / sizeof (specs[0]);" print "#endif" }