X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/3d9156a7a519a5e3aa1b92e9d9d4b991f1aed7ff..974e388456677d82eb6d10d4fd72390641a5bdfe:/locale/FreeBSD/wcstold.c diff --git a/locale/FreeBSD/wcstold.c b/locale/FreeBSD/wcstold.c index c50ffbd..45222d8 100644 --- a/locale/FreeBSD/wcstold.c +++ b/locale/FreeBSD/wcstold.c @@ -27,44 +27,67 @@ #include __FBSDID("$FreeBSD: src/lib/libc/locale/wcstold.c,v 1.4 2004/04/07 09:47:56 tjr Exp $"); +#include "xlocale_private.h" + #include #include #include +#include <_simple.h> /* * See wcstod() for comments as to the logic used. */ + +extern size_t __wcs_end_offset(const char * __restrict buf, const char * __restrict end, locale_t loc); + long double -wcstold(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +wcstold_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, + locale_t loc) { static const mbstate_t initial; mbstate_t mbs; long 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); + ctype = __numeric_ctype(loc); + + while (iswspace_l(*nptr, ctype)) nptr++; - wcp = nptr; - mbs = initial; - if ((len = wcsrtombs(NULL, &wcp, 0, &mbs)) == (size_t)-1) { - 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); + 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++; + } - val = strtold(buf, &end); + buf = _simple_string(b); + val = strtold_l(buf, &end, loc); if (endptr != NULL) - *endptr = (wchar_t *)nptr + (end - buf); + *endptr = (end == buf) ? (wchar_t *)nptr0 : ((wchar_t *)first + __wcs_end_offset(buf, end, loc)); - free(buf); + _simple_sfree(b); return (val); } + +long double +wcstold(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +{ + return wcstold_l(nptr, endptr, __current_locale()); +}