diff options
author | Eric Haszlakiewicz <erh+git@nimenees.com> | 2020-08-02 04:06:44 +0000 |
---|---|---|
committer | Eric Haszlakiewicz <erh+git@nimenees.com> | 2020-08-02 04:06:44 +0000 |
commit | 8c7849e6e3b985825be770041af2b948fa6d8918 (patch) | |
tree | cfb94d3545dfba9d5bd38e95c0fc052812b7fea1 /json_tokener.c | |
parent | f3d8006d3487a806092f3379d8cdb6a8c9c5dce9 (diff) | |
download | json-c-8c7849e6e3b985825be770041af2b948fa6d8918.tar.gz |
Eliminate use of ctype.h and replace isdigit() and tolower() with non-locale-sensitive approaches.
Diffstat (limited to 'json_tokener.c')
-rw-r--r-- | json_tokener.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/json_tokener.c b/json_tokener.c index 4722621..e16db6b 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -17,7 +17,6 @@ #include "math_compat.h" #include <assert.h> -#include <ctype.h> #include <limits.h> #include <math.h> #include <stddef.h> @@ -82,7 +81,8 @@ static inline int is_hex_char(char c) static const char json_null_str[] = "null"; static const int json_null_str_len = sizeof(json_null_str) - 1; static const char json_inf_str[] = "Infinity"; -static const char json_inf_str_lower[] = "infinity"; +/* Swapped case "Infinity" to avoid need to call tolower() on input chars: */ +static const char json_inf_str_invert[] = "iNFINITY"; static const unsigned int json_inf_str_len = sizeof(json_inf_str) - 1; static const char json_nan_str[] = "NaN"; static const int json_nan_str_len = sizeof(json_nan_str) - 1; @@ -442,17 +442,15 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char * * complicated with likely little performance benefit. */ int is_negative = 0; - const char *_json_inf_str = json_inf_str; - if (!(tok->flags & JSON_TOKENER_STRICT)) - _json_inf_str = json_inf_str_lower; /* Note: tok->st_pos must be 0 when state is set to json_tokener_state_inf */ while (tok->st_pos < (int)json_inf_str_len) { char inf_char = *str; - if (!(tok->flags & JSON_TOKENER_STRICT)) - inf_char = tolower((unsigned char)*str); - if (inf_char != _json_inf_str[tok->st_pos]) + if (inf_char != json_inf_str[tok->st_pos] && + ((tok->flags & JSON_TOKENER_STRICT) || + inf_char != json_inf_str_invert[tok->st_pos]) + ) { tok->err = json_tokener_error_parse_unexpected; goto out; |