diff options
author | Lloyd Hilaiel <lloyd@hilaiel.com> | 2011-04-25 10:20:56 -0600 |
---|---|---|
committer | Lloyd Hilaiel <lloyd@hilaiel.com> | 2011-04-25 11:06:16 -0600 |
commit | 575226189f1bc0874589a529fba1f6ede4f3924b (patch) | |
tree | 2c97640dc5c164492ca4789308808bec59390e0c | |
parent | 2f353eb7ea5442b6771b316384e6886102454e6d (diff) | |
download | yajl-575226189f1bc0874589a529fba1f6ede4f3924b.tar.gz |
yajl_tree to use same integer parsing routines as yajl's parser proper to avoid locale issues.
-rw-r--r-- | src/yajl_parser.c | 2 | ||||
-rw-r--r-- | src/yajl_parser.h | 8 | ||||
-rw-r--r-- | src/yajl_tree.c | 5 |
3 files changed, 12 insertions, 3 deletions
diff --git a/src/yajl_parser.c b/src/yajl_parser.c index 69508b7..20d73bf 100644 --- a/src/yajl_parser.c +++ b/src/yajl_parser.c @@ -32,7 +32,7 @@ #define MAX_VALUE_TO_MULTIPLY ((LLONG_MAX / 10) + (LLONG_MAX % 10)) /* same semantics as strtol */ -static long long +long long yajl_parse_integer(const unsigned char *number, unsigned int length) { long long ret = 0; diff --git a/src/yajl_parser.h b/src/yajl_parser.h index 97ef207..c12fc1b 100644 --- a/src/yajl_parser.h +++ b/src/yajl_parser.h @@ -20,6 +20,7 @@ #include "api/yajl_parse.h" #include "yajl_bytestack.h" #include "yajl_buf.h" +#include "yajl_lex.h" typedef enum { @@ -28,7 +29,7 @@ typedef enum { yajl_state_parse_error, yajl_state_lexical_error, yajl_state_map_start, - yajl_state_map_sep, + yajl_state_map_sep, yajl_state_map_need_val, yajl_state_map_got_val, yajl_state_map_need_key, @@ -68,5 +69,10 @@ unsigned char * yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText, size_t jsonTextLen, int verbose); +/* A little built in integer parsing routine with the same semantics as strtol + * that's unaffected by LOCALE. */ +long long +yajl_parse_integer(const unsigned char *number, unsigned int length); + #endif diff --git a/src/yajl_tree.c b/src/yajl_tree.c index bf2a3b0..f48ddb6 100644 --- a/src/yajl_tree.c +++ b/src/yajl_tree.c @@ -24,6 +24,8 @@ #include "api/yajl_tree.h" #include "api/yajl_parse.h" +#include "yajl_parser.h" + #define STATUS_CONTINUE 1 #define STATUS_ABORT 0 @@ -306,7 +308,8 @@ static int handle_number (void *ctx, const char *string, size_t string_length) endptr = NULL; errno = 0; - v->u.number.i = (int64_t) strtoll(v->u.number.r, &endptr, /* base = */ 10); + v->u.number.i = yajl_parse_integer((const unsigned char *) v->u.number.r, + strlen(v->u.number.r)); if ((errno == 0) && (endptr != NULL) && (*endptr == 0)) v->u.number.flags |= YAJL_NUMBER_INT_VALID; |