diff options
author | Dan Carpenter <error27@gmail.com> | 2011-09-08 10:47:30 -0700 |
---|---|---|
committer | Christopher Li <sparse@chrisli.org> | 2011-11-21 01:56:02 -0800 |
commit | 4d6db1798508eb45517f5a0a55d73eb44ffe19b9 (patch) | |
tree | c5ad53f91bf11012b070d1004d2c9f91547969c2 | |
parent | 16a2e9108be73f64a263b281a3991b51ced67b8b (diff) | |
download | sparse-4d6db1798508eb45517f5a0a55d73eb44ffe19b9.tar.gz |
recognize binary constants
Sparse doesn't parse binary constants properly so the following code
generates an error:
x = 0b11;
test.c:5:17: error: constant 0b11 is not a valid number
Kamal: add call to tolower(), since "0B11" is also a valid syntax.
Reported-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Christopher Li <sparse@chrisli.org>
-rw-r--r-- | expression.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/expression.c b/expression.c index d9cdfd39..0ae3a60c 100644 --- a/expression.c +++ b/expression.c @@ -268,6 +268,13 @@ static struct token *string_expression(struct token *token, struct expression *e #define ULLONG_MAX (~0ULL) #endif +static unsigned long long parse_num(const char *nptr, char **end) +{ + if (nptr[0] == '0' && tolower(nptr[1]) == 'b') + return strtoull(&nptr[2], end, 2); + return strtoull(nptr, end, 0); +} + static void get_number_value(struct expression *expr, struct token *token) { const char *str = token->number; @@ -279,7 +286,7 @@ static void get_number_value(struct expression *expr, struct token *token) int bits; errno = 0; - value = strtoull(str, &end, 0); + value = parse_num(str, &end); if (end == str) goto Float; if (value == ULLONG_MAX && errno == ERANGE) |