diff options
Diffstat (limited to 'REORG.TODO/scripts/gen-posix-conf-vars.awk')
-rw-r--r-- | REORG.TODO/scripts/gen-posix-conf-vars.awk | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/REORG.TODO/scripts/gen-posix-conf-vars.awk b/REORG.TODO/scripts/gen-posix-conf-vars.awk new file mode 100644 index 0000000000..9a4c54256a --- /dev/null +++ b/REORG.TODO/scripts/gen-posix-conf-vars.awk @@ -0,0 +1,86 @@ +# 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") + spec[c] = sc_prefixes[c] "_" conf[c] + } + + # 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" +} |