summaryrefslogtreecommitdiffstats
path: root/libcxx/include/support
diff options
context:
space:
mode:
authorJonathan Roelofs <jonathan@codesourcery.com>2014-09-19 20:09:12 +0000
committerJonathan Roelofs <jonathan@codesourcery.com>2014-09-19 20:09:12 +0000
commit4f1561a5dd875711fcb5018de791bf953d25c817 (patch)
tree9ab69c75b07ba0fd5ea8d89d1a0e4786963a5180 /libcxx/include/support
parent0fc0c22fa9fb999f988b89e6870ed657e17d87a9 (diff)
downloadbcm5719-llvm-4f1561a5dd875711fcb5018de791bf953d25c817.tar.gz
bcm5719-llvm-4f1561a5dd875711fcb5018de791bf953d25c817.zip
Support newlib as libc++'s C library [locale part]
http://reviews.llvm.org/D5385 llvm-svn: 218144
Diffstat (limited to 'libcxx/include/support')
-rw-r--r--libcxx/include/support/android/locale_bionic.h169
-rw-r--r--libcxx/include/support/newlib/xlocale.h63
-rw-r--r--libcxx/include/support/xlocale/xlocale.h194
3 files changed, 261 insertions, 165 deletions
diff --git a/libcxx/include/support/android/locale_bionic.h b/libcxx/include/support/android/locale_bionic.h
index 354fcfe340d..3a020da67e6 100644
--- a/libcxx/include/support/android/locale_bionic.h
+++ b/libcxx/include/support/android/locale_bionic.h
@@ -20,173 +20,12 @@ extern "C" {
#include <stdlib.h>
#include <xlocale.h>
-static inline int isalnum_l(int c, locale_t) {
- return isalnum(c);
-}
-
-static inline int isalpha_l(int c, locale_t) {
- return isalpha(c);
-}
-
-static inline int isblank_l(int c, locale_t) {
- return isblank(c);
-}
-
-static inline int iscntrl_l(int c, locale_t) {
- return iscntrl(c);
-}
-
-static inline int isdigit_l(int c, locale_t) {
- return isdigit(c);
-}
-
-static inline int isgraph_l(int c, locale_t) {
- return isgraph(c);
-}
-
-static inline int islower_l(int c, locale_t) {
- return islower(c);
-}
-
-static inline int isprint_l(int c, locale_t) {
- return isprint(c);
-}
-
-static inline int ispunct_l(int c, locale_t) {
- return ispunct(c);
-}
-
-static inline int isspace_l(int c, locale_t) {
- return isspace(c);
-}
-
-static inline int isupper_l(int c, locale_t) {
- return isupper(c);
-}
-
-static inline int isxdigit_l(int c, locale_t) {
- return isxdigit(c);
-}
-
-static inline int iswalnum_l(wint_t c, locale_t) {
- return iswalnum(c);
-}
-
-static inline int iswalpha_l(wint_t c, locale_t) {
- return iswalpha(c);
-}
-
-static inline int iswblank_l(wint_t c, locale_t) {
- return iswblank(c);
-}
-
-static inline int iswcntrl_l(wint_t c, locale_t) {
- return iswcntrl(c);
-}
-
-static inline int iswdigit_l(wint_t c, locale_t) {
- return iswdigit(c);
-}
-
-static inline int iswgraph_l(wint_t c, locale_t) {
- return iswgraph(c);
-}
-
-static inline int iswlower_l(wint_t c, locale_t) {
- return iswlower(c);
-}
-
-static inline int iswprint_l(wint_t c, locale_t) {
- return iswprint(c);
-}
-
-static inline int iswpunct_l(wint_t c, locale_t) {
- return iswpunct(c);
-}
-
-static inline int iswspace_l(wint_t c, locale_t) {
- return iswspace(c);
-}
-
-static inline int iswupper_l(wint_t c, locale_t) {
- return iswupper(c);
-}
-
-static inline int iswxdigit_l(wint_t c, locale_t) {
- return iswxdigit(c);
-}
-
-static inline int toupper_l(int c, locale_t) {
- return toupper(c);
-}
-
-static inline int tolower_l(int c, locale_t) {
- return tolower(c);
-}
-
-static inline int towupper_l(int c, locale_t) {
- return towupper(c);
-}
-
-static inline int towlower_l(int c, locale_t) {
- return towlower(c);
-}
-
-static inline int strcoll_l(const char *s1, const char *s2, locale_t) {
- return strcoll(s1, s2);
-}
-
-static inline size_t strxfrm_l(char *dest, const char *src, size_t n,
- locale_t) {
- return strxfrm(dest, src, n);
-}
-
-static inline size_t strftime_l(char *s, size_t max, const char *format,
- const struct tm *tm, locale_t) {
- return strftime(s, max, format, tm);
-}
-
-static inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
- return wcscoll(ws1, ws2);
-}
-
-static inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
- locale_t) {
- return wcsxfrm(dest, src, n);
-}
-
-static inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
- return strtold(nptr, endptr);
-}
-
-static inline long long strtoll_l(const char *nptr, char **endptr, size_t base,
- locale_t) {
- return strtoll(nptr, endptr, base);
-}
-
-static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
- size_t base, locale_t) {
- return strtoull(nptr, endptr, base);
-}
-
-static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
- size_t base, locale_t) {
- return wcstoll(nptr, endptr, base);
-}
-
-static inline unsigned long long wcstoull_l(const wchar_t *nptr,
- wchar_t **endptr, size_t base,
- locale_t) {
- return wcstoull(nptr, endptr, base);
-}
-
-static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
- locale_t) {
- return wcstold(nptr, endptr);
-}
-
#ifdef __cplusplus
}
#endif
+
+// Share implementation with Newlib
+#include <support/xlocale/xlocale.h>
+
#endif // defined(__ANDROID__)
#endif // _LIBCPP_SUPPORT_ANDROID_LOCALE_BIONIC_H
diff --git a/libcxx/include/support/newlib/xlocale.h b/libcxx/include/support/newlib/xlocale.h
new file mode 100644
index 00000000000..d067cf85a3b
--- /dev/null
+++ b/libcxx/include/support/newlib/xlocale.h
@@ -0,0 +1,63 @@
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
+#define _LIBCPP_SUPPORT_NEWLIB_XLOCALE_H
+
+#if defined(_NEWLIB_VERSION)
+
+#include <cstdlib>
+#include <clocale>
+#include <cwctype>
+#include <ctype.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Patch over newlib's lack of extended locale support
+typedef void *locale_t;
+static inline locale_t duplocale(locale_t) {
+ return NULL;
+}
+
+static inline void freelocale(locale_t) {
+}
+
+static inline locale_t newlocale(int, const char *, locale_t) {
+ return NULL;
+}
+
+static inline locale_t uselocale(locale_t) {
+ return NULL;
+}
+
+#define LC_COLLATE_MASK (1 << LC_COLLATE)
+#define LC_CTYPE_MASK (1 << LC_CTYPE)
+#define LC_MESSAGES_MASK (1 << LC_MESSAGES)
+#define LC_MONETARY_MASK (1 << LC_MONETARY)
+#define LC_NUMERIC_MASK (1 << LC_NUMERIC)
+#define LC_TIME_MASK (1 << LC_TIME)
+#define LC_ALL_MASK (LC_COLLATE_MASK|\
+ LC_CTYPE_MASK|\
+ LC_MONETARY_MASK|\
+ LC_NUMERIC_MASK|\
+ LC_TIME_MASK|\
+ LC_MESSAGES_MASK)
+
+// Share implementation with Android's Bionic
+#include <support/xlocale/xlocale.h>
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _NEWLIB_VERSION
+
+#endif
diff --git a/libcxx/include/support/xlocale/xlocale.h b/libcxx/include/support/xlocale/xlocale.h
new file mode 100644
index 00000000000..99f710e8f44
--- /dev/null
+++ b/libcxx/include/support/xlocale/xlocale.h
@@ -0,0 +1,194 @@
+// -*- C++ -*-
+//===------------------- support/xlocale/xlocale.h ------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+// This is a shared implementation of a shim to provide extended locale support
+// on top of libc's that don't support it (like Android's bionic, and Newlib).
+//
+// The 'illusion' only works when the specified locale is "C" or "POSIX", but
+// that's about as good as we can do without implementing full xlocale support
+// in the underlying libc.
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
+#define _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static inline int isalnum_l(int c, locale_t) {
+ return isalnum(c);
+}
+
+static inline int isalpha_l(int c, locale_t) {
+ return isalpha(c);
+}
+
+static inline int isblank_l(int c, locale_t) {
+ return isblank(c);
+}
+
+static inline int iscntrl_l(int c, locale_t) {
+ return iscntrl(c);
+}
+
+static inline int isdigit_l(int c, locale_t) {
+ return isdigit(c);
+}
+
+static inline int isgraph_l(int c, locale_t) {
+ return isgraph(c);
+}
+
+static inline int islower_l(int c, locale_t) {
+ return islower(c);
+}
+
+static inline int isprint_l(int c, locale_t) {
+ return isprint(c);
+}
+
+static inline int ispunct_l(int c, locale_t) {
+ return ispunct(c);
+}
+
+static inline int isspace_l(int c, locale_t) {
+ return isspace(c);
+}
+
+static inline int isupper_l(int c, locale_t) {
+ return isupper(c);
+}
+
+static inline int isxdigit_l(int c, locale_t) {
+ return isxdigit(c);
+}
+
+static inline int iswalnum_l(wint_t c, locale_t) {
+ return iswalnum(c);
+}
+
+static inline int iswalpha_l(wint_t c, locale_t) {
+ return iswalpha(c);
+}
+
+static inline int iswblank_l(wint_t c, locale_t) {
+ return iswblank(c);
+}
+
+static inline int iswcntrl_l(wint_t c, locale_t) {
+ return iswcntrl(c);
+}
+
+static inline int iswdigit_l(wint_t c, locale_t) {
+ return iswdigit(c);
+}
+
+static inline int iswgraph_l(wint_t c, locale_t) {
+ return iswgraph(c);
+}
+
+static inline int iswlower_l(wint_t c, locale_t) {
+ return iswlower(c);
+}
+
+static inline int iswprint_l(wint_t c, locale_t) {
+ return iswprint(c);
+}
+
+static inline int iswpunct_l(wint_t c, locale_t) {
+ return iswpunct(c);
+}
+
+static inline int iswspace_l(wint_t c, locale_t) {
+ return iswspace(c);
+}
+
+static inline int iswupper_l(wint_t c, locale_t) {
+ return iswupper(c);
+}
+
+static inline int iswxdigit_l(wint_t c, locale_t) {
+ return iswxdigit(c);
+}
+
+static inline int toupper_l(int c, locale_t) {
+ return toupper(c);
+}
+
+static inline int tolower_l(int c, locale_t) {
+ return tolower(c);
+}
+
+static inline int towupper_l(int c, locale_t) {
+ return towupper(c);
+}
+
+static inline int towlower_l(int c, locale_t) {
+ return towlower(c);
+}
+
+static inline int strcoll_l(const char *s1, const char *s2, locale_t) {
+ return strcoll(s1, s2);
+}
+
+static inline size_t strxfrm_l(char *dest, const char *src, size_t n,
+ locale_t) {
+ return strxfrm(dest, src, n);
+}
+
+static inline size_t strftime_l(char *s, size_t max, const char *format,
+ const struct tm *tm, locale_t) {
+ return strftime(s, max, format, tm);
+}
+
+static inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
+ return wcscoll(ws1, ws2);
+}
+
+static inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
+ locale_t) {
+ return wcsxfrm(dest, src, n);
+}
+
+static inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
+ return strtold(nptr, endptr);
+}
+
+static inline long long strtoll_l(const char *nptr, char **endptr, int base,
+ locale_t) {
+ return strtoll(nptr, endptr, base);
+}
+
+static inline unsigned long long strtoull_l(const char *nptr, char **endptr,
+ int base, locale_t) {
+ return strtoull(nptr, endptr, base);
+}
+
+static inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
+ int base, locale_t) {
+ return wcstoll(nptr, endptr, base);
+}
+
+static inline unsigned long long wcstoull_l(const wchar_t *nptr,
+ wchar_t **endptr, int base,
+ locale_t) {
+ return wcstoull(nptr, endptr, base);
+}
+
+static inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
+ locale_t) {
+ return wcstold(nptr, endptr);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
OpenPOWER on IntegriCloud