aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Carpenter <error27@gmail.com>2011-09-08 10:47:30 -0700
committerChristopher Li <sparse@chrisli.org>2011-11-21 01:56:02 -0800
commit4d6db1798508eb45517f5a0a55d73eb44ffe19b9 (patch)
treec5ad53f91bf11012b070d1004d2c9f91547969c2
parent16a2e9108be73f64a263b281a3991b51ced67b8b (diff)
downloadsparse-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.c9
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)