[v3,0/7] Fix some libm static issues
[platform/upstream/glibc.git] / scripts / gen-posix-conf-vars.awk
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 }