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
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.