From 4d6db1798508eb45517f5a0a55d73eb44ffe19b9 Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 8 Sep 2011 10:47:30 -0700 Subject: [PATCH] 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 Signed-off-by: Dan Carpenter Signed-off-by: Kamal Mostafa Signed-off-by: Christopher Li --- expression.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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) -- 2.11.4.GIT