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.
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;
--- /dev/null
+#ifndef WCHAR_MIN
+#define WCHAR_MIN 0U
+#define WCHAR_MAX 0xffffffffU
+#endif
--- /dev/null
+#ifndef WCHAR_MIN
+#define WCHAR_MIN (-1-0x7fffffff)
+#define WCHAR_MAX (0x7fffffff)
+#endif
--- /dev/null
+#ifndef WCHAR_MIN
+#define WCHAR_MIN (-1-0x7fffffff)
+#define WCHAR_MAX (0x7fffffff)
+#endif
#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
#include <bits/alltypes.h>
+#include <bits/wchar.h>
+
#undef NULL
#ifdef __cplusplus
#define NULL 0
#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;