diff --git a/include/chaiscript/chaiscript_defines.hpp b/include/chaiscript/chaiscript_defines.hpp index 8ff2a7a7..16291675 100644 --- a/include/chaiscript/chaiscript_defines.hpp +++ b/include/chaiscript/chaiscript_defines.hpp @@ -72,6 +72,16 @@ static_assert(_MSC_FULL_VER >= 190024210, "Visual C++ 2015 Update 3 or later req #include #include #include +#include + +// libc++ (AppleClang, Emscripten) may not support floating-point std::from_chars +#if !defined(CHAISCRIPT_LIBCPP) +#define CHAISCRIPT_HAS_FLOAT_FROM_CHARS 1 +#endif + +#ifndef CHAISCRIPT_HAS_FLOAT_FROM_CHARS +#include +#endif namespace chaiscript { constexpr static const int version_major = 7; @@ -125,7 +135,22 @@ namespace chaiscript { template [[nodiscard]] auto parse_num(const std::string_view t_str) { T t{}; - std::from_chars(t_str.data(), t_str.data() + t_str.size(), t); + if constexpr (std::is_floating_point_v) { +#ifdef CHAISCRIPT_HAS_FLOAT_FROM_CHARS + std::from_chars(t_str.data(), t_str.data() + t_str.size(), t); +#else + const std::string tmp(t_str); + if constexpr (std::is_same_v) { + t = std::strtof(tmp.c_str(), nullptr); + } else if constexpr (std::is_same_v) { + t = std::strtold(tmp.c_str(), nullptr); + } else { + t = std::strtod(tmp.c_str(), nullptr); + } +#endif + } else { + std::from_chars(t_str.data(), t_str.data() + t_str.size(), t); + } return t; } diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index bbdc67f8..2385472d 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -10,8 +10,6 @@ #ifndef CHAISCRIPT_BOOTSTRAP_HPP_ #define CHAISCRIPT_BOOTSTRAP_HPP_ -#include - #include "../utility/utility.hpp" #include "register_function.hpp" @@ -98,9 +96,7 @@ namespace chaiscript::bootstrap { if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) { throw std::runtime_error("Parsing of wide characters is not yet supported"); } else if constexpr (std::is_arithmetic_v && !std::is_same_v) { - Input t{}; - std::from_chars(i.data(), i.data() + i.size(), t); - return t; + return parse_num(i); } else { std::stringstream ss(i); Input t; diff --git a/include/chaiscript/utility/json.hpp b/include/chaiscript/utility/json.hpp index 2c37f330..6b6dcd92 100644 --- a/include/chaiscript/utility/json.hpp +++ b/include/chaiscript/utility/json.hpp @@ -8,7 +8,6 @@ #include "../chaiscript_defines.hpp" #include "quick_flat_map.hpp" #include -#include #include #include #include @@ -536,14 +535,11 @@ namespace chaiscript::json { const auto *const first = str.data() + start; const auto *const last = str.data() + offset; + const auto numstr = std::string_view(first, static_cast(last - first)); if (isDouble) { - double val = 0; - std::from_chars(first, last, val); - return JSON(val); + return JSON(chaiscript::parse_num(numstr)); } else { - std::int64_t val = 0; - std::from_chars(first, last, val); - return JSON(val); + return JSON(chaiscript::parse_num(numstr)); } }