Add wcstod() as a wrapper around strtod(). It does not handle any characters
that strtod() does not (alternate digit characters, etc. are not handled).
This commit is contained in:
parent
958421a4ec
commit
8569d04e14
@ -144,6 +144,7 @@ size_t wcsrtombs(char * __restrict, const wchar_t ** __restrict, size_t,
|
|||||||
size_t wcsspn(const wchar_t *, const wchar_t *);
|
size_t wcsspn(const wchar_t *, const wchar_t *);
|
||||||
wchar_t *wcsstr(const wchar_t * __restrict, const wchar_t * __restrict);
|
wchar_t *wcsstr(const wchar_t * __restrict, const wchar_t * __restrict);
|
||||||
int wctob(wint_t);
|
int wctob(wint_t);
|
||||||
|
double wcstod(const wchar_t * __restrict, wchar_t ** __restrict);
|
||||||
wchar_t *wcstok(wchar_t * __restrict, const wchar_t * __restrict,
|
wchar_t *wcstok(wchar_t * __restrict, const wchar_t * __restrict,
|
||||||
wchar_t ** __restrict);
|
wchar_t ** __restrict);
|
||||||
long wcstol(const wchar_t * __restrict, wchar_t ** __restrict, int);
|
long wcstol(const wchar_t * __restrict, wchar_t ** __restrict, int);
|
||||||
|
@ -11,7 +11,8 @@ SRCS+= big5.c btowc.c collate.c collcmp.c euc.c fix_grouping.c frune.c \
|
|||||||
mbrtowc.c mbrune.c mbsinit.c mbsrtowcs.c mbtowc.c mbstowcs.c \
|
mbrtowc.c mbrune.c mbsinit.c mbsrtowcs.c mbtowc.c mbstowcs.c \
|
||||||
mskanji.c nl_langinfo.c nomacros.c none.c rune.c \
|
mskanji.c nl_langinfo.c nomacros.c none.c rune.c \
|
||||||
runetype.c setinvalidrune.c setlocale.c setrunelocale.c table.c \
|
runetype.c setinvalidrune.c setlocale.c setrunelocale.c table.c \
|
||||||
tolower.c toupper.c utf2.c wcrtomb.c wcsrtombs.c wcsftime.c wcstol.c \
|
tolower.c toupper.c utf2.c wcrtomb.c wcsrtombs.c wcsftime.c wcstod.c \
|
||||||
|
wcstol.c \
|
||||||
wcstombs.c \
|
wcstombs.c \
|
||||||
wcstoul.c wctob.c wctomb.c wctrans.c wctype.c wcwidth.c
|
wcstoul.c wctob.c wctomb.c wctrans.c wctype.c wcwidth.c
|
||||||
|
|
||||||
@ -25,7 +26,7 @@ MAN+= btowc.3 \
|
|||||||
rune.3 \
|
rune.3 \
|
||||||
setlocale.3 toascii.3 tolower.3 toupper.3 towlower.3 wcsftime.3 \
|
setlocale.3 toascii.3 tolower.3 toupper.3 towlower.3 wcsftime.3 \
|
||||||
wcrtomb.3 \
|
wcrtomb.3 \
|
||||||
wcsrtombs.3 wcstol.3 \
|
wcsrtombs.3 wcstod.3 wcstol.3 \
|
||||||
wctrans.3 wctype.3 wcwidth.3
|
wctrans.3 wctype.3 wcwidth.3
|
||||||
MAN+= euc.4 utf2.4
|
MAN+= euc.4 utf2.4
|
||||||
|
|
||||||
|
54
lib/libc/locale/wcstod.3
Normal file
54
lib/libc/locale/wcstod.3
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
.\" Copyright (c) 2002 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.
|
||||||
|
.\"
|
||||||
|
.\" $FreeBSD$
|
||||||
|
.\"
|
||||||
|
.Dd September 12, 2002
|
||||||
|
.Dt WCSTOD 3
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm wcstod
|
||||||
|
.Nd "convert string to double"
|
||||||
|
.Sh LIBRARY
|
||||||
|
.Lb libc
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.In wchar.h
|
||||||
|
.Ft double
|
||||||
|
.Fn wcstod "const wchar_t * restrict nptr" "wchar_t ** restrict endptr"
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Fn wcstod
|
||||||
|
function is the wide-character version of the
|
||||||
|
.Fn strtod
|
||||||
|
function.
|
||||||
|
Refer to
|
||||||
|
.Xr strtod 3
|
||||||
|
for details.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr strtod 3
|
||||||
|
.Sh STANDARDS
|
||||||
|
The
|
||||||
|
.Fn wcstod
|
||||||
|
function conform to
|
||||||
|
.St -isoC-99 .
|
105
lib/libc/locale/wcstod.c
Normal file
105
lib/libc/locale/wcstod.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2002 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 <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert a string to a double-precision number.
|
||||||
|
*
|
||||||
|
* This is the wide-character counterpart of strtod(). So that we do not
|
||||||
|
* have to duplicate the code of strtod() here, we convert the supplied
|
||||||
|
* wide character string to multibyte and call strtod() on the result.
|
||||||
|
* This assumes that the multibyte encoding is compatible with ASCII
|
||||||
|
* for at least the digits, radix character and letters.
|
||||||
|
*/
|
||||||
|
double
|
||||||
|
wcstod(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr)
|
||||||
|
{
|
||||||
|
static const mbstate_t initial;
|
||||||
|
mbstate_t state;
|
||||||
|
double val;
|
||||||
|
char *buf, *end;
|
||||||
|
const wchar_t *wcp;
|
||||||
|
size_t clen, len;
|
||||||
|
|
||||||
|
while (iswspace(*nptr))
|
||||||
|
nptr++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* Let strtod() do most of the work for us. */
|
||||||
|
val = strtod(buf, &end);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We only know where the number ended in the _multibyte_
|
||||||
|
* representation of the string. If the caller wants to know
|
||||||
|
* where it ended, count multibyte characters to find the
|
||||||
|
* corresponding position in the wide char string.
|
||||||
|
*/
|
||||||
|
if (endptr != NULL) {
|
||||||
|
#if 1 /* Fast, assume 1:1 WC:MBS mapping. */
|
||||||
|
*endptr = (wchar_t *)nptr + (end - buf);
|
||||||
|
(void)clen;
|
||||||
|
#else /* Slow, conservative approach. */
|
||||||
|
state = initial;
|
||||||
|
*endptr = (wchar_t *)nptr;
|
||||||
|
while (buf < end &&
|
||||||
|
(clen = mbrlen(buf, end - buf, &state)) > 0) {
|
||||||
|
buf += clen;
|
||||||
|
(*endptr)++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user