summaryrefslogtreecommitdiff
path: root/stdlib/strtod_l.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/strtod_l.c')
-rw-r--r--stdlib/strtod_l.c57
1 files changed, 32 insertions, 25 deletions
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index bb7493bff0..4033e3bef8 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -482,7 +482,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
struct locale_data *current = loc->__locales[LC_NUMERIC];
- if (group)
+ if (__builtin_expect (group, 0))
{
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
if (*grouping <= 0 || *grouping == CHAR_MAX)
@@ -548,7 +548,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
&& (wint_t) cp[1] >= L'0' && (wint_t) cp[1] <= L'9')
{
/* We accept it. This funny construct is here only to indent
- the code directly. */
+ the code correctly. */
}
#else
for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
@@ -557,13 +557,15 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9')
{
/* We accept it. This funny construct is here only to indent
- the code directly. */
+ the code correctly. */
}
#endif
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_(')'))
@@ -640,7 +643,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
while (c == L'0' || ((wint_t) thousands != L'\0' && c == (wint_t) thousands))
c = *++cp;
#else
- if (thousands == NULL)
+ if (__builtin_expect (thousands == NULL, 1))
while (c == '0')
c = *++cp;
else
@@ -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,17 +710,19 @@ ____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
{
#ifdef USE_WIDE_CHAR
- if ((wint_t) thousands == L'\0' || c != (wint_t) thousands)
+ if (__builtin_expect ((wint_t) thousands == L'\0', 1)
+ || c != (wint_t) thousands)
/* Not a digit or separator: end of the integer part. */
break;
#else
- if (thousands == NULL)
+ if (__builtin_expect (thousands == NULL, 1))
break;
else
{
@@ -733,7 +738,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
c = *++cp;
}
- if (grouping && cp > start_of_digits)
+ if (__builtin_expect (grouping != NULL, 0) && cp > start_of_digits)
{
/* Check the grouping of the digits. */
#ifdef USE_WIDE_CHAR
@@ -794,7 +799,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 +813,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;
@@ -840,7 +847,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
exponent *= 10;
exponent += c - L_('0');
- if (exponent > exp_limit)
+ if (__builtin_expect (exponent > exp_limit, 0))
/* The exponent is too large/small to represent a valid
number. */
{
@@ -1024,13 +1031,13 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
exponent -= incr;
}
- if (int_no + exponent > MAX_10_EXP + 1)
+ if (__builtin_expect (int_no + exponent > MAX_10_EXP + 1, 0))
{
__set_errno (ERANGE);
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
}
- if (exponent < MIN_10_EXP - (DIG + 1))
+ if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 1), 0))
{
__set_errno (ERANGE);
return 0.0;
@@ -1094,7 +1101,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
/* Now we know the exponent of the number in base two.
Check it against the maximum possible exponent. */
- if (bits > MAX_EXP)
+ if (__builtin_expect (bits > MAX_EXP, 0))
{
__set_errno (ERANGE);
return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;