mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
adding support for int64 parsing
This commit is contained in:
parent
a110815230
commit
bab60ee563
2
Makefile
2
Makefile
@ -24,7 +24,7 @@ INSTALL_LIBRARY_PATH = $(DESTDIR)$(PREFIX)/$(LIBRARY_PATH)
|
|||||||
|
|
||||||
INSTALL ?= cp -a
|
INSTALL ?= cp -a
|
||||||
|
|
||||||
CC = gcc -std=c89
|
CC = gcc -std=c11
|
||||||
|
|
||||||
# validate gcc version for use fstack-protector-strong
|
# validate gcc version for use fstack-protector-strong
|
||||||
MIN_GCC_VERSION = "4.9"
|
MIN_GCC_VERSION = "4.9"
|
||||||
|
10
cJSON.c
10
cJSON.c
@ -44,7 +44,7 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
#include <stdint.h>
|
||||||
#ifdef ENABLE_LOCALES
|
#ifdef ENABLE_LOCALES
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#endif
|
#endif
|
||||||
@ -312,6 +312,7 @@ typedef struct
|
|||||||
static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer)
|
static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer)
|
||||||
{
|
{
|
||||||
double number = 0;
|
double number = 0;
|
||||||
|
uint64_t number64;
|
||||||
unsigned char *after_end = NULL;
|
unsigned char *after_end = NULL;
|
||||||
unsigned char number_c_string[64];
|
unsigned char number_c_string[64];
|
||||||
unsigned char decimal_point = get_decimal_point();
|
unsigned char decimal_point = get_decimal_point();
|
||||||
@ -378,7 +379,12 @@ loop_end:
|
|||||||
{
|
{
|
||||||
item->valueint = (int)number;
|
item->valueint = (int)number;
|
||||||
}
|
}
|
||||||
|
number64 = strtoull((const char*)number_c_string, (char**)&after_end, 10);
|
||||||
|
if(number_c_string == after_end)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
item->valueint64 = number64;
|
||||||
item->type = cJSON_Number;
|
item->type = cJSON_Number;
|
||||||
|
|
||||||
input_buffer->offset += (size_t)(after_end - number_c_string);
|
input_buffer->offset += (size_t)(after_end - number_c_string);
|
||||||
|
5
cJSON.h
5
cJSON.h
@ -84,7 +84,7 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
|
|||||||
#define CJSON_VERSION_PATCH 13
|
#define CJSON_VERSION_PATCH 13
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
/* cJSON Types: */
|
/* cJSON Types: */
|
||||||
#define cJSON_Invalid (0)
|
#define cJSON_Invalid (0)
|
||||||
#define cJSON_False (1 << 0)
|
#define cJSON_False (1 << 0)
|
||||||
@ -117,7 +117,7 @@ typedef struct cJSON
|
|||||||
int valueint;
|
int valueint;
|
||||||
/* The item's number, if type==cJSON_Number */
|
/* The item's number, if type==cJSON_Number */
|
||||||
double valuedouble;
|
double valuedouble;
|
||||||
|
uint64_t valueint64;
|
||||||
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||||
char *string;
|
char *string;
|
||||||
size_t valuestring_len;
|
size_t valuestring_len;
|
||||||
@ -180,6 +180,7 @@ CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
|||||||
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);
|
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);
|
||||||
CJSON_PUBLIC(size_t) cJSON_GetStringValueLength(cJSON *item);
|
CJSON_PUBLIC(size_t) cJSON_GetStringValueLength(cJSON *item);
|
||||||
CJSON_PUBLIC(double) cJSON_GetNumberValue(cJSON *item);
|
CJSON_PUBLIC(double) cJSON_GetNumberValue(cJSON *item);
|
||||||
|
CJSON_PUBLIC(long int) cJSON_Get64NumberValue(cJSON *item);
|
||||||
|
|
||||||
/* These functions check the type of an item */
|
/* These functions check the type of an item */
|
||||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
|
||||||
|
@ -836,7 +836,7 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_
|
|||||||
{
|
{
|
||||||
if (opcode == REMOVE)
|
if (opcode == REMOVE)
|
||||||
{
|
{
|
||||||
static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, NULL};
|
static const cJSON invalid = { NULL, NULL, NULL, cJSON_Invalid, NULL, 0, 0, 0, NULL, 0};
|
||||||
|
|
||||||
overwrite_item(object, invalid);
|
overwrite_item(object, invalid);
|
||||||
|
|
||||||
|
7
mytest.c
7
mytest.c
@ -2,7 +2,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
char JSON_STR[] = "{ \"val\": \"\\u0000\\u0001\", \"vval\":true, \"test_plain\":\"\\r\\n\", \"plain_text\": \"i'm a text\"}";
|
char JSON_STR[] = "{ \"val\": \"\\u0000\\u0001\", \"vval\":true, \"test_plain\":\"\\r\\n\", \"plain_text\": \"i'm a text\", \"test_int64\": 18446744073709551610}";
|
||||||
int main(void) {
|
int main(void) {
|
||||||
printf("%s\n", JSON_STR);
|
printf("%s\n", JSON_STR);
|
||||||
cJSON *json = cJSON_Parse(JSON_STR);
|
cJSON *json = cJSON_Parse(JSON_STR);
|
||||||
@ -24,6 +24,11 @@ int main(void) {
|
|||||||
if(json3 == NULL) {
|
if(json3 == NULL) {
|
||||||
printf("could not get val\n");
|
printf("could not get val\n");
|
||||||
}
|
}
|
||||||
|
cJSON *json4 = cJSON_GetObjectItem(json, "test_int64");
|
||||||
|
printf("got int 64 val: %016lx\n", json4->valueint64);
|
||||||
|
double asDouble = cJSON_GetNumberValue(json4);
|
||||||
|
int asInt = json4->valueint;
|
||||||
|
printf("got val: %e %lx %u\n",asDouble, *((uint64_t*)&asDouble), asInt);
|
||||||
printf("val is : *%s*\nlen is : %lu as opposed to: %lu\n", cJSON_GetStringValue(json3), json3->valuestring_len, strlen(json3->valuestring));
|
printf("val is : *%s*\nlen is : %lu as opposed to: %lu\n", cJSON_GetStringValue(json3), json3->valuestring_len, strlen(json3->valuestring));
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user