From: Ramiro Polla Date: Sat, 8 Dec 2018 18:17:25 +0000 (+0100) Subject: json_tokener: optimize check for number characters X-Git-Tag: json-c-0.16-20220414~40^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d98fc501fb69df7612d22c19ea1bc2315fbc8151;p=json-c json_tokener: optimize check for number characters speedup for 32-bit: ~5% speedup for 64-bit: ~3% --- diff --git a/json_object.c b/json_object.c index e3c5744..cea5245 100644 --- a/json_object.c +++ b/json_object.c @@ -41,7 +41,6 @@ // Don't define this. It's not thread-safe. /* #define REFCOUNT_DEBUG 1 */ -const char *json_number_chars = "0123456789.+-eE"; const char *json_hex_chars = "0123456789abcdefABCDEF"; static struct json_object* json_object_new(enum json_type o_type); diff --git a/json_object_private.h b/json_object_private.h index d964b16..a023a85 100644 --- a/json_object_private.h +++ b/json_object_private.h @@ -51,7 +51,6 @@ struct json_object void _json_c_set_last_err(const char *err_fmt, ...); -extern const char *json_number_chars; extern const char *json_hex_chars; #ifdef __cplusplus diff --git a/json_tokener.c b/json_tokener.c index b3b28b6..b5fb210 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -73,6 +73,16 @@ static int is_hex_char(char c) || (c >= 'a' && c <= 'f'); } +static int is_number_char(char c) +{ + return (c >= '0' && c <= '9') + || c == '.' + || c == '+' + || c == '-' + || c == 'e' + || c == 'E'; +} + /* Use C99 NAN by default; if not available, nan("") should work too. */ #ifndef NAN #define NAN nan("") @@ -757,7 +767,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, int case_len=0; int is_exponent=0; int negativesign_next_possible_location=1; - while(c && strchr(json_number_chars, c)) { + while(c && is_number_char(c)) { ++case_len; /* non-digit characters checks */