@@ -104,7 +104,7 @@ SYSCONF:POSIX {
RAW_SOCKETS
}
-SPEC:XBS5 {
+SPEC:XBS5:_SC_XBS5 {
ILP32_OFF32
ILP32_OFFBIG
LP64_OFF64
@@ -21,7 +21,9 @@
#include <string.h>
#include <confstr.h>
#include "../version.h"
-#include "confdefs.h"
+
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
/* If BUF is not NULL and LEN > 0, fill in at most LEN - 1 bytes
of BUF with the value corresponding to NAME and zero-terminate BUF.
@@ -26,6 +26,9 @@
#include "../version.h"
#define PACKAGE _libc_intl_domainname
+#define NEED_SPEC_ARRAY 1
+#include <confdefs.h>
+
struct conf
{
const char *name;
@@ -387,23 +390,6 @@ static const struct conf vars[] =
};
-static const struct { const char *name; int num; } specs[] =
- {
- { "XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32 },
- { "XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG },
- { "XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64 },
- { "XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG },
- { "POSIX_V6_ILP32_OFF32", _SC_V6_ILP32_OFF32 },
- { "POSIX_V6_ILP32_OFFBIG", _SC_V6_ILP32_OFFBIG },
- { "POSIX_V6_LP64_OFF64", _SC_V6_LP64_OFF64 },
- { "POSIX_V6_LPBIG_OFFBIG", _SC_V6_LPBIG_OFFBIG },
- { "POSIX_V7_ILP32_OFF32", _SC_V7_ILP32_OFF32 },
- { "POSIX_V7_ILP32_OFFBIG", _SC_V7_ILP32_OFFBIG },
- { "POSIX_V7_LP64_OFF64", _SC_V7_LP64_OFF64 },
- { "POSIX_V7_LPBIG_OFFBIG", _SC_V7_LPBIG_OFFBIG },
- };
-static const int nspecs = sizeof (specs) / sizeof (specs[0]);
-
extern const char *__progname;
@@ -42,7 +42,8 @@
defined. These are called with arguments V5, V6, V7 before and
after the relevant groups of environments. */
-#include "confdefs.h"
+#define NEED_SPEC_ARRAY 0
+#include <confdefs.h>
START_ENV_GROUP (V7)
@@ -17,12 +17,17 @@ $2 == "{" {
split ($1, arr, ":")
type = arr[1]
prefix = arr[2]
+ if (arr[3] != "")
+ sc_prefix = arr[3]
+ else
+ sc_prefix = "_SC"
next
}
$1 == "}" {
prefix = ""
type = ""
+ sc_prefix = ""
next
}
@@ -37,6 +42,7 @@ $1 == "}" {
# CONFSTR: A configuration string
# SYSCONF: A numeric value
# SPEC: A specification
+ sc_prefixes[prefix][$1] = sc_prefix
conf[prefix][$1] = type
}
@@ -58,6 +64,26 @@ ENDFILE {
printf "# endif\n"
}
printf "#endif\n\n"
+
+ # Build a name -> sysconf number associative array to print a C array at
+ # the end.
+ if (conf[p][c] == "SPEC") {
+ name = sprintf ("%s_%s", p, c)
+ num = sprintf ("%s_%s", sc_prefixes[p][c], c)
+ spec[name] = num
+ }
}
}
+
+ # Print the specification array. Define the macro NEED_SPEC_ARRAY before
+ # including confdefs.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 int nspecs = sizeof (specs) / sizeof (specs[0]);"
+ print "#endif"
}
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <regex.h>
+#define NEED_SPEC_ARRAY 0
#include <confdefs.h>