diff --git a/include/spdlog/common-inl.h b/include/spdlog/common-inl.h index 378efe60..3632ec94 100644 --- a/include/spdlog/common-inl.h +++ b/include/spdlog/common-inl.h @@ -60,7 +60,7 @@ SPDLOG_INLINE spdlog_ex::spdlog_ex(std::string msg) SPDLOG_INLINE spdlog_ex::spdlog_ex(const std::string &msg, int last_errno) { memory_buf_t outbuf; - fmt::format_system_error(outbuf, last_errno, msg); + fmt::format_system_error(outbuf, last_errno, msg.c_str()); msg_ = fmt::to_string(outbuf); } diff --git a/src/fmt.cpp b/src/fmt.cpp index 9e91beb1..edd52dd5 100644 --- a/src/fmt.cpp +++ b/src/fmt.cpp @@ -10,94 +10,58 @@ #include + FMT_BEGIN_NAMESPACE namespace detail { -template -int format_float(char* buf, std::size_t size, const char* format, int precision, - T value) { -#ifdef FMT_FUZZ - if (precision > 100000) - throw std::runtime_error( - "fuzz mode - avoid large allocation inside snprintf"); -#endif - // Suppress the warning about nonliteral format string. - int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; - return precision < 0 ? snprintf_ptr(buf, size, format, value) - : snprintf_ptr(buf, size, format, precision, value); +template +int format_float(char *buf, std::size_t size, const char *format, int precision, T value) +{ +# ifdef FMT_FUZZ + if (precision > 100000) + throw std::runtime_error("fuzz mode - avoid large allocation inside snprintf"); +# endif + // Suppress the warning about nonliteral format string. + int (*snprintf_ptr)(char *, size_t, const char *, ...) = FMT_SNPRINTF; + return precision < 0 ? snprintf_ptr(buf, size, format, value) : snprintf_ptr(buf, size, format, precision, value); } -template FMT_API dragonbox::decimal_fp dragonbox::to_decimal(float x) - FMT_NOEXCEPT; -template FMT_API dragonbox::decimal_fp dragonbox::to_decimal(double x) - FMT_NOEXCEPT; - -// DEPRECATED! This function exists for ABI compatibility. -template -typename basic_format_context>, - Char>::iterator -vformat_to(buffer& buf, basic_string_view format_str, - basic_format_args>>, - type_identity_t>> - args) { - using iterator = std::back_insert_iterator>; - using context = basic_format_context< - std::back_insert_iterator>>, - type_identity_t>; - auto out = iterator(buf); - format_handler h(out, format_str, args, {}); - parse_format_string(format_str, h); - return out; -} -template basic_format_context>, - char>::iterator -vformat_to(buffer&, string_view, - basic_format_args>>, - type_identity_t>>); -} // namespace detail - -template struct FMT_INSTANTIATION_DEF_API detail::basic_data; +template FMT_API dragonbox::decimal_fp dragonbox::to_decimal(float x) FMT_NOEXCEPT; +template FMT_API dragonbox::decimal_fp dragonbox::to_decimal(double x) FMT_NOEXCEPT; +} // namespace detail // Workaround a bug in MSVC2013 that prevents instantiation of format_float. -int (*instantiate_format_float)(double, int, detail::float_specs, - detail::buffer&) = detail::format_float; +int (*instantiate_format_float)(double, int, detail::float_specs, detail::buffer &) = detail::format_float; -#ifndef FMT_STATIC_THOUSANDS_SEPARATOR -template FMT_API detail::locale_ref::locale_ref(const std::locale& loc); +# ifndef FMT_STATIC_THOUSANDS_SEPARATOR +template FMT_API detail::locale_ref::locale_ref(const std::locale &loc); template FMT_API std::locale detail::locale_ref::get() const; -#endif +# endif // Explicit instantiations for char. -template FMT_API std::string detail::grouping_impl(locale_ref); -template FMT_API char detail::thousands_sep_impl(locale_ref); +template FMT_API auto detail::thousands_sep_impl(locale_ref) -> thousands_sep_result; template FMT_API char detail::decimal_point_impl(locale_ref); -template FMT_API void detail::buffer::append(const char*, const char*); +template FMT_API void detail::buffer::append(const char *, const char *); template FMT_API void detail::vformat_to( - detail::buffer&, string_view, - basic_format_args, detail::locale_ref); - -template FMT_API int detail::snprintf_float(double, int, detail::float_specs, - detail::buffer&); -template FMT_API int detail::snprintf_float(long double, int, - detail::float_specs, - detail::buffer&); -template FMT_API int detail::format_float(double, int, detail::float_specs, - detail::buffer&); -template FMT_API int detail::format_float(long double, int, detail::float_specs, - detail::buffer&); + detail::buffer &, string_view, basic_format_args, detail::locale_ref); + +template FMT_API int detail::snprintf_float(double, int, detail::float_specs, detail::buffer &); +template FMT_API int detail::snprintf_float(long double, int, detail::float_specs, detail::buffer &); +template FMT_API int detail::format_float(double, int, detail::float_specs, detail::buffer &); +template FMT_API int detail::format_float(long double, int, detail::float_specs, detail::buffer &); // Explicit instantiations for wchar_t. -template FMT_API std::string detail::grouping_impl(locale_ref); -template FMT_API wchar_t detail::thousands_sep_impl(locale_ref); +template FMT_API auto detail::thousands_sep_impl(locale_ref) -> thousands_sep_result; template FMT_API wchar_t detail::decimal_point_impl(locale_ref); -template FMT_API void detail::buffer::append(const wchar_t*, - const wchar_t*); +template FMT_API void detail::buffer::append(const wchar_t *, const wchar_t *); + +template struct detail::basic_data; + FMT_END_NAMESPACE + #endif // !SPDLOG_FMT_EXTERNAL