summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-09-19 17:39:51 -0400
committerRich Felker <dalias@aerifal.cx>2011-09-19 17:39:51 -0400
commit224c7a376acbc2feda12169b806e9845c828595e (patch)
tree69a72217cdf67552ffd69f5fbbfb4a5cf4db91c8 /arch
parent089aeb08a083d798b59fc84cbff9383f304b1b8f (diff)
downloadmusl-224c7a376acbc2feda12169b806e9845c828595e.tar.gz
fix the type of wchar_t on arm; support wchar_t varying with arch
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.
Diffstat (limited to 'arch')
-rwxr-xr-xarch/arm/bits/alltypes.h.sh8
-rw-r--r--arch/arm/bits/wchar.h4
-rw-r--r--arch/i386/bits/wchar.h4
-rw-r--r--arch/x86_64/bits/wchar.h4
4 files changed, 14 insertions, 6 deletions
diff --git a/arch/arm/bits/alltypes.h.sh b/arch/arm/bits/alltypes.h.sh
index 6409a96e..11f1d93f 100755
--- a/arch/arm/bits/alltypes.h.sh
+++ b/arch/arm/bits/alltypes.h.sh
@@ -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
index 00000000..ffb26917
--- /dev/null
+++ b/arch/arm/bits/wchar.h
@@ -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
index 00000000..c969c5b6
--- /dev/null
+++ b/arch/i386/bits/wchar.h
@@ -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
index 00000000..c969c5b6
--- /dev/null
+++ b/arch/x86_64/bits/wchar.h
@@ -0,0 +1,4 @@
+#ifndef WCHAR_MIN
+#define WCHAR_MIN (-1-0x7fffffff)
+#define WCHAR_MAX (0x7fffffff)
+#endif