diff --git a/include/wchar.h b/include/wchar.h index 3ed992cc2467..4900c20cfa59 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -174,6 +174,9 @@ int vfwscanf(struct __sFILE * __restrict, const wchar_t * __restrict, int vswscanf(const wchar_t * __restrict, const wchar_t * __restrict, __va_list); int vwscanf(const wchar_t * __restrict, __va_list); +float wcstof(const wchar_t * __restrict, wchar_t ** __restrict); +long double + wcstold(const wchar_t * __restrict, wchar_t ** __restrict); #ifdef __LONG_LONG_SUPPORTED /* LONGLONG */ long long diff --git a/lib/libc/locale/Makefile.inc b/lib/libc/locale/Makefile.inc index 844c372b9d3b..911fea423c42 100644 --- a/lib/libc/locale/Makefile.inc +++ b/lib/libc/locale/Makefile.inc @@ -12,8 +12,8 @@ SRCS+= big5.c btowc.c collate.c collcmp.c euc.c fix_grouping.c frune.c \ mskanji.c nl_langinfo.c nomacros.c none.c rune.c \ runetype.c setinvalidrune.c setlocale.c setrunelocale.c table.c \ tolower.c toupper.c utf2.c utf8.c wcrtomb.c wcsrtombs.c wcsftime.c \ - wcstod.c \ - wcstoimax.c wcstol.c wcstoll.c \ + wcstof.c wcstod.c \ + wcstoimax.c wcstol.c wcstold.c wcstoll.c \ wcstombs.c \ wcstoul.c wcstoull.c wcstoumax.c wctob.c wctomb.c wctrans.c wctype.c \ wcwidth.c @@ -50,6 +50,7 @@ MLINKS+=rune.3 fgetrune.3 rune.3 fputrune.3 rune.3 fungetrune.3 \ rune.3 setinvalidrune.3 rune.3 setrunelocale.3 rune.3 sgetrune.3 \ rune.3 sputrune.3 MLINKS+=setlocale.3 localeconv.3 +MLINKS+=wcstod.3 wcstof.3 wcstod.3 wcstold.3 MLINKS+=wcstol.3 wcstoul.3 wcstol.3 wcstoll.3 wcstol.3 wcstoull.3 \ wcstol.3 wcstoimax.3 wcstol.3 wcstoumax.3 MLINKS+=wctrans.3 towctrans.3 diff --git a/lib/libc/locale/wcstod.3 b/lib/libc/locale/wcstod.3 index 970dd4bae5fa..6d4c94406b1f 100644 --- a/lib/libc/locale/wcstod.3 +++ b/lib/libc/locale/wcstod.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2002 Tim J. Robbins +.\" Copyright (c) 2002, 2003 Tim J. Robbins .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,31 +24,47 @@ .\" .\" $FreeBSD$ .\" -.Dd September 12, 2002 +.Dd February 22, 2003 .Dt WCSTOD 3 .Os .Sh NAME -.Nm wcstod -.Nd "convert string to double" +.Nm wcstof , +.Nm wcstod , +.Nm wcstold +.Nd "convert string to float, double or long double" .Sh LIBRARY .Lb libc .Sh SYNOPSIS .In wchar.h +.Ft float +.Fn wcstof "const wchar_t * restrict nptr" "wchar_t ** restrict endptr" +.Ft long double +.Fn wcstold "const wchar_t * restrict nptr" "wchar_t ** restrict endptr" .Ft double .Fn wcstod "const wchar_t * restrict nptr" "wchar_t ** restrict endptr" .Sh DESCRIPTION The +.Fn wcstof , .Fn wcstod -function is the wide-character version of the +and +.Fn wcstold +functions are the wide-character versions of the +.Fn strtof , .Fn strtod -function. +and +.Fn strtold +functios. Refer to .Xr strtod 3 for details. .Sh SEE ALSO -.Xr strtod 3 +.Xr strtod 3 , +.Xr wcstol 3 , .Sh STANDARDS The +.Fn wcstof , .Fn wcstod -function conforms to +and +.Fn wcstold +functions conform to .St -isoC-99 . diff --git a/lib/libc/locale/wcstof.c b/lib/libc/locale/wcstof.c new file mode 100644 index 000000000000..ebe392e91666 --- /dev/null +++ b/lib/libc/locale/wcstof.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2002, 2003 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +/* + * See wcstod() for comments as to the logic used. + */ +float +wcstof(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +{ + static const mbstate_t initial; + mbstate_t state; + float val; + char *buf, *end, *p; + const wchar_t *wcp; + size_t clen, len; + + while (iswspace(*nptr)) + nptr++; + + state = initial; + wcp = nptr; + if ((len = wcsrtombs(NULL, &wcp, 0, &state)) == (size_t)-1) { + if (endptr != NULL) + *endptr = (wchar_t *)nptr; + return (0.0); + } + if ((buf = malloc(len + 1)) == NULL) + return (0.0); + state = initial; + wcsrtombs(buf, &wcp, len + 1, &state); + + val = strtof(buf, &end); + + if (endptr != NULL) { +#if 1 /* Fast, assume 1:1 WC:MBS mapping. */ + *endptr = (wchar_t *)nptr + (end - buf); + (void)clen; + (void)p; +#else /* Slow, conservative approach. */ + state = initial; + *endptr = (wchar_t *)nptr; + p = buf; + while (p < end && + (clen = mbrlen(p, end - p, &state)) > 0) { + p += clen; + (*endptr)++; + } +#endif + } + + free(buf); + + return (val); +} diff --git a/lib/libc/locale/wcstold.c b/lib/libc/locale/wcstold.c new file mode 100644 index 000000000000..9dee722e1b42 --- /dev/null +++ b/lib/libc/locale/wcstold.c @@ -0,0 +1,84 @@ +/*- + * Copyright (c) 2002, 2003 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +/* + * See wcstod() for comments as to the logic used. + */ +long double +wcstold(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr) +{ + static const mbstate_t initial; + mbstate_t state; + long double val; + char *buf, *end, *p; + const wchar_t *wcp; + size_t clen, len; + + while (iswspace(*nptr)) + nptr++; + + state = initial; + wcp = nptr; + if ((len = wcsrtombs(NULL, &wcp, 0, &state)) == (size_t)-1) { + if (endptr != NULL) + *endptr = (wchar_t *)nptr; + return (0.0); + } + if ((buf = malloc(len + 1)) == NULL) + return (0.0); + state = initial; + wcsrtombs(buf, &wcp, len + 1, &state); + + val = strtold(buf, &end); + + if (endptr != NULL) { +#if 1 /* Fast, assume 1:1 WC:MBS mapping. */ + *endptr = (wchar_t *)nptr + (end - buf); + (void)clen; + (void)p; +#else /* Slow, conservative approach. */ + state = initial; + *endptr = (wchar_t *)nptr; + p = buf; + while (p < end && + (clen = mbrlen(p, end - p, &state)) > 0) { + p += clen; + (*endptr)++; + } +#endif + } + + free(buf); + + return (val); +}