fix the type of wchar_t on arm; support wchar_t varying with arch
authorRich Felker <dalias@aerifal.cx>
Mon, 19 Sep 2011 21:39:51 +0000 (17:39 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 19 Sep 2011 21:39:51 +0000 (17:39 -0400)
really wchar_t should never vary, but the ARM EABI defines it as an
unsigned 32-bit int instead of a signed one, and gcc follows this
nonsense. thus, to give a conformant environment, we have to follow
(otherwise L""[0] and L'\0' would be 0U rather than 0, but the
application would be unaware due to a mismatched definition for
WCHAR_MIN and WCHAR_MAX, and Bad Things could happen with respect to
signed/unsigned comparisons, promotions, etc.).

fortunately no rules are imposed by the C standard on the relationship
between wchar_t and wint_t, and WEOF has type wint_t, so we can still
make wint_t always-signed and use -1 for WEOF.

arch/arm/bits/alltypes.h.sh
arch/arm/bits/wchar.h [new file with mode: 0644]
arch/i386/bits/wchar.h [new file with mode: 0644]
arch/x86_64/bits/wchar.h [new file with mode: 0644]
include/stdint.h
include/wchar.h

index 6409a96..11f1d93 100755 (executable)
@@ -22,12 +22,8 @@ TYPEDEF long ptrdiff_t;
 
 TYPEDEF __builtin_va_list va_list;
 
-#ifdef __WCHAR_TYPE__
-TYPEDEF __WCHAR_TYPE__ wchar_t;
-#else
-TYPEDEF long wchar_t;
-#endif
-TYPEDEF long wint_t;
+TYPEDEF unsigned wchar_t;
+TYPEDEF int wint_t;
 TYPEDEF long wctrans_t;
 TYPEDEF long wctype_t;
 
diff --git a/arch/arm/bits/wchar.h b/arch/arm/bits/wchar.h
new file mode 100644 (file)
index 0000000..ffb2691
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef WCHAR_MIN
+#define WCHAR_MIN 0U
+#define WCHAR_MAX 0xffffffffU
+#endif
diff --git a/arch/i386/bits/wchar.h b/arch/i386/bits/wchar.h
new file mode 100644 (file)
index 0000000..c969c5b
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef WCHAR_MIN
+#define WCHAR_MIN (-1-0x7fffffff)
+#define WCHAR_MAX (0x7fffffff)
+#endif
diff --git a/arch/x86_64/bits/wchar.h b/arch/x86_64/bits/wchar.h
new file mode 100644 (file)
index 0000000..c969c5b
--- /dev/null
@@ -0,0 +1,4 @@
+#ifndef WCHAR_MIN
+#define WCHAR_MIN (-1-0x7fffffff)
+#define WCHAR_MAX (0x7fffffff)
+#endif
index a4c73b5..5400667 100644 (file)
@@ -71,19 +71,14 @@ typedef unsigned long long uintmax_t;
 #define UINT_LEAST32_MAX UINT32_MAX
 #define UINT_LEAST64_MAX UINT64_MAX
 
-#undef WCHAR_MIN
-#undef WCHAR_MAX
-#undef WINT_MIN
-#undef WINT_MAX
-#define WCHAR_MIN INT32_MIN
-#define WCHAR_MAX INT32_MAX
-#define WINT_MIN INT32_MIN
-#define WINT_MAX INT32_MAX
-
 #define INTMAX_MIN  INT64_MIN
 #define INTMAX_MAX  INT64_MAX
 #define UINTMAX_MAX UINT64_MAX
 
+#define WINT_MIN INT32_MIN
+#define WINT_MAX INT32_MAX
+
+#include <bits/wchar.h>
 #include <bits/stdint.h>
 
 #endif
index c3d8b04..87e244a 100644 (file)
@@ -17,6 +17,8 @@ extern "C" {
 
 #include <bits/alltypes.h>
 
+#include <bits/wchar.h>
+
 #undef NULL
 #ifdef __cplusplus
 #define NULL 0
@@ -24,15 +26,9 @@ extern "C" {
 #define NULL ((void*)0)
 #endif
 
-#undef WCHAR_MIN
-#undef WCHAR_MAX
-#define WCHAR_MIN (-1-0x7fffffff)
-#define WCHAR_MAX (0x7fffffff)
-
 #undef WEOF
 #define WEOF (-1)
 
-
 typedef struct
 {
        unsigned __opaque1, __opaque2;