//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LIBCXX_TEST_SUPPORT_LOCALE_HELPERS_H #define LIBCXX_TEST_SUPPORT_LOCALE_HELPERS_H #include #include "platform_support.h" #include "test_macros.h" #include "make_string.h" #ifndef TEST_HAS_NO_WIDE_CHARACTERS #include #endif // TEST_HAS_NO_WIDE_CHARACTERS namespace LocaleHelpers { #ifndef TEST_HAS_NO_WIDE_CHARACTERS std::wstring convert_thousands_sep(std::wstring const& in, wchar_t sep) { std::wstring out; bool seen_num_start = false; bool seen_decimal = false; for (unsigned i = 0; i < in.size(); ++i) { seen_decimal |= in[i] == L','; seen_num_start |= in[i] == L'-' || std::iswdigit(in[i]); if (seen_decimal || !seen_num_start || in[i] != L' ') { out.push_back(in[i]); continue; } assert(in[i] == L' '); out.push_back(sep); } return out; } // GLIBC 2.27 and newer use U+202F NARROW NO-BREAK SPACE as a thousands separator. // This function converts the spaces in string inputs to U+202F if need // be. FreeBSD's locale data also uses U+202F, since 2018. // Windows uses U+00A0 NO-BREAK SPACE. std::wstring convert_thousands_sep_fr_FR(std::wstring const& in) { #if defined(_CS_GNU_LIBC_VERSION) if (glibc_version_less_than("2.27")) return in; else return convert_thousands_sep(in, L'\u202F'); #elif defined(__FreeBSD__) return convert_thousands_sep(in, L'\u202F'); #elif defined(_WIN32) return convert_thousands_sep(in, L'\u00A0'); #else return in; #endif } // GLIBC 2.27 uses U+202F NARROW NO-BREAK SPACE as a thousands separator. // FreeBSD, AIX and Windows use U+00A0 NO-BREAK SPACE. std::wstring convert_thousands_sep_ru_RU(std::wstring const& in) { #if defined(TEST_HAS_GLIBC) return convert_thousands_sep(in, L'\u202F'); # elif defined(__FreeBSD__) || defined(_WIN32) || defined(_AIX) return convert_thousands_sep(in, L'\u00A0'); # else return in; # endif } std::wstring negate_en_US(std::wstring s) { #if defined(_WIN32) return L"(" + s + L")"; #else return L"-" + s; #endif } #endif // TEST_HAS_NO_WIDE_CHARACTERS std::string negate_en_US(std::string s) { #if defined(_WIN32) return "(" + s + ")"; #else return "-" + s; #endif } MultiStringType currency_symbol_ru_RU() { #if defined(_CS_GNU_LIBC_VERSION) if (glibc_version_less_than("2.24")) return MKSTR("\u0440\u0443\u0431"); else return MKSTR("\u20BD"); // U+20BD RUBLE SIGN #elif defined(_WIN32) || defined(__FreeBSD__) || defined(_AIX) return MKSTR("\u20BD"); // U+20BD RUBLE SIGN #else return MKSTR("\u0440\u0443\u0431."); #endif } MultiStringType currency_symbol_zh_CN() { #if defined(_WIN32) return MKSTR("\u00A5"); // U+00A5 YEN SIGN #else return MKSTR("\uFFE5"); // U+FFE5 FULLWIDTH YEN SIGN #endif } } // namespace LocaleHelpers #endif // LIBCXX_TEST_SUPPORT_LOCALE_HELPERS_H