Index: libcxx/include/__locale =================================================================== --- libcxx/include/__locale +++ libcxx/include/__locale @@ -568,6 +568,15 @@ explicit ctype(size_t __refs = 0) : locale::facet(__refs) {} + static bool __is_valid_in_encoding(char_type __c) + { +#if defined(__MVS__) + return (__c >=0 && __c < 256); +#else + return isascii(__c); +#endif + } + _LIBCPP_INLINE_VISIBILITY bool is(mask __m, char_type __c) const { @@ -670,17 +679,27 @@ explicit ctype(const mask* __tab = nullptr, bool __del = false, size_t __refs = 0); + static bool __is_valid_in_encoding(char_type __c) + { +#if defined(__MVS__) + (void)__c; + return true; +#else + return isascii(__c); +#endif + } + _LIBCPP_INLINE_VISIBILITY bool is(mask __m, char_type __c) const { - return isascii(__c) ? (__tab_[static_cast(__c)] & __m) !=0 : false; + return __is_valid_in_encoding(__c) ? (__tab_[static_cast(__c)] & __m) !=0 : false; } _LIBCPP_INLINE_VISIBILITY const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const { for (; __low != __high; ++__low, ++__vec) - *__vec = isascii(*__low) ? __tab_[static_cast(*__low)] : 0; + *__vec = __is_valid_in_encoding(*__low) ? __tab_[static_cast(*__low)] : 0; return __low; } @@ -688,7 +707,7 @@ const char_type* scan_is (mask __m, const char_type* __low, const char_type* __high) const { for (; __low != __high; ++__low) - if (isascii(*__low) && (__tab_[static_cast(*__low)] & __m)) + if (__is_valid_in_encoding(*__low) && (__tab_[static_cast(*__low)] & __m)) break; return __low; } @@ -697,7 +716,7 @@ const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const { for (; __low != __high; ++__low) - if (!(isascii(*__low) && (__tab_[static_cast(*__low)] & __m))) + if (!(__is_valid_in_encoding(*__low) && (__tab_[static_cast(*__low)] & __m))) break; return __low; } Index: libcxx/src/locale.cpp =================================================================== --- libcxx/src/locale.cpp +++ libcxx/src/locale.cpp @@ -862,14 +862,14 @@ bool ctype::do_is(mask m, char_type c) const { - return isascii(c) ? (ctype::classic_table()[c] & m) != 0 : false; + return isbasic(c) ? (ctype::classic_table()[c] & m) != 0 : false; } const wchar_t* ctype::do_is(const char_type* low, const char_type* high, mask* vec) const { for (; low != high; ++low, ++vec) - *vec = static_cast(isascii(*low) ? + *vec = static_cast(isbasic(*low) ? ctype::classic_table()[*low] : 0); return low; } @@ -878,7 +878,7 @@ ctype::do_scan_is(mask m, const char_type* low, const char_type* high) const { for (; low != high; ++low) - if (isascii(*low) && (ctype::classic_table()[*low] & m)) + if (isbasic(*low) && (ctype::classic_table()[*low] & m)) break; return low; } @@ -887,7 +887,7 @@ ctype::do_scan_not(mask m, const char_type* low, const char_type* high) const { for (; low != high; ++low) - if (!(isascii(*low) && (ctype::classic_table()[*low] & m))) + if (!(isbasic(*low) && (ctype::classic_table()[*low] & m))) break; return low; } @@ -896,12 +896,12 @@ ctype::do_toupper(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; + return isbasic(c) ? _DefaultRuneLocale.__mapupper[c] : c; #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ defined(__NetBSD__) || defined(__MVS__) - return isascii(c) ? ctype::__classic_upper_table()[c] : c; + return isbasic(c) ? ctype::__classic_upper_table()[c] : c; #else - return (isascii(c) && iswlower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'a'+L'A' : c; + return (isbasic(c) && iswlower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'a'+L'A' : c; #endif } @@ -910,13 +910,13 @@ { for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; + *low = isbasic(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ defined(__NetBSD__) || defined(__MVS__) - *low = isascii(*low) ? ctype::__classic_upper_table()[*low] + *low = isbasic(*low) ? ctype::__classic_upper_table()[*low] : *low; #else - *low = (isascii(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? (*low-L'a'+L'A') : *low; + *low = (isbasic(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? (*low-L'a'+L'A') : *low; #endif return low; } @@ -925,12 +925,12 @@ ctype::do_tolower(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; + return isbasic(c) ? _DefaultRuneLocale.__maplower[c] : c; #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ defined(__NetBSD__) || defined(__MVS__) - return isascii(c) ? ctype::__classic_lower_table()[c] : c; + return isbasic(c) ? ctype::__classic_lower_table()[c] : c; #else - return (isascii(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'A'+'a' : c; + return (isbasic(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-L'A'+'a' : c; #endif } @@ -939,13 +939,13 @@ { for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; + *low = isbasic(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || \ defined(__NetBSD__) || defined(__MVS__) - *low = isascii(*low) ? ctype::__classic_lower_table()[*low] + *low = isbasic(*low) ? ctype::__classic_lower_table()[*low] : *low; #else - *low = (isascii(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-L'A'+L'a' : *low; + *low = (isbasic(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-L'A'+L'a' : *low; #endif return low; } @@ -967,7 +967,7 @@ char ctype::do_narrow(char_type c, char dfault) const { - if (isascii(c)) + if (isbasic(c)) return static_cast(c); return dfault; } @@ -976,7 +976,7 @@ ctype::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const { for (; low != high; ++low, ++dest) - if (isascii(*low)) + if (isbasic(*low)) *dest = static_cast(*low); else *dest = dfault; @@ -1009,15 +1009,15 @@ ctype::do_toupper(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - return isascii(c) ? + return isbasic(c) ? static_cast(_DefaultRuneLocale.__mapupper[static_cast(c)]) : c; #elif defined(__NetBSD__) return static_cast(__classic_upper_table()[static_cast(c)]); #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__MVS__) - return isascii(c) ? + return isbasic(c) ? static_cast(__classic_upper_table()[static_cast(c)]) : c; #else - return (isascii(c) && islower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'a'+'A' : c; + return (isbasic(c) && islower_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'a'+'A' : c; #endif } @@ -1026,15 +1026,15 @@ { for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - *low = isascii(*low) ? + *low = isbasic(*low) ? static_cast(_DefaultRuneLocale.__mapupper[static_cast(*low)]) : *low; #elif defined(__NetBSD__) *low = static_cast(__classic_upper_table()[static_cast(*low)]); #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__MVS__) - *low = isascii(*low) ? + *low = isbasic(*low) ? static_cast(__classic_upper_table()[static_cast(*low)]) : *low; #else - *low = (isascii(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'a'+'A' : *low; + *low = (isbasic(*low) && islower_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'a'+'A' : *low; #endif return low; } @@ -1043,15 +1043,15 @@ ctype::do_tolower(char_type c) const { #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - return isascii(c) ? + return isbasic(c) ? static_cast(_DefaultRuneLocale.__maplower[static_cast(c)]) : c; #elif defined(__NetBSD__) return static_cast(__classic_lower_table()[static_cast(c)]); #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__MVS__) - return isascii(c) ? + return isbasic(c) ? static_cast(__classic_lower_table()[static_cast(c)]) : c; #else - return (isascii(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'A'+'a' : c; + return (isbasic(c) && isupper_l(c, _LIBCPP_GET_C_LOCALE)) ? c-'A'+'a' : c; #endif } @@ -1060,13 +1060,13 @@ { for (; low != high; ++low) #ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE - *low = isascii(*low) ? static_cast(_DefaultRuneLocale.__maplower[static_cast(*low)]) : *low; + *low = isbasic(*low) ? static_cast(_DefaultRuneLocale.__maplower[static_cast(*low)]) : *low; #elif defined(__NetBSD__) *low = static_cast(__classic_lower_table()[static_cast(*low)]); #elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__MVS__) - *low = isascii(*low) ? static_cast(__classic_lower_table()[static_cast(*low)]) : *low; + *low = isbasic(*low) ? static_cast(__classic_lower_table()[static_cast(*low)]) : *low; #else - *low = (isascii(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'A'+'a' : *low; + *low = (isbasic(*low) && isupper_l(*low, _LIBCPP_GET_C_LOCALE)) ? *low-'A'+'a' : *low; #endif return low; } @@ -1088,7 +1088,7 @@ char ctype::do_narrow(char_type c, char dfault) const { - if (isascii(c)) + if (isbasic(c)) return static_cast(c); return dfault; } @@ -1097,7 +1097,7 @@ ctype::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const { for (; low != high; ++low, ++dest) - if (isascii(*low)) + if (isbasic(*low)) *dest = *low; else *dest = dfault; @@ -1392,7 +1392,7 @@ { for (; low != high; ++low, ++vec) { - if (isascii(*low)) + if (isbasic(*low)) *vec = static_cast(ctype::classic_table()[*low]); else {