summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLloyd Hilaiel <lloyd@hilaiel.com>2011-04-25 10:20:56 -0600
committerLloyd Hilaiel <lloyd@hilaiel.com>2011-04-25 11:06:16 -0600
commit575226189f1bc0874589a529fba1f6ede4f3924b (patch)
tree2c97640dc5c164492ca4789308808bec59390e0c
parent2f353eb7ea5442b6771b316384e6886102454e6d (diff)
downloadyajl-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.c2
-rw-r--r--src/yajl_parser.h8
-rw-r--r--src/yajl_tree.c5
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;