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