X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/c957a83bde4df2e2d3d1ed0963656856b48ef0a0..224c70764cab4e0e39a26aaf3ad3016552f62f55:/locale/FreeBSD/wcstod.c.patch diff --git a/locale/FreeBSD/wcstod.c.patch b/locale/FreeBSD/wcstod.c.patch index 3fdc36e..3868d1d 100644 --- a/locale/FreeBSD/wcstod.c.patch +++ b/locale/FreeBSD/wcstod.c.patch @@ -1,6 +1,6 @@ ---- wcstod.c.orig Thu Nov 25 11:38:20 2004 -+++ wcstod.c Fri Feb 18 14:45:42 2005 -@@ -27,6 +27,8 @@ +--- wcstod.c.orig 2007-03-16 01:15:20.000000000 -0700 ++++ wcstod.c 2007-03-16 03:03:41.000000000 -0700 +@@ -27,9 +27,12 @@ #include __FBSDID("$FreeBSD: src/lib/libc/locale/wcstod.c,v 1.4 2004/04/07 09:47:56 tjr Exp $"); @@ -9,7 +9,11 @@ #include #include #include -@@ -41,7 +43,8 @@ ++#include <_simple.h> + + /* + * Convert a string to a double-precision number. +@@ -41,42 +44,43 @@ * for at least the digits, radix character and letters. */ double @@ -19,46 +23,78 @@ { static const mbstate_t initial; mbstate_t mbs; -@@ -50,7 +53,8 @@ - const wchar_t *wcp; + double val; + char *buf, *end; +- const wchar_t *wcp; size_t len; ++ locale_t ctype; ++ _SIMPLE_STRING b; ++ char mb[MB_CUR_MAX + 1]; ++ const wchar_t *nptr0 = nptr; ++ const wchar_t *first; - while (iswspace(*nptr)) + NORMALIZE_LOCALE(loc); -+ while (iswspace_l(*nptr, loc)) ++ ctype = __numeric_ctype(loc); ++ ++ while (iswspace_l(*nptr, ctype)) nptr++; - /* -@@ -65,7 +69,7 @@ - */ - wcp = nptr; - mbs = initial; +- /* +- * Convert the supplied numeric wide char. string to multibyte. +- * +- * We could attempt to find the end of the numeric portion of the +- * wide char. string to avoid converting unneeded characters but +- * choose not to bother; optimising the uncommon case where +- * the input string contains a lot of text after the number +- * duplicates a lot of strtod()'s functionality and slows down the +- * most common cases. +- */ +- wcp = nptr; +- mbs = initial; - if ((len = wcsrtombs(NULL, &wcp, 0, &mbs)) == (size_t)-1) { -+ if ((len = wcsrtombs_l(NULL, &wcp, 0, &mbs, loc)) == (size_t)-1) { - if (endptr != NULL) - *endptr = (wchar_t *)nptr; - return (0.0); -@@ -73,10 +77,10 @@ - if ((buf = malloc(len + 1)) == NULL) +- if (endptr != NULL) +- *endptr = (wchar_t *)nptr; +- return (0.0); +- } +- if ((buf = malloc(len + 1)) == NULL) ++ if ((b = _simple_salloc()) == NULL) return (0.0); ++ ++ first = nptr; mbs = initial; - wcsrtombs(buf, &wcp, len + 1, &mbs); -+ wcsrtombs_l(buf, &wcp, len + 1, &mbs, loc); ++ while (*nptr && (len = wcrtomb_l(mb, *nptr, &mbs, ctype)) != (size_t)-1) { ++ mb[len] = 0; ++ if (_simple_sappend(b, mb) < 0) { /* no memory */ ++ _simple_sfree(b); ++ return (0.0); ++ } ++ nptr++; ++ } /* Let strtod() do most of the work for us. */ - val = strtod(buf, &end); ++ buf = _simple_string(b); + val = strtod_l(buf, &end, loc); /* * We only know where the number ended in the _multibyte_ -@@ -91,4 +95,10 @@ - free(buf); +@@ -86,9 +90,15 @@ + */ + if (endptr != NULL) + /* XXX Assume each wide char is one byte. */ +- *endptr = (wchar_t *)nptr + (end - buf); ++ *endptr = (end == buf) ? (wchar_t *)nptr0 : ((wchar_t *)first + (end - buf)); + +- free(buf); ++ _simple_sfree(b); return (val); -+} + } + +double +wcstod(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +{ + return wcstod_l(nptr, endptr, __current_locale()); - } ++}