OLD | NEW |
1 //===------------------------- locale.cpp ---------------------------------===// | 1 //===------------------------- locale.cpp ---------------------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is dual licensed under the MIT and the University of Illinois Open | 5 // This file is dual licensed under the MIT and the University of Illinois Open |
6 // Source Licenses. See LICENSE.TXT for details. | 6 // Source Licenses. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 | 9 |
10 // On Solaris, we need to define something to make the C99 parts of localeconv | 10 // On Solaris, we need to define something to make the C99 parts of localeconv |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m))) | 803 if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m))) |
804 break; | 804 break; |
805 return low; | 805 return low; |
806 } | 806 } |
807 | 807 |
808 wchar_t | 808 wchar_t |
809 ctype<wchar_t>::do_toupper(char_type c) const | 809 ctype<wchar_t>::do_toupper(char_type c) const |
810 { | 810 { |
811 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 811 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
812 return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; | 812 return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; |
813 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | 813 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ |
| 814 defined(__NetBSD__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
814 return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; | 815 return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; |
815 #else | 816 #else |
816 return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c; | 817 return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c; |
817 #endif | 818 #endif |
818 } | 819 } |
819 | 820 |
820 const wchar_t* | 821 const wchar_t* |
821 ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const | 822 ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const |
822 { | 823 { |
823 for (; low != high; ++low) | 824 for (; low != high; ++low) |
824 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 825 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
825 *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; | 826 *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; |
826 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | 827 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ |
| 828 defined(__NetBSD__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
827 *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] | 829 *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] |
828 : *low; | 830 : *low; |
829 #else | 831 #else |
830 *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') :
*low; | 832 *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') :
*low; |
831 #endif | 833 #endif |
832 return low; | 834 return low; |
833 } | 835 } |
834 | 836 |
835 wchar_t | 837 wchar_t |
836 ctype<wchar_t>::do_tolower(char_type c) const | 838 ctype<wchar_t>::do_tolower(char_type c) const |
837 { | 839 { |
838 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 840 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
839 return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; | 841 return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; |
840 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | 842 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ |
| 843 defined(__NetBSD__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
841 return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; | 844 return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; |
842 #else | 845 #else |
843 return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c; | 846 return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c; |
844 #endif | 847 #endif |
845 } | 848 } |
846 | 849 |
847 const wchar_t* | 850 const wchar_t* |
848 ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const | 851 ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const |
849 { | 852 { |
850 for (; low != high; ++low) | 853 for (; low != high; ++low) |
851 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 854 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
852 *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; | 855 *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; |
853 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | 856 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ |
| 857 defined(__NetBSD__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
854 *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] | 858 *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] |
855 : *low; | 859 : *low; |
856 #else | 860 #else |
857 *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *
low; | 861 *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *
low; |
858 #endif | 862 #endif |
859 return low; | 863 return low; |
860 } | 864 } |
861 | 865 |
862 wchar_t | 866 wchar_t |
863 ctype<wchar_t>::do_widen(char c) const | 867 ctype<wchar_t>::do_widen(char c) const |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 } | 916 } |
913 | 917 |
914 char | 918 char |
915 ctype<char>::do_toupper(char_type c) const | 919 ctype<char>::do_toupper(char_type c) const |
916 { | 920 { |
917 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 921 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
918 return isascii(c) ? | 922 return isascii(c) ? |
919 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]
) : c; | 923 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]
) : c; |
920 #elif defined(__NetBSD__) | 924 #elif defined(__NetBSD__) |
921 return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(
c)]); | 925 return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(
c)]); |
922 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) | 926 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_
LIBC) |
923 return isascii(c) ? | 927 return isascii(c) ? |
924 static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)])
: c; | 928 static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)])
: c; |
925 #else | 929 #else |
926 return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c; | 930 return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c; |
927 #endif | 931 #endif |
928 } | 932 } |
929 | 933 |
930 const char* | 934 const char* |
931 ctype<char>::do_toupper(char_type* low, const char_type* high) const | 935 ctype<char>::do_toupper(char_type* low, const char_type* high) const |
932 { | 936 { |
933 for (; low != high; ++low) | 937 for (; low != high; ++low) |
934 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 938 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
935 *low = isascii(*low) ? | 939 *low = isascii(*low) ? |
936 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>
(*low)]) : *low; | 940 static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>
(*low)]) : *low; |
937 #elif defined(__NetBSD__) | 941 #elif defined(__NetBSD__) |
938 *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned ch
ar>(*low)]); | 942 *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned ch
ar>(*low)]); |
939 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) | 943 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_
LIBC) |
940 *low = isascii(*low) ? | 944 *low = isascii(*low) ? |
941 static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)])
: *low; | 945 static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)])
: *low; |
942 #else | 946 #else |
943 *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *lo
w; | 947 *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *lo
w; |
944 #endif | 948 #endif |
945 return low; | 949 return low; |
946 } | 950 } |
947 | 951 |
948 char | 952 char |
949 ctype<char>::do_tolower(char_type c) const | 953 ctype<char>::do_tolower(char_type c) const |
950 { | 954 { |
951 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 955 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
952 return isascii(c) ? | 956 return isascii(c) ? |
953 static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]
) : c; | 957 static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]
) : c; |
954 #elif defined(__NetBSD__) | 958 #elif defined(__NetBSD__) |
955 return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(
c)]); | 959 return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(
c)]); |
956 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__) | 960 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_
LIBC) |
957 return isascii(c) ? | 961 return isascii(c) ? |
958 static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c; | 962 static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c; |
959 #else | 963 #else |
960 return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c; | 964 return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c; |
961 #endif | 965 #endif |
962 } | 966 } |
963 | 967 |
964 const char* | 968 const char* |
965 ctype<char>::do_tolower(char_type* low, const char_type* high) const | 969 ctype<char>::do_tolower(char_type* low, const char_type* high) const |
966 { | 970 { |
967 for (; low != high; ++low) | 971 for (; low != high; ++low) |
968 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE | 972 #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE |
969 *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[s
tatic_cast<ptrdiff_t>(*low)]) : *low; | 973 *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[s
tatic_cast<ptrdiff_t>(*low)]) : *low; |
970 #elif defined(__NetBSD__) | 974 #elif defined(__NetBSD__) |
971 *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned ch
ar>(*low)]); | 975 *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned ch
ar>(*low)]); |
972 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) | 976 #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_
LIBC) |
973 *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_
cast<size_t>(*low)]) : *low; | 977 *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_
cast<size_t>(*low)]) : *low; |
974 #else | 978 #else |
975 *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *lo
w; | 979 *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *lo
w; |
976 #endif | 980 #endif |
977 return low; | 981 return low; |
978 } | 982 } |
979 | 983 |
980 char | 984 char |
981 ctype<char>::do_widen(char c) const | 985 ctype<char>::do_widen(char c) const |
982 { | 986 { |
(...skipping 20 matching lines...) Expand all Loading... |
1003 ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
char* dest) const | 1007 ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault,
char* dest) const |
1004 { | 1008 { |
1005 for (; low != high; ++low, ++dest) | 1009 for (; low != high; ++low, ++dest) |
1006 if (isascii(*low)) | 1010 if (isascii(*low)) |
1007 *dest = *low; | 1011 *dest = *low; |
1008 else | 1012 else |
1009 *dest = dfault; | 1013 *dest = dfault; |
1010 return low; | 1014 return low; |
1011 } | 1015 } |
1012 | 1016 |
1013 #ifdef __EMSCRIPTEN__ | 1017 #if defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
1014 extern "C" const unsigned short ** __ctype_b_loc(); | 1018 extern "C" const unsigned short ** __ctype_b_loc(); |
1015 extern "C" const int ** __ctype_tolower_loc(); | 1019 extern "C" const int ** __ctype_tolower_loc(); |
1016 extern "C" const int ** __ctype_toupper_loc(); | 1020 extern "C" const int ** __ctype_toupper_loc(); |
1017 #endif | 1021 #endif |
1018 | 1022 |
1019 const ctype<char>::mask* | 1023 const ctype<char>::mask* |
1020 ctype<char>::classic_table() _NOEXCEPT | 1024 ctype<char>::classic_table() _NOEXCEPT |
1021 { | 1025 { |
1022 #if defined(__APPLE__) || defined(__FreeBSD__) | 1026 #if defined(__APPLE__) || defined(__FreeBSD__) |
1023 return _DefaultRuneLocale.__runetype; | 1027 return _DefaultRuneLocale.__runetype; |
1024 #elif defined(__NetBSD__) | 1028 #elif defined(__NetBSD__) |
1025 return _C_ctype_tab_ + 1; | 1029 return _C_ctype_tab_ + 1; |
1026 #elif defined(__GLIBC__) | 1030 #elif defined(__GLIBC__) |
1027 return __cloc()->__ctype_b; | 1031 return __cloc()->__ctype_b; |
1028 #elif __sun__ | 1032 #elif __sun__ |
1029 return __ctype_mask; | 1033 return __ctype_mask; |
1030 #elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__) | 1034 #elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__) |
1031 return _ctype+1; // internal ctype mask table defined in msvcrt.dll | 1035 return _ctype+1; // internal ctype mask table defined in msvcrt.dll |
1032 // This is assumed to be safe, which is a nonsense assumption because we're | 1036 // This is assumed to be safe, which is a nonsense assumption because we're |
1033 // going to end up dereferencing it later... | 1037 // going to end up dereferencing it later... |
1034 #elif defined(__EMSCRIPTEN__) | 1038 #elif defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
1035 return *__ctype_b_loc(); | 1039 return *__ctype_b_loc(); |
1036 #elif defined(_NEWLIB_VERSION) // @LOCALMOD-START | 1040 #elif defined(_NEWLIB_VERSION) // @LOCALMOD-START |
1037 // Newlib has a 257-entry table in ctype_.c, where (char)0 starts at [1]. | 1041 // Newlib has a 257-entry table in ctype_.c, where (char)0 starts at [1]. |
1038 return _ctype_ + 1; | 1042 return _ctype_ + 1; |
1039 // @LOCALMOD-END | 1043 // @LOCALMOD-END |
1040 #elif defined(_AIX) | 1044 #elif defined(_AIX) |
1041 return (const unsigned int *)__lc_ctype_ptr->obj->mask; | 1045 return (const unsigned int *)__lc_ctype_ptr->obj->mask; |
1042 #elif defined(__ANDROID__) | 1046 #elif defined(__ANDROID__) |
1043 return reinterpret_cast<const unsigned char*>(_ctype_) + 1; | 1047 return reinterpret_cast<const unsigned char*>(_ctype_) + 1; |
1044 #else | 1048 #else |
(...skipping 24 matching lines...) Expand all Loading... |
1069 { | 1073 { |
1070 return _C_tolower_tab_ + 1; | 1074 return _C_tolower_tab_ + 1; |
1071 } | 1075 } |
1072 | 1076 |
1073 const short* | 1077 const short* |
1074 ctype<char>::__classic_upper_table() _NOEXCEPT | 1078 ctype<char>::__classic_upper_table() _NOEXCEPT |
1075 { | 1079 { |
1076 return _C_toupper_tab_ + 1; | 1080 return _C_toupper_tab_ + 1; |
1077 } | 1081 } |
1078 | 1082 |
1079 #elif defined(__EMSCRIPTEN__) | 1083 #elif defined(__EMSCRIPTEN__) || defined(_LIBCPP_HAS_MUSL_LIBC) |
1080 const int* | 1084 const int* |
1081 ctype<char>::__classic_lower_table() _NOEXCEPT | 1085 ctype<char>::__classic_lower_table() _NOEXCEPT |
1082 { | 1086 { |
1083 return *__ctype_tolower_loc(); | 1087 return *__ctype_tolower_loc(); |
1084 } | 1088 } |
1085 | 1089 |
1086 const int* | 1090 const int* |
1087 ctype<char>::__classic_upper_table() _NOEXCEPT | 1091 ctype<char>::__classic_upper_table() _NOEXCEPT |
1088 { | 1092 { |
1089 return *__ctype_toupper_loc(); | 1093 return *__ctype_toupper_loc(); |
1090 } | 1094 } |
1091 #endif // __GLIBC__ || __EMSCRIPTEN__ || __NETBSD__ | 1095 #endif // __GLIBC__ || __NETBSD__ || __EMSCRIPTEN__ || defined(_LIBCPP_HAS_MUSL_
LIBC) |
1092 | 1096 |
1093 // template <> class ctype_byname<char> | 1097 // template <> class ctype_byname<char> |
1094 | 1098 |
1095 ctype_byname<char>::ctype_byname(const char* name, size_t refs) | 1099 ctype_byname<char>::ctype_byname(const char* name, size_t refs) |
1096 : ctype<char>(0, false, refs), | 1100 : ctype<char>(0, false, refs), |
1097 __l(newlocale(LC_ALL_MASK, name, 0)) | 1101 __l(newlocale(LC_ALL_MASK, name, 0)) |
1098 { | 1102 { |
1099 #ifndef _LIBCPP_NO_EXCEPTIONS | 1103 #ifndef _LIBCPP_NO_EXCEPTIONS |
1100 if (__l == 0) | 1104 if (__l == 0) |
1101 throw runtime_error("ctype_byname<char>::ctype_byname" | 1105 throw runtime_error("ctype_byname<char>::ctype_byname" |
(...skipping 5062 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6164 template class messages_byname<wchar_t>; | 6168 template class messages_byname<wchar_t>; |
6165 | 6169 |
6166 template class codecvt_byname<char, char, mbstate_t>; | 6170 template class codecvt_byname<char, char, mbstate_t>; |
6167 template class codecvt_byname<wchar_t, char, mbstate_t>; | 6171 template class codecvt_byname<wchar_t, char, mbstate_t>; |
6168 template class codecvt_byname<char16_t, char, mbstate_t>; | 6172 template class codecvt_byname<char16_t, char, mbstate_t>; |
6169 template class codecvt_byname<char32_t, char, mbstate_t>; | 6173 template class codecvt_byname<char32_t, char, mbstate_t>; |
6170 | 6174 |
6171 template class __vector_base_common<true>; | 6175 template class __vector_base_common<true>; |
6172 | 6176 |
6173 _LIBCPP_END_NAMESPACE_STD | 6177 _LIBCPP_END_NAMESPACE_STD |
OLD | NEW |