17112dae6acac544a0271a85d95342c583441e2d1Dan Albert// -*- C++ -*-
27112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===------------------- support/xlocale/xlocale.h ------------------------===//
37112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
47112dae6acac544a0271a85d95342c583441e2d1Dan Albert//                     The LLVM Compiler Infrastructure
57112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
67112dae6acac544a0271a85d95342c583441e2d1Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
77112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Source Licenses. See LICENSE.TXT for details.
87112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// This is a shared implementation of a shim to provide extended locale support
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert// on top of libc's that don't support it (like Android's bionic, and Newlib).
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert// The 'illusion' only works when the specified locale is "C" or "POSIX", but
147112dae6acac544a0271a85d95342c583441e2d1Dan Albert// that's about as good as we can do without implementing full xlocale support
157112dae6acac544a0271a85d95342c583441e2d1Dan Albert// in the underlying libc.
167112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
177112dae6acac544a0271a85d95342c583441e2d1Dan Albert
187112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifndef _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
197112dae6acac544a0271a85d95342c583441e2d1Dan Albert#define _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
207112dae6acac544a0271a85d95342c583441e2d1Dan Albert
217112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifdef __cplusplus
227112dae6acac544a0271a85d95342c583441e2d1Dan Albertextern "C" {
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif
247112dae6acac544a0271a85d95342c583441e2d1Dan Albert
257112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isalnum_l(int c, locale_t) {
267112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isalnum(c);
277112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
287112dae6acac544a0271a85d95342c583441e2d1Dan Albert
297112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isalpha_l(int c, locale_t) {
307112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isalpha(c);
317112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
327112dae6acac544a0271a85d95342c583441e2d1Dan Albert
337112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isblank_l(int c, locale_t) {
347112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isblank(c);
357112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
367112dae6acac544a0271a85d95342c583441e2d1Dan Albert
377112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iscntrl_l(int c, locale_t) {
387112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iscntrl(c);
397112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
407112dae6acac544a0271a85d95342c583441e2d1Dan Albert
417112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isdigit_l(int c, locale_t) {
427112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isdigit(c);
437112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
447112dae6acac544a0271a85d95342c583441e2d1Dan Albert
457112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isgraph_l(int c, locale_t) {
467112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isgraph(c);
477112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert
497112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int islower_l(int c, locale_t) {
507112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return islower(c);
517112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
527112dae6acac544a0271a85d95342c583441e2d1Dan Albert
537112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isprint_l(int c, locale_t) {
547112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isprint(c);
557112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
567112dae6acac544a0271a85d95342c583441e2d1Dan Albert
577112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int ispunct_l(int c, locale_t) {
587112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return ispunct(c);
597112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
607112dae6acac544a0271a85d95342c583441e2d1Dan Albert
617112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isspace_l(int c, locale_t) {
627112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isspace(c);
637112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
647112dae6acac544a0271a85d95342c583441e2d1Dan Albert
657112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isupper_l(int c, locale_t) {
667112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isupper(c);
677112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
687112dae6acac544a0271a85d95342c583441e2d1Dan Albert
697112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int isxdigit_l(int c, locale_t) {
707112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return isxdigit(c);
717112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
727112dae6acac544a0271a85d95342c583441e2d1Dan Albert
737112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswalnum_l(wint_t c, locale_t) {
747112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswalnum(c);
757112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
767112dae6acac544a0271a85d95342c583441e2d1Dan Albert
777112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswalpha_l(wint_t c, locale_t) {
787112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswalpha(c);
797112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
807112dae6acac544a0271a85d95342c583441e2d1Dan Albert
817112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswblank_l(wint_t c, locale_t) {
827112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswblank(c);
837112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
847112dae6acac544a0271a85d95342c583441e2d1Dan Albert
857112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswcntrl_l(wint_t c, locale_t) {
867112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswcntrl(c);
877112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
887112dae6acac544a0271a85d95342c583441e2d1Dan Albert
897112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswdigit_l(wint_t c, locale_t) {
907112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswdigit(c);
917112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
927112dae6acac544a0271a85d95342c583441e2d1Dan Albert
937112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswgraph_l(wint_t c, locale_t) {
947112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswgraph(c);
957112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
967112dae6acac544a0271a85d95342c583441e2d1Dan Albert
977112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswlower_l(wint_t c, locale_t) {
987112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswlower(c);
997112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1007112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1017112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswprint_l(wint_t c, locale_t) {
1027112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswprint(c);
1037112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1047112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1057112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswpunct_l(wint_t c, locale_t) {
1067112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswpunct(c);
1077112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1087112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1097112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswspace_l(wint_t c, locale_t) {
1107112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswspace(c);
1117112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1127112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1137112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswupper_l(wint_t c, locale_t) {
1147112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswupper(c);
1157112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1167112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1177112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int iswxdigit_l(wint_t c, locale_t) {
1187112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return iswxdigit(c);
1197112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1207112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1217112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int toupper_l(int c, locale_t) {
1227112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return toupper(c);
1237112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1247112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1257112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int tolower_l(int c, locale_t) {
1267112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return tolower(c);
1277112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1287112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1297112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int towupper_l(int c, locale_t) {
1307112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return towupper(c);
1317112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1327112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1337112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int towlower_l(int c, locale_t) {
1347112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return towlower(c);
1357112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1367112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1377112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int strcoll_l(const char *s1, const char *s2, locale_t) {
1387112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strcoll(s1, s2);
1397112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1407112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1417112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline size_t strxfrm_l(char *dest, const char *src, size_t n,
1427112dae6acac544a0271a85d95342c583441e2d1Dan Albert                               locale_t) {
1437112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strxfrm(dest, src, n);
1447112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1457112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1467112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline size_t strftime_l(char *s, size_t max, const char *format,
1477112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                const struct tm *tm, locale_t) {
1487112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strftime(s, max, format, tm);
1497112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1507112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1517112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t) {
1527112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return wcscoll(ws1, ws2);
1537112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1547112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1557112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline size_t wcsxfrm_l(wchar_t *dest, const wchar_t *src, size_t n,
1567112dae6acac544a0271a85d95342c583441e2d1Dan Albert                               locale_t) {
1577112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return wcsxfrm(dest, src, n);
1587112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1597112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1607112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline long double strtold_l(const char *nptr, char **endptr, locale_t) {
1617112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strtold(nptr, endptr);
1627112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1637112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1647112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline long long strtoll_l(const char *nptr, char **endptr, int base,
1657112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                  locale_t) {
1667112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strtoll(nptr, endptr, base);
1677112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1687112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1697112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline unsigned long long strtoull_l(const char *nptr, char **endptr,
1707112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                            int base, locale_t) {
1717112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return strtoull(nptr, endptr, base);
1727112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1737112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1747112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr,
1757112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                  int base, locale_t) {
1767112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return wcstoll(nptr, endptr, base);
1777112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1787112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1797112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline unsigned long long wcstoull_l(const wchar_t *nptr,
1807112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                            wchar_t **endptr, int base,
1817112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                            locale_t) {
1827112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return wcstoull(nptr, endptr, base);
1837112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1847112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1857112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic inline long double wcstold_l(const wchar_t *nptr, wchar_t **endptr,
1867112dae6acac544a0271a85d95342c583441e2d1Dan Albert                                    locale_t) {
1877112dae6acac544a0271a85d95342c583441e2d1Dan Albert  return wcstold(nptr, endptr);
1887112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1897112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1907112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifdef __cplusplus
1917112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1927112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif
1937112dae6acac544a0271a85d95342c583441e2d1Dan Albert
1947112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif // _LIBCPP_SUPPORT_XLOCALE_XLOCALE_H
195