mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-09 21:00:06 +00:00
Remove legacy C locale wrapper
This commit is contained in:
parent
90325d0970
commit
afbcf1e8ea
@ -209,18 +209,6 @@ if (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
|||||||
${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*")
|
${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*")
|
||||||
endif ()
|
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)
|
function(add_headers VAR)
|
||||||
set(headers ${${VAR}})
|
set(headers ${${VAR}})
|
||||||
foreach (header ${ARGN})
|
foreach (header ${ARGN})
|
||||||
@ -244,10 +232,6 @@ endif ()
|
|||||||
add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst)
|
add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst)
|
||||||
add_library(fmt::fmt ALIAS fmt)
|
add_library(fmt::fmt ALIAS fmt)
|
||||||
|
|
||||||
if (HAVE_STRTOD_L)
|
|
||||||
target_compile_definitions(fmt PUBLIC FMT_LOCALE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (FMT_WERROR)
|
if (FMT_WERROR)
|
||||||
target_compile_options(fmt PRIVATE ${WERROR_FLAG})
|
target_compile_options(fmt PRIVATE ${WERROR_FLAG})
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -9,10 +9,8 @@
|
|||||||
#define FMT_OS_H_
|
#define FMT_OS_H_
|
||||||
|
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <clocale> // locale_t
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdlib> // strtod_l
|
|
||||||
#include <system_error> // std::system_error
|
#include <system_error> // std::system_error
|
||||||
|
|
||||||
#if defined __APPLE__ || defined(__FreeBSD__)
|
#if defined __APPLE__ || defined(__FreeBSD__)
|
||||||
@ -477,50 +475,6 @@ inline ostream output_file(cstring_view path, T... params) {
|
|||||||
}
|
}
|
||||||
#endif // FMT_USE_FCNTL
|
#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_MODULE_EXPORT_END
|
||||||
FMT_END_NAMESPACE
|
FMT_END_NAMESPACE
|
||||||
|
|
||||||
|
@ -128,9 +128,6 @@ if (NOT MSVC_STATIC_RUNTIME)
|
|||||||
if (FMT_PEDANTIC)
|
if (FMT_PEDANTIC)
|
||||||
target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
||||||
endif ()
|
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_test(NAME posix-mock-test COMMAND posix-mock-test)
|
||||||
add_fmt_test(os-test)
|
add_fmt_test(os-test)
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -457,84 +457,3 @@ TEST(scoped_mock, scope) {
|
|||||||
}
|
}
|
||||||
EXPECT_EQ(nullptr, test_mock::instance);
|
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<locale_mock> mock;
|
|
||||||
auto locale = reinterpret_cast<locale_type>(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<locale_mock> mock;
|
|
||||||
auto impl = reinterpret_cast<locale_type>(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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user