summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/stdlib/stdlib.c79
1 files changed, 52 insertions, 27 deletions
diff --git a/libc/stdlib/stdlib.c b/libc/stdlib/stdlib.c
index 211b8fe75..71a8b6875 100644
--- a/libc/stdlib/stdlib.c
+++ b/libc/stdlib/stdlib.c
@@ -34,32 +34,61 @@
#define _ISOC99_SOURCE /* for ULLONG primarily... */
#include <limits.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <ctype.h>
-#include <errno.h>
-#include <assert.h>
-#include <unistd.h>
-
/* Work around gcc's refusal to create aliases.
* TODO: Add in a define to disable the aliases? */
#if UINT_MAX == ULONG_MAX
-#define atoi __ignore_atoi
+#ifdef L_labs
#define abs __ignore_abs
#endif
+#ifdef L_atol
+#define atoi __ignore_atoi
+#endif
+#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#ifdef L_labs
#define llabs __ignore_llabs
+#endif
+#ifdef L_atol
#define atoll __ignore_atoll
+#endif
+#ifdef L_strtol
#define strtoll __ignore_strtoll
+#endif
+#ifdef L_strtoul
#define strtoull __ignore_strtoull
+#endif
+#ifdef L_wcstol
#define wcstoll __ignore_wcstoll
+#endif
+#ifdef L_wcstoul
#define wcstoull __ignore_wcstoull
+#endif
+#ifdef strtol_l
#define strtoll_l __ignore_strtoll_l
+#endif
+#ifdef L_strtoul_l
#define strtoull_l __ignore_strtoull_l
+#endif
+#ifdef L_wcstol_l
#define wcstoll_l __ignore_wcstoll_l
+#endif
+#ifdef L_wcstoul_l
#define wcstoull_l __ignore_wcstoull_l
#endif
+#endif
+#if defined(ULLONG_MAX) && (ULLONG_MAX == UINTMAX_MAX)
+#if defined L_labs || defined L_llabs
+#define imaxabs __ignore_imaxabs
+#endif
+#endif
+
+#include <stdint.h>
+#include <inttypes.h>
+#include <ctype.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
#include <stdlib.h>
#include <locale.h>
@@ -113,23 +142,6 @@ libc_hidden_proto(__global_locale)
#endif /* __UCLIBC_HAS_LOCALE__ */
-#if UINT_MAX == ULONG_MAX
-#undef atoi
-#undef abs
-#endif
-#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
-#undef llabs
-#undef atoll
-#undef strtoll
-#undef strtoull
-#undef wcstoll
-#undef wcstoull
-#undef strtoll_l
-#undef strtoull_l
-#undef wcstoll_l
-#undef wcstoull_l
-#endif /* __UCLIBC_HAS_WCHAR__ */
-
/**********************************************************************/
#ifdef __UCLIBC_HAS_XLOCALE__
@@ -217,14 +229,20 @@ long int labs(long int j)
}
#if UINT_MAX == ULONG_MAX
+#undef abs
+extern __typeof(labs) abs;
strong_alias(labs,abs)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef llabs
+extern __typeof(labs) llabs;
strong_alias(labs,llabs)
#endif
#if ULONG_MAX == UINTMAX_MAX
+#undef imaxabs
+extern __typeof(labs) imaxabs;
strong_alias(labs,imaxabs)
#endif
@@ -240,6 +258,8 @@ long long int llabs(long long int j)
}
#if (ULLONG_MAX == UINTMAX_MAX)
+#undef imaxabs
+extern __typeof(llabs) imaxabs;
strong_alias(llabs,imaxabs)
#endif
@@ -276,15 +296,16 @@ long atol(const char *nptr)
libc_hidden_def(atol)
#if UINT_MAX == ULONG_MAX
-/* psm: need to redefine atoi here */
#undef atoi
-extern long int atoi (__const char *__nptr) __THROW __attribute_pure__ __nonnull ((1)) __wur;
+extern __typeof(atol) atoi;
libc_hidden_proto(atoi)
strong_alias(atol,atoi)
libc_hidden_def(atoi)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef atoll
+extern __typeof(atol) atoll;
strong_alias(atol,atoll)
#endif
@@ -320,6 +341,7 @@ strong_alias(strtol,strtoimax)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef __XL_NPP(strtoll)
extern __typeof(strtol) __XL_NPP(strtoll);
libc_hidden_proto(__XL_NPP(strtoll))
strong_alias(__XL_NPP(strtol),__XL_NPP(strtoll))
@@ -369,6 +391,7 @@ strong_alias(strtoul,strtoumax)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef __XL_NPP(strtoull)
extern __typeof(strtoul) __XL_NPP(strtoull);
libc_hidden_proto(__XL_NPP(strtoull))
strong_alias(__XL_NPP(strtoul),__XL_NPP(strtoull))
@@ -1027,6 +1050,7 @@ strong_alias(wcstol,wcstoimax)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef __XL_NPP(wcstoll)
extern __typeof(wcstol) __XL_NPP(wcstoll);
libc_hidden_proto(__XL_NPP(wcstoll))
strong_alias(__XL_NPP(wcstol),__XL_NPP(wcstoll))
@@ -1076,6 +1100,7 @@ strong_alias(wcstoul,wcstoumax)
#endif
#if defined(ULLONG_MAX) && (ULLONG_MAX == ULONG_MAX)
+#undef __XL_NPP(wcstoull)
extern __typeof(wcstoul) __XL_NPP(wcstoull);
libc_hidden_proto(__XL_NPP(wcstoull))
strong_alias(__XL_NPP(wcstoul),__XL_NPP(wcstoull))