mirror of
https://github.com/json-c/json-c.git
synced 2026-03-22 06:29:06 +08:00
Merge the is_ws_char() and is_hex_char() changes to json_tokener from branch 'ramiropolla/for_upstream' (PR #464)
This commit is contained in:
@@ -53,6 +53,29 @@
|
||||
#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';
|
||||
}
|
||||
|
||||
static int is_hex_char(char c)
|
||||
{
|
||||
return (c >= '0' && c <= '9')
|
||||
|| (c >= 'A' && c <= 'F')
|
||||
|| (c >= 'a' && c <= 'f');
|
||||
}
|
||||
|
||||
/* Use C99 NAN by default; if not available, nan("") should work too. */
|
||||
#ifndef NAN
|
||||
#define NAN nan("")
|
||||
@@ -316,7 +339,7 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char *
|
||||
|
||||
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;
|
||||
@@ -647,7 +670,7 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char *
|
||||
/* Handle a 4-byte \uNNNN sequence, or two sequences if a surrogate pair */
|
||||
while (1)
|
||||
{
|
||||
if (!c || !strchr(json_hex_chars, c))
|
||||
if (!c || !is_hex_char(c))
|
||||
{
|
||||
tok->err = json_tokener_error_parse_string;
|
||||
goto out;
|
||||
@@ -920,7 +943,7 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char *
|
||||
next call to json_tokener_parse().
|
||||
*/
|
||||
if (tok->depth > 0 && c != ',' && c != ']' && c != '}' && c != '/' &&
|
||||
c != 'I' && c != 'i' && !isspace((unsigned char)c))
|
||||
c != 'I' && c != 'i' && !is_ws_char(c))
|
||||
{
|
||||
tok->err = json_tokener_error_parse_number;
|
||||
goto out;
|
||||
|
||||
Reference in New Issue
Block a user