diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-01-11 17:28:58 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-01-11 17:28:58 +0000 |
commit | 43b9d657408fbf47a47934f9e7c84ed87f7f5a18 (patch) | |
tree | d819c8eaa1541afbf358c47e6c8ce15855f21e17 /stdlib/strtod_l.c | |
parent | 66193697e06231f48dd36d78b68190aaa864cb63 (diff) | |
download | glibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.tar.gz glibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.tar.xz glibc-43b9d657408fbf47a47934f9e7c84ed87f7f5a18.zip |
[BZ #3855]
* stdlib/strtod_l.c (____STRTOF_INTERNAL): 0x. not followed by hexadecimal digit should accept just the initial 0. * stdlib/tst-strtod2.c (tests): New variable. (do_test): Run several tests rather than just one. 2007-01-11 Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'stdlib/strtod_l.c')
-rw-r--r-- | stdlib/strtod_l.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c index b4e4819c87..397fd7077e 100644 --- a/stdlib/strtod_l.c +++ b/stdlib/strtod_l.c @@ -1,5 +1,6 @@ /* Convert string representing a number to float value, using given locale. - Copyright (C) 1997,1998,2002,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1997,1998,2002,2004,2005,2006,2007 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -665,14 +666,23 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc) if (!((c >= L_('0') && c <= L_('9')) || (base == 16 && ((CHAR_TYPE) TOLOWER (c) >= L_('a') && (CHAR_TYPE) TOLOWER (c) <= L_('f'))) + || ( #ifdef USE_WIDE_CHAR - || c == (wint_t) decimal + c == (wint_t) decimal #else - || ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) - if (decimal[cnt] != cp[cnt]) - break; - decimal[cnt] == '\0'; }) + ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + if (decimal[cnt] != cp[cnt]) + break; + decimal[cnt] == '\0'; }) #endif + /* '0x.' alone is not a valid hexadecimal number. + '.' alone is not valid either, but that has been checked + already earlier. */ + && (base != 16 + || cp != start_of_digits + || (cp[decimal_len] >= L_('0') && cp[decimal_len] <= L_('9')) + || ((CHAR_TYPE) TOLOWER (cp[decimal_len]) >= L_('a') + && (CHAR_TYPE) TOLOWER (cp[decimal_len]) <= L_('f')))) || (base == 16 && (cp != start_of_digits && (CHAR_TYPE) TOLOWER (c) == L_('p'))) || (base != 16 && (CHAR_TYPE) TOLOWER (c) == L_('e')))) |