summaryrefslogtreecommitdiffstats
path: root/src/jplist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/jplist.c')
-rw-r--r--src/jplist.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/jplist.c b/src/jplist.c
index f4adf2f..7817b1c 100644
--- a/src/jplist.c
+++ b/src/jplist.c
@@ -131,7 +131,7 @@ static int node_to_json(node_t* node, bytearray_t **outbuf, uint32_t depth, int
131 str_buf_append(*outbuf, "null", 4); 131 str_buf_append(*outbuf, "null", 4);
132 break; 132 break;
133 133
134 case PLIST_UINT: 134 case PLIST_INT:
135 val = (char*)malloc(64); 135 val = (char*)malloc(64);
136 if (node_data->length == 16) { 136 if (node_data->length == 16) {
137 val_len = snprintf(val, 64, "%"PRIu64, node_data->intval); 137 val_len = snprintf(val, 64, "%"PRIu64, node_data->intval);
@@ -349,7 +349,7 @@ static int node_estimate_size(node_t *node, uint64_t *size, uint32_t depth, int
349 *size += data->length; 349 *size += data->length;
350 *size += 2; 350 *size += 2;
351 break; 351 break;
352 case PLIST_UINT: 352 case PLIST_INT:
353 if (data->length == 16) { 353 if (data->length == 16) {
354 *size += num_digits_u(data->intval); 354 *size += num_digits_u(data->intval);
355 } else { 355 } else {
@@ -501,10 +501,15 @@ static plist_t parse_primitive(const char* js, jsmntok_info_t* ti, int* index)
501 val = plist_new_node(data); 501 val = plist_new_node(data);
502 } else if (isdigit(str_val[0]) || (str_val[0] == '-' && str_val+1 < str_end && isdigit(str_val[1]))) { 502 } else if (isdigit(str_val[0]) || (str_val[0] == '-' && str_val+1 < str_end && isdigit(str_val[1]))) {
503 char* endp = (char*)str_val; 503 char* endp = (char*)str_val;
504 int is_neg = (str_val[0] == '-');
504 int64_t intpart = parse_decimal(str_val, str_end, &endp); 505 int64_t intpart = parse_decimal(str_val, str_end, &endp);
505 if (endp >= str_end) { 506 if (endp >= str_end) {
506 /* integer */ 507 /* integer */
507 val = plist_new_uint((uint64_t)intpart); 508 if (is_neg || intpart <= INT64_MAX) {
509 val = plist_new_int(intpart);
510 } else {
511 val = plist_new_uint((uint64_t)intpart);
512 }
508 } else if ((*endp == '.' && endp+1 < str_end && isdigit(*(endp+1))) || ((*endp == 'e' || *endp == 'E') && endp+1 < str_end && (isdigit(*(endp+1)) || ((*(endp+1) == '-') && endp+2 < str_end && isdigit(*(endp+2)))))) { 513 } else if ((*endp == '.' && endp+1 < str_end && isdigit(*(endp+1))) || ((*endp == 'e' || *endp == 'E') && endp+1 < str_end && (isdigit(*(endp+1)) || ((*(endp+1) == '-') && endp+2 < str_end && isdigit(*(endp+2)))))) {
509 /* floating point */ 514 /* floating point */
510 double dval = (double)intpart; 515 double dval = (double)intpart;
@@ -513,7 +518,6 @@ static plist_t parse_primitive(const char* js, jsmntok_info_t* ti, int* index)
513 do { 518 do {
514 if (*endp == '.') { 519 if (*endp == '.') {
515 fendp++; 520 fendp++;
516 int is_neg = (str_val[0] == '-');
517 double frac = 0; 521 double frac = 0;
518 double p = 0.1; 522 double p = 0.1;
519 while (fendp < str_end && isdigit(*fendp)) { 523 while (fendp < str_end && isdigit(*fendp)) {