aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/generic/wordexp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/generic/wordexp.c')
-rw-r--r--sysdeps/generic/wordexp.c28
1 files changed, 6 insertions, 22 deletions
diff --git a/sysdeps/generic/wordexp.c b/sysdeps/generic/wordexp.c
index 46292f07fd..3e37d6449c 100644
--- a/sysdeps/generic/wordexp.c
+++ b/sysdeps/generic/wordexp.c
@@ -554,16 +554,13 @@ static int
internal_function
eval_expr_val (char **expr, long int *result)
{
- int sgn = +1;
char *digit;
/* Skip white space */
for (digit = *expr; digit && *digit && isspace (*digit); ++digit);
- switch (*digit)
+ if (*digit == '(')
{
- case '(':
-
/* Scan for closing paren */
for (++digit; **expr && **expr != ')'; ++(*expr));
@@ -577,27 +574,14 @@ eval_expr_val (char **expr, long int *result)
return WRDE_SYNTAX;
return 0;
-
- case '+': /* Positive value */
- ++digit;
- break;
-
- case '-': /* Negative value */
- ++digit;
- sgn = -1;
- break;
-
- default:
- if (!isdigit (*digit))
- return WRDE_SYNTAX;
}
- *result = 0;
- for (; *digit && isdigit (*digit); ++digit)
- *result = (*result * 10) + (*digit - '0');
+ /* POSIX requires that decimal, octal, and hexadecimal constants are
+ recognized. Therefore we pass 0 as the third parameter to strtol. */
+ *result = strtol (digit, expr, 0);
+ if (digit == *expr)
+ return WRDE_SYNTAX;
- *expr = digit;
- *result *= sgn;
return 0;
}