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
ab85003bf5
commit
03b716c4bd
@ -144,6 +144,7 @@ size_t wcsrtombs(char * __restrict, const wchar_t ** __restrict, size_t,
|
||||
size_t wcsspn(const wchar_t *, const wchar_t *);
|
||||
wchar_t *wcsstr(const wchar_t * __restrict, const wchar_t * __restrict);
|
||||
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 ** __restrict);
|
||||
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 \
|
||||
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 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 \
|
||||
wcstoul.c wctob.c wctomb.c wctrans.c wctype.c wcwidth.c
|
||||
|
||||
@ -25,7 +26,7 @@ MAN+= btowc.3 \
|
||||
rune.3 \
|
||||
setlocale.3 toascii.3 tolower.3 toupper.3 towlower.3 wcsftime.3 \
|
||||
wcrtomb.3 \
|
||||
wcsrtombs.3 wcstol.3 \
|
||||
wcsrtombs.3 wcstod.3 wcstol.3 \
|
||||
wctrans.3 wctype.3 wcwidth.3
|
||||
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…
Reference in New Issue
Block a user