From d98fc501fb69df7612d22c19ea1bc2315fbc8151 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Sat, 8 Dec 2018 19:17:25 +0100 Subject: [PATCH] json_tokener: optimize check for number characters speedup for 32-bit: ~5% speedup for 64-bit: ~3% --- json_object.c | 1 - json_object_private.h | 1 - json_tokener.c | 12 +++++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) 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 */ -- 2.50.1