mirror of
https://github.com/fish-shell/fish-shell.git
synced 2025-01-20 23:58:45 +08:00
Revert "Extend the fast path of fish_wcstod"
This breaks in comma-using locales (like my own de_DE.UTF-8), because
it still uses the locale-dependent strtod, which will then refuse to
read
1234.567
Using strtod_l (not in POSIX, I think?) might help, but might also be
a lot slower. Let's revert this for now and figure out if that is
workable.
This reverts commit fba86fb821
.
This commit is contained in:
parent
fba86fb821
commit
bf1fd733d0
|
@ -711,13 +711,14 @@ unsigned long long fish_wcstoull(const wchar_t *str, const wchar_t **endptr, int
|
|||
/// Like wcstod(), but wcstod() is enormously expensive on some platforms so this tries to have a
|
||||
/// fast path.
|
||||
double fish_wcstod(const wchar_t *str, wchar_t **endptr) {
|
||||
// The "fast path." If we're all ASCII, use strtod().
|
||||
// The "fast path." If we're all ASCII and we fit inline, use strtod().
|
||||
char narrow[128];
|
||||
size_t len = std::wcslen(str);
|
||||
size_t len_plus_0 = 1 + len;
|
||||
auto is_ascii = [](wchar_t c) { return 0 <= c && c <= 127; };
|
||||
if (len_plus_0 <= sizeof narrow && std::all_of(str, str + len, is_ascii)) {
|
||||
auto is_digit = [](wchar_t c) { return '0' <= c && c <= '9'; };
|
||||
if (len_plus_0 <= sizeof narrow && std::all_of(str, str + len, is_digit)) {
|
||||
// Fast path. Copy the string into a local buffer and run strtod() on it.
|
||||
// We can ignore the locale-taking version because we are limited to ASCII digits.
|
||||
std::copy(str, str + len_plus_0, narrow);
|
||||
char *narrow_endptr = nullptr;
|
||||
double ret = strtod(narrow, endptr ? &narrow_endptr : nullptr);
|
||||
|
|
Loading…
Reference in New Issue
Block a user