From: Ramiro Polla Date: Sat, 8 Dec 2018 18:07:49 +0000 (+0100) Subject: json_tokener: optimize check for whitespace characters X-Git-Tag: json-c-0.16-20220414~40^2~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=158c248d5cdee5ffacc3f35e567682021b78c31c;p=json-c json_tokener: optimize check for whitespace characters speedup for 32-bit: ~15% speedup for 64-bit: ~ 2% --- diff --git a/json_tokener.c b/json_tokener.c index 561f730..d168e3f 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -50,6 +50,22 @@ # error You do not have strncasecmp on your system. #endif /* HAVE_STRNCASECMP */ +/* The following helper functions are used to speed up parsing. They + * are faster than their ctype counterparts because they assume that + * the input is in ASCII and that the locale is set to "C". The + * compiler will also inline these functions, providing an additional + * speedup by saving on function calls. + */ +static int is_ws_char(char c) +{ + return c == ' ' + || c == '\t' + || c == '\n' + || c == '\v' + || c == '\f' + || c == '\r'; +} + /* Use C99 NAN by default; if not available, nan("") should work too. */ #ifndef NAN #define NAN nan("") @@ -295,7 +311,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, case json_tokener_state_eatws: /* Advance until we change state */ - while (isspace((unsigned char)c)) { + while (is_ws_char(c)) { if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok))) goto out; }