json_tokener: optimize check for whitespace characters

speedup for 32-bit: ~15%
speedup for 64-bit: ~ 2%
This commit is contained in:
Ramiro Polla
2018-12-08 19:07:49 +01:00
parent ab3e40b37c
commit 158c248d5c

View File

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