AppleClang's libc++ does not support std::from_chars for floating-point
types. Add a compile-time detection macro (CHAISCRIPT_HAS_FLOAT_FROM_CHARS)
and fall back to strtod/strtof/strtold on libc++ platforms. Centralize the
fallback in parse_num and route bootstrap.hpp and json.hpp through it to
keep the workaround in one place.
Requested by @lefticus in PR #669 review.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- buildInt: parse once as unsigned long long (input is never negative),
strip suffixes with remove_suffix, eliminate two-pass fallback path
- json.hpp parse_number: scan number boundaries in-place, call from_chars
directly on the string range — no intermediate strings or std::pow
- parse_num: remove dead integral overload, collapse to single template
- Remove unused <cmath> includes from both files
Requested by @lefticus in PR #669 review.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The custom parse_num floating-point implementation produced slightly
different results from the C++ compiler's own literal parsing (e.g.
1.1e-4 was off by a few ULPs). Replace it with std::from_chars which
is locale-independent and matches compiler precision exactly. Also
migrate integer parsing in buildInt from std::stoll/stoull to
std::from_chars, fix the JSON number parser to pass the full numeric
string to from_chars instead of splitting mantissa/exponent and using
std::pow, and update parse_string to use from_chars for arithmetic types.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Convert \u escape sequences to proper UTF-8 characters instead of
passing through the literal \u notation. Supports the full BMP range
with correct 1, 2, 3, and 4-byte UTF-8 encoding.
Based on PR #483 by @olikraus, rebased onto current develop.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
I initially tried to use the existing .clang-format file,
but it does not match the code style (at least with clang-format 11)
and the formatting is not consistent across files.
Therefore, I decided to rewrite the .clang-format with some personal
preferences.
Used command
find . -iname "*.hpp" -o -iname "*.cpp" | xargs clang-format -i -style=file
- fix issue #399.
- make to_json() with an empty Map, Vector or Dynamic_Object return a
similar/compatible type (JSON object or array), rather than "null".
- include the fix for #381 (to_json() support for null values), so
that can also be unit tested.
Linux compilers interpret "long" as 64 bit, Visual Studio on Windows interprets "long" as 32 bit. In order to remove ambiguity, from_json should use int64_t rather than long when parsing integers.
This modifies no logic, it simply adds the keyword `noexcept`
I believe this is 100% correct. It calls methods that are not
guaranteed to be `noexcept`, such as `operator[]` but have
no logically way of throwing.