From afbcf1e8eafc5d7f27e29c7397f22521eaa33fac Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sat, 5 Feb 2022 12:30:03 -0800 Subject: [PATCH] Remove legacy C locale wrapper --- CMakeLists.txt | 16 -------- include/fmt/os.h | 46 ----------------------- test/CMakeLists.txt | 3 -- test/posix-mock-test.cc | 81 ----------------------------------------- 4 files changed, 146 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44195abd..e5ba5216 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,18 +209,6 @@ if (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio") ${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*") endif () -set(strtod_l_headers stdlib.h) -if (APPLE) - set(strtod_l_headers ${strtod_l_headers} xlocale.h) -endif () - -include(CheckSymbolExists) -if (WIN32) - check_symbol_exists(_strtod_l "${strtod_l_headers}" HAVE_STRTOD_L) -else () - check_symbol_exists(strtod_l "${strtod_l_headers}" HAVE_STRTOD_L) -endif () - function(add_headers VAR) set(headers ${${VAR}}) foreach (header ${ARGN}) @@ -244,10 +232,6 @@ endif () add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst) add_library(fmt::fmt ALIAS fmt) -if (HAVE_STRTOD_L) - target_compile_definitions(fmt PUBLIC FMT_LOCALE) -endif () - if (FMT_WERROR) target_compile_options(fmt PRIVATE ${WERROR_FLAG}) endif () diff --git a/include/fmt/os.h b/include/fmt/os.h index 70cd26bf..f3584cc2 100644 --- a/include/fmt/os.h +++ b/include/fmt/os.h @@ -9,10 +9,8 @@ #define FMT_OS_H_ #include -#include // locale_t #include #include -#include // strtod_l #include // std::system_error #if defined __APPLE__ || defined(__FreeBSD__) @@ -477,50 +475,6 @@ inline ostream output_file(cstring_view path, T... params) { } #endif // FMT_USE_FCNTL -#ifdef FMT_LOCALE -// A "C" numeric locale. -class locale { - private: -# ifdef _WIN32 - using locale_t = _locale_t; - - static void freelocale(locale_t loc) { _free_locale(loc); } - - static double strtod_l(const char* nptr, char** endptr, _locale_t loc) { - return _strtod_l(nptr, endptr, loc); - } -# endif - - locale_t locale_; - - public: - using type = locale_t; - locale(const locale&) = delete; - void operator=(const locale&) = delete; - - locale() { -# ifndef _WIN32 - locale_ = FMT_SYSTEM(newlocale(LC_NUMERIC_MASK, "C", nullptr)); -# else - locale_ = _create_locale(LC_NUMERIC, "C"); -# endif - if (!locale_) FMT_THROW(system_error(errno, "cannot create locale")); - } - ~locale() { freelocale(locale_); } - - type get() const { return locale_; } - - // Converts string to floating-point number and advances str past the end - // of the parsed input. - FMT_DEPRECATED double strtod(const char*& str) const { - char* end = nullptr; - double result = strtod_l(str, &end, locale_); - str = end; - return result; - } -}; -using Locale FMT_DEPRECATED_ALIAS = locale; -#endif // FMT_LOCALE FMT_MODULE_EXPORT_END FMT_END_NAMESPACE diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7ed8d5f7..d8a661c1 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -128,9 +128,6 @@ if (NOT MSVC_STATIC_RUNTIME) if (FMT_PEDANTIC) target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS}) endif () - if (HAVE_STRTOD_L) - target_compile_definitions(posix-mock-test PRIVATE FMT_LOCALE) - endif () add_test(NAME posix-mock-test COMMAND posix-mock-test) add_fmt_test(os-test) endif () diff --git a/test/posix-mock-test.cc b/test/posix-mock-test.cc index 255e216c..8a2214e8 100644 --- a/test/posix-mock-test.cc +++ b/test/posix-mock-test.cc @@ -457,84 +457,3 @@ TEST(scoped_mock, scope) { } EXPECT_EQ(nullptr, test_mock::instance); } - -#ifdef FMT_LOCALE - -using locale_type = fmt::locale::type; - -struct locale_mock { - static locale_mock* instance; - MOCK_METHOD3(newlocale, locale_type(int category_mask, const char* locale, - locale_type base)); - MOCK_METHOD1(freelocale, void(locale_type locale)); -} * locale_mock::instance; - -# ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4273) -# ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Winconsistent-dllimport" -# endif - -_locale_t _create_locale(int category, const char* locale) { - return locale_mock::instance->newlocale(category, locale, 0); -} - -void _free_locale(_locale_t locale) { - locale_mock::instance->freelocale(locale); -} -# ifdef __clang__ -# pragma clang diagnostic pop -# endif -# pragma warning(pop) -# endif - -# if defined(__THROW) && \ - ((FMT_GCC_VERSION > 0 && FMT_GCC_VERSION <= 408) || defined(__e2k__)) -# define FMT_LOCALE_THROW __THROW -# else -# define FMT_LOCALE_THROW -# endif - -# if defined(__APPLE__) || \ - (defined(__FreeBSD__) && __FreeBSD_version < 1200002) -typedef int FreeLocaleResult; -# else -typedef void FreeLocaleResult; -# endif - -FreeLocaleResult freelocale(locale_type locale) FMT_LOCALE_THROW { - locale_mock::instance->freelocale(locale); - return FreeLocaleResult(); -} - -# undef FMT_LOCALE_THROW - -# ifndef _WIN32 -locale_t test::newlocale(int category_mask, const char* locale, locale_t base) { - return locale_mock::instance->newlocale(category_mask, locale, base); -} - -TEST(locale_test, locale_mock) { - scoped_mock mock; - auto locale = reinterpret_cast(11); - EXPECT_CALL(mock, newlocale(222, StrEq("foo"), locale)); - FMT_SYSTEM(newlocale(222, "foo", locale)); -} -# endif - -TEST(locale_test, locale) { -# ifndef LC_NUMERIC_MASK - enum { LC_NUMERIC_MASK = LC_NUMERIC }; -# endif - scoped_mock mock; - auto impl = reinterpret_cast(42); - EXPECT_CALL(mock, newlocale(LC_NUMERIC_MASK, StrEq("C"), nullptr)) - .WillOnce(Return(impl)); - EXPECT_CALL(mock, freelocale(impl)); - fmt::locale loc; - EXPECT_EQ(impl, loc.get()); -} - -#endif // FMT_LOCALE