1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00
* 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>
This commit is contained in:
Ulrich Drepper
2007-01-11 17:28:58 +00:00
parent 66193697e0
commit 43b9d65740
3 changed files with 54 additions and 17 deletions

View File

@ -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'))))