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; }