diff options
Diffstat (limited to 'src/jplist.c')
| -rw-r--r-- | src/jplist.c | 12 |
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)) { |
