* stdlib/strtod_l.c (____STRTOF_INTERNAL): Optimize use of TOLOWER.

This commit is contained in:
Ulrich Drepper 2007-02-21 21:54:19 +00:00
parent cdfd61e1ee
commit 9cf147d84e
2 changed files with 22 additions and 14 deletions

View File

@ -1,5 +1,7 @@
2007-02-21 Ulrich Drepper <drepper@redhat.com>
* stdlib/strtod_l.c (____STRTOF_INTERNAL): Optimize use of TOLOWER.
[BZ #3325]
* sysdeps/i386/fpu/e_fmodf.S: Revert last changes, keep using fprem.
* sysdeps/i386/fpu/e_fmodl.c: Likewise.

View File

@ -563,7 +563,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
else if (c < L_('0') || c > L_('9'))
{
/* Check for `INF' or `INFINITY'. */
if (TOLOWER_C (c) == L_('i') && STRNCASECMP (cp, L_("inf"), 3) == 0)
CHAR_TYPE lowc = TOLOWER_C (c);
if (lowc == L_('i') && STRNCASECMP (cp, L_("inf"), 3) == 0)
{
/* Return +/- infinity. */
if (endptr != NULL)
@ -574,7 +576,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
}
if (TOLOWER_C (c) == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0)
if (lowc == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0)
{
/* Return NaN. */
FLOAT retval = NAN;
@ -588,7 +590,8 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
do
++cp;
while ((*cp >= L_('0') && *cp <= L_('9'))
|| (TOLOWER (*cp) >= L_('a') && TOLOWER (*cp) <= L_('z'))
|| ({ CHAR_TYPE lo = TOLOWER (*cp);
lo >= L_('a') && lo <= L_('z'); })
|| *cp == L_('_'));
if (*cp != L_(')'))
@ -664,9 +667,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
/* If no other digit but a '0' is found the result is 0.0.
Return current read pointer. */
CHAR_TYPE lowc = TOLOWER (c);
if (!((c >= L_('0') && c <= L_('9'))
|| (base == 16 && ((CHAR_TYPE) TOLOWER (c) >= L_('a')
&& (CHAR_TYPE) TOLOWER (c) <= L_('f')))
|| (base == 16 && lowc >= L_('a') && lowc <= L_('f'))
|| (
#ifdef USE_WIDE_CHAR
c == (wint_t) decimal
@ -682,11 +685,11 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
&& (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'))))
|| ({ CHAR_TYPE lo = TOLOWER (cp[decimal_len]);
lo >= L_('a') && lo <= L_('f'); })))
|| (base == 16 && (cp != start_of_digits
&& (CHAR_TYPE) TOLOWER (c) == L_('p')))
|| (base != 16 && (CHAR_TYPE) TOLOWER (c) == L_('e'))))
&& lowc == L_('p')))
|| (base != 16 && lowc == L_('e'))))
{
#ifdef USE_WIDE_CHAR
tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
@ -707,8 +710,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
while (1)
{
if ((c >= L_('0') && c <= L_('9'))
|| (base == 16 && (wint_t) TOLOWER (c) >= L_('a')
&& (wint_t) TOLOWER (c) <= L_('f')))
|| (base == 16
&& ({ CHAR_TYPE lo = TOLOWER (c);
lo >= L_('a') && lo <= L_('f'); })))
++dig_no;
else
{
@ -794,7 +798,8 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
cp += decimal_len;
c = *cp;
while ((c >= L_('0') && c <= L_('9')) ||
(base == 16 && TOLOWER (c) >= L_('a') && TOLOWER (c) <= L_('f')))
(base == 16 && ({ CHAR_TYPE lo = TOLOWER (c);
lo >= L_('a') && lo <= L_('f'); })))
{
if (c != L_('0') && lead_zero == -1)
lead_zero = dig_no - int_no;
@ -807,8 +812,9 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
expp = cp;
/* Read exponent. */
if ((base == 16 && TOLOWER (c) == L_('p'))
|| (base != 16 && TOLOWER (c) == L_('e')))
lowc = TOLOWER (c);
if ((base == 16 && lowc == L_('p'))
|| (base != 16 && lowc == L_('e')))
{
int exp_negative = 0;