add uint64 data to json-ctags/json-c-0.14-20200419
@@ -161,6 +161,7 @@ endif() | |||||
if (MSVC) | if (MSVC) | ||||
check_symbol_exists(strtoll "stdlib.h" HAVE_STRTOLL) | check_symbol_exists(strtoll "stdlib.h" HAVE_STRTOLL) | ||||
check_symbol_exists(strtoull "stdlib.h" HAVE_STRTOULL) | |||||
set(json_c_strtoll "strtoll") | set(json_c_strtoll "strtoll") | ||||
if (NOT HAVE_STRTOLL) | if (NOT HAVE_STRTOLL) | ||||
@@ -172,6 +173,16 @@ if (MSVC) | |||||
# could do the same for strtoull, if needed | # could do the same for strtoull, if needed | ||||
endif() | endif() | ||||
endif() | endif() | ||||
set(json_c_strtoull "strtoull") | |||||
if (NOT HAVE_STRTOULL) | |||||
# Use _strtoui64 if strtoull is not available. | |||||
check_symbol_exists(_strtoui64 "stdlib.h" __have_strtoui64) | |||||
if (__have_strtoui64) | |||||
set(HAVE_STRTOULL 1) | |||||
set(json_c_strtoull "_strtoui64") | |||||
endif() | |||||
endif() | |||||
endif() | endif() | ||||
@@ -137,6 +137,8 @@ | |||||
#cmakedefine HAVE_STRTOLL | #cmakedefine HAVE_STRTOLL | ||||
#cmakedefine strtoll @json_c_strtoll@ | #cmakedefine strtoll @json_c_strtoll@ | ||||
#cmakedefine HAVE_STRTOULL | |||||
#cmakedefine strtoull @json_c_strtoull@ | |||||
/* Have __thread */ | /* Have __thread */ | ||||
#cmakedefine HAVE___THREAD | #cmakedefine HAVE___THREAD | ||||
@@ -115,6 +115,8 @@ | |||||
#cmakedefine HAVE_STRTOLL | #cmakedefine HAVE_STRTOLL | ||||
#cmakedefine strtoll @cmake_strtoll@ | #cmakedefine strtoll @cmake_strtoll@ | ||||
#cmakedefine HAVE_STRTOULL | |||||
#cmakedefine strtoull @cmake_strtoull@ | |||||
/* Define to 1 if you have the <syslog.h> header file. */ | /* Define to 1 if you have the <syslog.h> header file. */ | ||||
#undef HAVE_SYSLOG_H | #undef HAVE_SYSLOG_H | ||||
@@ -200,6 +200,7 @@ AX_COMPILE_CHECK_SIZEOF(long) | |||||
AX_COMPILE_CHECK_SIZEOF(long long) | AX_COMPILE_CHECK_SIZEOF(long long) | ||||
AX_COMPILE_CHECK_SIZEOF(size_t, [#include <stdint.h>]) | AX_COMPILE_CHECK_SIZEOF(size_t, [#include <stdint.h>]) | ||||
AX_COMPILE_CHECK_SIZEOF(int64_t, [#include <stdint.h>]) | AX_COMPILE_CHECK_SIZEOF(int64_t, [#include <stdint.h>]) | ||||
AX_COMPILE_CHECK_SIZEOF(uint64_t, [#include <stdint.h>]) | |||||
AC_CONFIG_FILES([ | AC_CONFIG_FILES([ | ||||
Makefile | Makefile | ||||
@@ -17,6 +17,7 @@ | |||||
#define PRId64 "I64d" | #define PRId64 "I64d" | ||||
#define SCNd64 "I64d" | #define SCNd64 "I64d" | ||||
#define PRIu64 "I64u" | |||||
#endif | #endif | ||||
@@ -591,7 +591,14 @@ json_bool json_object_get_boolean(const struct json_object *jso) | |||||
case json_type_boolean: | case json_type_boolean: | ||||
return jso->o.c_boolean; | return jso->o.c_boolean; | ||||
case json_type_int: | case json_type_int: | ||||
return (jso->o.c_int64 != 0); | |||||
switch(jso->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
return (jso->o.c_int.cint.c_int64 != 0); | |||||
case json_object_int_type_uint64: | |||||
return (jso->o.c_int.cint.c_uint64 != 0); | |||||
default: | |||||
assert(0); | |||||
} | |||||
case json_type_double: | case json_type_double: | ||||
return (jso->o.c_double != 0); | return (jso->o.c_double != 0); | ||||
case json_type_string: | case json_type_string: | ||||
@@ -618,7 +625,10 @@ static int json_object_int_to_json_string(struct json_object* jso, | |||||
{ | { | ||||
/* room for 19 digits, the sign char, and a null term */ | /* room for 19 digits, the sign char, and a null term */ | ||||
char sbuf[21]; | char sbuf[21]; | ||||
snprintf(sbuf, sizeof(sbuf), "%" PRId64, jso->o.c_int64); | |||||
if (jso->o.c_int.cint_type == json_object_int_type_int64) | |||||
snprintf(sbuf, sizeof(sbuf), "%" PRId64, jso->o.c_int.cint.c_int64); | |||||
else | |||||
snprintf(sbuf, sizeof(sbuf), "%" PRIu64, jso->o.c_int.cint.c_uint64); | |||||
return printbuf_memappend (pb, sbuf, strlen(sbuf)); | return printbuf_memappend (pb, sbuf, strlen(sbuf)); | ||||
} | } | ||||
@@ -628,7 +638,8 @@ struct json_object* json_object_new_int(int32_t i) | |||||
if (!jso) | if (!jso) | ||||
return NULL; | return NULL; | ||||
jso->_to_json_string = &json_object_int_to_json_string; | jso->_to_json_string = &json_object_int_to_json_string; | ||||
jso->o.c_int64 = i; | |||||
jso->o.c_int.cint.c_int64 = i; | |||||
jso->o.c_int.cint_type = json_object_int_type_int64; | |||||
return jso; | return jso; | ||||
} | } | ||||
@@ -640,7 +651,13 @@ int32_t json_object_get_int(const struct json_object *jso) | |||||
if(!jso) return 0; | if(!jso) return 0; | ||||
o_type = jso->o_type; | o_type = jso->o_type; | ||||
cint64 = jso->o.c_int64; | |||||
if (jso->o.c_int.cint_type == json_object_int_type_int64) { | |||||
cint64 = jso->o.c_int.cint.c_int64; | |||||
} else { | |||||
if (jso->o.c_int.cint.c_uint64 >= INT64_MAX) | |||||
cint64 = INT64_MAX; | |||||
cint64 = (int64_t)jso->o.c_int.cint.c_uint64; | |||||
} | |||||
if (o_type == json_type_string) | if (o_type == json_type_string) | ||||
{ | { | ||||
@@ -675,10 +692,7 @@ int32_t json_object_get_int(const struct json_object *jso) | |||||
} | } | ||||
int json_object_set_int(struct json_object *jso,int new_value){ | int json_object_set_int(struct json_object *jso,int new_value){ | ||||
if (!jso || jso->o_type!=json_type_int) | |||||
return 0; | |||||
jso->o.c_int64=new_value; | |||||
return 1; | |||||
return json_object_set_int64(jso,(int64_t)new_value); | |||||
} | } | ||||
struct json_object* json_object_new_int64(int64_t i) | struct json_object* json_object_new_int64(int64_t i) | ||||
@@ -687,7 +701,19 @@ struct json_object* json_object_new_int64(int64_t i) | |||||
if (!jso) | if (!jso) | ||||
return NULL; | return NULL; | ||||
jso->_to_json_string = &json_object_int_to_json_string; | jso->_to_json_string = &json_object_int_to_json_string; | ||||
jso->o.c_int64 = i; | |||||
jso->o.c_int.cint.c_int64 = i; | |||||
jso->o.c_int.cint_type = json_object_int_type_int64; | |||||
return jso; | |||||
} | |||||
struct json_object* json_object_new_uint64(uint64_t i) | |||||
{ | |||||
struct json_object *jso = json_object_new(json_type_int); | |||||
if (!jso) | |||||
return NULL; | |||||
jso->_to_json_string = &json_object_int_to_json_string; | |||||
jso->o.c_int.cint.c_uint64 = i; | |||||
jso->o.c_int.cint_type = json_object_int_type_uint64; | |||||
return jso; | return jso; | ||||
} | } | ||||
@@ -700,7 +726,16 @@ int64_t json_object_get_int64(const struct json_object *jso) | |||||
switch(jso->o_type) | switch(jso->o_type) | ||||
{ | { | ||||
case json_type_int: | case json_type_int: | ||||
return jso->o.c_int64; | |||||
switch(jso->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
return jso->o.c_int.cint.c_int64; | |||||
case json_object_int_type_uint64: | |||||
if (jso->o.c_int.cint.c_uint64 >= INT64_MAX) | |||||
return INT64_MAX; | |||||
return (int64_t)jso->o.c_int.cint.c_uint64; | |||||
default: | |||||
assert(0); | |||||
} | |||||
case json_type_double: | case json_type_double: | ||||
// INT64_MAX can't be exactly represented as a double | // INT64_MAX can't be exactly represented as a double | ||||
// so cast to tell the compiler it's ok to round up. | // so cast to tell the compiler it's ok to round up. | ||||
@@ -720,24 +755,89 @@ int64_t json_object_get_int64(const struct json_object *jso) | |||||
} | } | ||||
} | } | ||||
uint64_t json_object_get_uint64(const struct json_object *jso) | |||||
{ | |||||
uint64_t cuint; | |||||
if (!jso) | |||||
return 0; | |||||
switch(jso->o_type) | |||||
{ | |||||
case json_type_int: | |||||
switch(jso->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
if (jso->o.c_int.cint.c_int64 < 0) | |||||
return 0; | |||||
return (uint64_t)jso->o.c_int.cint.c_int64; | |||||
case json_object_int_type_uint64: | |||||
return jso->o.c_int.cint.c_uint64; | |||||
default: | |||||
assert(0); | |||||
} | |||||
case json_type_double: | |||||
// UINT64_MAX can't be exactly represented as a double | |||||
// so cast to tell the compiler it's ok to round up. | |||||
if (jso->o.c_double >= (double)UINT64_MAX) | |||||
return UINT64_MAX; | |||||
if (jso->o.c_double < 0) | |||||
return 0; | |||||
return (uint64_t)jso->o.c_double; | |||||
case json_type_boolean: | |||||
return jso->o.c_boolean; | |||||
case json_type_string: | |||||
if (json_parse_uint64(get_string_component(jso), &cuint) == 0) | |||||
return cuint; | |||||
/* FALLTHRU */ | |||||
default: | |||||
return 0; | |||||
} | |||||
} | |||||
int json_object_set_int64(struct json_object *jso,int64_t new_value){ | int json_object_set_int64(struct json_object *jso,int64_t new_value){ | ||||
if (!jso || jso->o_type!=json_type_int) | if (!jso || jso->o_type!=json_type_int) | ||||
return 0; | return 0; | ||||
jso->o.c_int64=new_value; | |||||
jso->o.c_int.cint.c_int64=new_value; | |||||
jso->o.c_int.cint_type = json_object_int_type_int64; | |||||
return 1; | |||||
} | |||||
int json_object_set_uint64(struct json_object *jso,uint64_t new_value){ | |||||
if (!jso || jso->o_type!=json_type_int) | |||||
return 0; | |||||
jso->o.c_int.cint.c_uint64=new_value; | |||||
jso->o.c_int.cint_type = json_object_int_type_uint64; | |||||
return 1; | return 1; | ||||
} | } | ||||
int json_object_int_inc(struct json_object *jso, int64_t val) { | int json_object_int_inc(struct json_object *jso, int64_t val) { | ||||
if (!jso || jso->o_type != json_type_int) | if (!jso || jso->o_type != json_type_int) | ||||
return 0; | return 0; | ||||
if (val > 0 && jso->o.c_int64 > INT64_MAX - val) { | |||||
jso->o.c_int64 = INT64_MAX; | |||||
} else if (val < 0 && jso->o.c_int64 < INT64_MIN - val) { | |||||
jso->o.c_int64 = INT64_MIN; | |||||
} else { | |||||
jso->o.c_int64 += val; | |||||
switch(jso->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
if (val > 0 && jso->o.c_int.cint.c_int64 > INT64_MAX - val) { | |||||
jso->o.c_int.cint.c_uint64 = (uint64_t)jso->o.c_int.cint.c_int64 + (uint64_t)val; | |||||
jso->o.c_int.cint_type = json_object_int_type_uint64; | |||||
} else if (val < 0 && jso->o.c_int.cint.c_int64 < INT64_MIN - val) { | |||||
jso->o.c_int.cint.c_int64 = INT64_MIN; | |||||
} else { | |||||
jso->o.c_int.cint.c_int64 += val; | |||||
} | |||||
return 1; | |||||
case json_object_int_type_uint64: | |||||
if (val > 0 && jso->o.c_int.cint.c_uint64 > UINT64_MAX - (uint64_t)val) { | |||||
jso->o.c_int.cint.c_uint64 = UINT64_MAX; | |||||
} else if (val < 0 && jso->o.c_int.cint.c_uint64 < (uint64_t)(-val)) { | |||||
jso->o.c_int.cint.c_int64 = (int64_t)jso->o.c_int.cint.c_uint64 + val; | |||||
jso->o.c_int.cint_type = json_object_int_type_int64; | |||||
} else if (val < 0 && jso->o.c_int.cint.c_uint64 >= (uint64_t)(-val)) { | |||||
jso->o.c_int.cint.c_uint64 -= (uint64_t)(-val); | |||||
} else { | |||||
jso->o.c_int.cint.c_uint64 += val; | |||||
} | |||||
return 1; | |||||
default: | |||||
assert(0); | |||||
} | } | ||||
return 1; | |||||
} | } | ||||
/* json_object_double */ | /* json_object_double */ | ||||
@@ -961,7 +1061,14 @@ double json_object_get_double(const struct json_object *jso) | |||||
case json_type_double: | case json_type_double: | ||||
return jso->o.c_double; | return jso->o.c_double; | ||||
case json_type_int: | case json_type_int: | ||||
return jso->o.c_int64; | |||||
switch(jso->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
return jso->o.c_int.cint.c_int64; | |||||
case json_object_int_type_uint64: | |||||
return jso->o.c_int.cint.c_uint64; | |||||
default: | |||||
assert(0); | |||||
} | |||||
case json_type_boolean: | case json_type_boolean: | ||||
return jso->o.c_boolean; | return jso->o.c_boolean; | ||||
case json_type_string: | case json_type_string: | ||||
@@ -1340,7 +1447,23 @@ int json_object_equal(struct json_object* jso1, struct json_object* jso2) | |||||
return (jso1->o.c_double == jso2->o.c_double); | return (jso1->o.c_double == jso2->o.c_double); | ||||
case json_type_int: | case json_type_int: | ||||
return (jso1->o.c_int64 == jso2->o.c_int64); | |||||
if (jso1->o.c_int.cint_type == json_object_int_type_int64) { | |||||
if (jso2->o.c_int.cint_type == json_object_int_type_int64) { | |||||
return (jso1->o.c_int.cint.c_int64 == jso2->o.c_int.cint.c_int64); | |||||
} else { | |||||
if (jso1->o.c_int.cint.c_int64 < 0) | |||||
return 0; | |||||
return ((uint64_t)jso1->o.c_int.cint.c_int64 == jso2->o.c_int.cint.c_uint64); | |||||
} | |||||
} else { | |||||
if (jso2->o.c_int.cint_type == json_object_int_type_uint64) { | |||||
return (jso1->o.c_int.cint.c_uint64 == jso2->o.c_int.cint.c_uint64); | |||||
} else { | |||||
if (jso2->o.c_int.cint.c_int64 < 0) | |||||
return 0; | |||||
return (jso1->o.c_int.cint.c_uint64 == (uint64_t)jso2->o.c_int.cint.c_int64); | |||||
} | |||||
} | |||||
case json_type_string: | case json_type_string: | ||||
return (jso1->o.c_string.len == jso2->o.c_string.len && | return (jso1->o.c_string.len == jso2->o.c_string.len && | ||||
@@ -1402,7 +1525,16 @@ int json_c_shallow_copy_default(json_object *src, json_object *parent, const cha | |||||
break; | break; | ||||
case json_type_int: | case json_type_int: | ||||
*dst = json_object_new_int64(src->o.c_int64); | |||||
switch(src->o.c_int.cint_type) { | |||||
case json_object_int_type_int64: | |||||
*dst = json_object_new_int64(src->o.c_int.cint.c_int64); | |||||
break; | |||||
case json_object_int_type_uint64: | |||||
*dst = json_object_new_uint64(src->o.c_int.cint.c_uint64); | |||||
break; | |||||
default: | |||||
assert(0); | |||||
} | |||||
break; | break; | ||||
case json_type_string: | case json_type_string: | ||||
@@ -701,6 +701,13 @@ JSON_EXPORT struct json_object* json_object_new_int(int32_t i); | |||||
JSON_EXPORT struct json_object* json_object_new_int64(int64_t i); | JSON_EXPORT struct json_object* json_object_new_int64(int64_t i); | ||||
/** Create a new empty json_object of type json_type_uint | |||||
* @param i the integer | |||||
* @returns a json_object of type json_type_uint | |||||
*/ | |||||
JSON_EXPORT struct json_object* json_object_new_uint64(uint64_t i); | |||||
/** Get the int value of a json_object | /** Get the int value of a json_object | ||||
* | * | ||||
* The type is coerced to a int if the passed object is not a int. | * The type is coerced to a int if the passed object is not a int. | ||||
@@ -745,7 +752,6 @@ JSON_EXPORT int json_object_set_int(struct json_object *obj,int new_value); | |||||
*/ | */ | ||||
JSON_EXPORT int json_object_int_inc(struct json_object *obj, int64_t val); | JSON_EXPORT int json_object_int_inc(struct json_object *obj, int64_t val); | ||||
/** Get the int value of a json_object | /** Get the int value of a json_object | ||||
* | * | ||||
* The type is coerced to a int64 if the passed object is not a int64. | * The type is coerced to a int64 if the passed object is not a int64. | ||||
@@ -761,6 +767,20 @@ JSON_EXPORT int json_object_int_inc(struct json_object *obj, int64_t val); | |||||
*/ | */ | ||||
JSON_EXPORT int64_t json_object_get_int64(const struct json_object *obj); | JSON_EXPORT int64_t json_object_get_int64(const struct json_object *obj); | ||||
/** Get the uint value of a json_object | |||||
* | |||||
* The type is coerced to a uint64 if the passed object is not a uint64. | |||||
* double objects will return their uint64 conversion. Strings will be | |||||
* parsed as an uint64. If no conversion exists then 0 is returned. | |||||
* | |||||
* NOTE: Set errno to 0 directly before a call to this function to determine | |||||
* whether or not conversion was successful (it does not clear the value for | |||||
* you). | |||||
* | |||||
* @param obj the json_object instance | |||||
* @returns an uint64 | |||||
*/ | |||||
JSON_EXPORT uint64_t json_object_get_uint64(const struct json_object *obj); | |||||
/** Set the int64_t value of a json_object | /** Set the int64_t value of a json_object | ||||
* | * | ||||
@@ -774,6 +794,18 @@ JSON_EXPORT int64_t json_object_get_int64(const struct json_object *obj); | |||||
*/ | */ | ||||
JSON_EXPORT int json_object_set_int64(struct json_object *obj,int64_t new_value); | JSON_EXPORT int json_object_set_int64(struct json_object *obj,int64_t new_value); | ||||
/** Set the uint64_t value of a json_object | |||||
* | |||||
* The type of obj is checked to be a json_type_uint and 0 is returned | |||||
* if it is not without any further actions. If type of obj is json_type_uint | |||||
* the object value is changed to new_value | |||||
* | |||||
* @param obj the json_object instance | |||||
* @param new_value the value to be set | |||||
* @returns 1 if value is set correctly, 0 otherwise | |||||
*/ | |||||
JSON_EXPORT int json_object_set_uint64(struct json_object *obj,uint64_t new_value); | |||||
/* double type methods */ | /* double type methods */ | ||||
/** Create a new empty json_object of type json_type_double | /** Create a new empty json_object of type json_type_double | ||||
@@ -24,6 +24,12 @@ extern "C" { | |||||
typedef void (json_object_private_delete_fn)(struct json_object *o); | typedef void (json_object_private_delete_fn)(struct json_object *o); | ||||
/* json object int type, support extension*/ | |||||
typedef enum json_object_int_type { | |||||
json_object_int_type_int64, | |||||
json_object_int_type_uint64 | |||||
}json_object_int_type; | |||||
struct json_object | struct json_object | ||||
{ | { | ||||
enum json_type o_type; | enum json_type o_type; | ||||
@@ -34,7 +40,13 @@ struct json_object | |||||
union data { | union data { | ||||
json_bool c_boolean; | json_bool c_boolean; | ||||
double c_double; | double c_double; | ||||
int64_t c_int64; | |||||
struct { | |||||
union { | |||||
int64_t c_int64; | |||||
uint64_t c_uint64; | |||||
} cint; | |||||
enum json_object_int_type cint_type; | |||||
} c_int; | |||||
struct lh_table *c_object; | struct lh_table *c_object; | ||||
struct array_list *c_array; | struct array_list *c_array; | ||||
struct { | struct { | ||||
@@ -792,21 +792,33 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok, | |||||
} | } | ||||
{ | { | ||||
int64_t num64; | int64_t num64; | ||||
uint64_t numuint64; | |||||
double numd; | double numd; | ||||
if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) { | |||||
if (num64 && tok->pb->buf[0]=='0' && | |||||
if (!tok->is_double && tok->pb->buf[0] == '-' | |||||
&& json_parse_int64(tok->pb->buf, &num64) == 0) { | |||||
current = json_object_new_int64(num64); | |||||
if(current == NULL) | |||||
goto out; | |||||
} else if ( !tok->is_double && tok->pb->buf[0] != '-' | |||||
&& json_parse_uint64(tok->pb->buf, &numuint64) == 0) { | |||||
if (numuint64 && tok->pb->buf[0]=='0' && | |||||
(tok->flags & JSON_TOKENER_STRICT)) { | (tok->flags & JSON_TOKENER_STRICT)) { | ||||
/* in strict mode, number must not start with 0 */ | |||||
tok->err = json_tokener_error_parse_number; | tok->err = json_tokener_error_parse_number; | ||||
goto out; | goto out; | ||||
} | } | ||||
current = json_object_new_int64(num64); | |||||
if(current == NULL) | |||||
goto out; | |||||
} | |||||
else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0) | |||||
if (numuint64 <= INT64_MAX){ | |||||
num64 = (uint64_t) numuint64; | |||||
current = json_object_new_int64(num64); | |||||
if(current == NULL) | |||||
goto out; | |||||
} else { | |||||
current = json_object_new_uint64(numuint64); | |||||
if(current == NULL) | |||||
goto out; | |||||
} | |||||
} else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0) | |||||
{ | { | ||||
current = json_object_new_double_s(numd, tok->pb->buf); | |||||
current = json_object_new_double_s(numd, tok->pb->buf); | |||||
if(current == NULL) | if(current == NULL) | ||||
goto out; | goto out; | ||||
} else { | } else { | ||||
@@ -40,8 +40,9 @@ | |||||
#ifdef WIN32 | #ifdef WIN32 | ||||
# if MSC_VER < 1800 | # if MSC_VER < 1800 | ||||
/* strtoll is available only since Visual Studio 2013 */ | |||||
/* strtoll/strtoull is available only since Visual Studio 2013 */ | |||||
# define strtoll _strtoi64 | # define strtoll _strtoi64 | ||||
# define strtoull _strtoui64 | |||||
# endif | # endif | ||||
# define WIN32_LEAN_AND_MEAN | # define WIN32_LEAN_AND_MEAN | ||||
# include <windows.h> | # include <windows.h> | ||||
@@ -230,6 +231,23 @@ int json_parse_int64(const char *buf, int64_t *retval) | |||||
return ((val == 0 && errno != 0) || (end == buf)) ? 1 : 0; | return ((val == 0 && errno != 0) || (end == buf)) ? 1 : 0; | ||||
} | } | ||||
int json_parse_uint64(const char *buf, uint64_t *retval) | |||||
{ | |||||
char *end = NULL; | |||||
uint64_t val; | |||||
errno = 1; | |||||
while (*buf == ' ') { | |||||
buf++; | |||||
} | |||||
if (*buf == '-') errno = 0; | |||||
val = strtoull(buf, &end, 10); | |||||
if (end != buf) | |||||
*retval = val; | |||||
return ((errno == 0) || (end == buf)) ? 1 : 0; | |||||
} | |||||
#ifndef HAVE_REALLOC | #ifndef HAVE_REALLOC | ||||
void* rpl_realloc(void* p, size_t n) | void* rpl_realloc(void* p, size_t n) | ||||
{ | { | ||||
@@ -103,6 +103,7 @@ JSON_EXPORT const char *json_util_get_last_err(void); | |||||
JSON_EXPORT int json_parse_int64(const char *buf, int64_t *retval); | JSON_EXPORT int json_parse_int64(const char *buf, int64_t *retval); | ||||
JSON_EXPORT int json_parse_uint64(const char *buf, uint64_t *retval); | |||||
JSON_EXPORT int json_parse_double(const char *buf, double *retval); | JSON_EXPORT int json_parse_double(const char *buf, double *retval); | ||||
/** | /** | ||||
@@ -25,10 +25,13 @@ int main(int argc, char **argv) | |||||
\"decimal_number\": 99.55,\n\ | \"decimal_number\": 99.55,\n\ | ||||
\"boolean_true\": true,\n\ | \"boolean_true\": true,\n\ | ||||
\"boolean_false\": false,\n\ | \"boolean_false\": false,\n\ | ||||
\"big_number\": 2147483649,\n\ | |||||
\"int64_number\": 2147483649,\n\ | |||||
\"negative_number\": -321321321,\n\ | |||||
\"a_null\": null,\n\ | \"a_null\": null,\n\ | ||||
}"; | }"; | ||||
/* Note: 2147483649 = INT_MAX + 2 */ | /* Note: 2147483649 = INT_MAX + 2 */ | ||||
/* Note: 9223372036854775809 = INT64_MAX + 2 */ | |||||
/* Note: 18446744073709551617 = UINT64_MAX + 2 */ | |||||
struct json_object *new_obj; | struct json_object *new_obj; | ||||
@@ -43,7 +46,8 @@ int main(int argc, char **argv) | |||||
getit(new_obj, "decimal_number"); | getit(new_obj, "decimal_number"); | ||||
getit(new_obj, "boolean_true"); | getit(new_obj, "boolean_true"); | ||||
getit(new_obj, "boolean_false"); | getit(new_obj, "boolean_false"); | ||||
getit(new_obj, "big_number"); | |||||
getit(new_obj, "int64_number"); | |||||
getit(new_obj, "negative_number"); | |||||
getit(new_obj, "a_null"); | getit(new_obj, "a_null"); | ||||
// Now check the behaviour of the json_object_is_type() function. | // Now check the behaviour of the json_object_is_type() function. | ||||
@@ -55,7 +59,8 @@ int main(int argc, char **argv) | |||||
checktype(new_obj, "decimal_number"); | checktype(new_obj, "decimal_number"); | ||||
checktype(new_obj, "boolean_true"); | checktype(new_obj, "boolean_true"); | ||||
checktype(new_obj, "boolean_false"); | checktype(new_obj, "boolean_false"); | ||||
checktype(new_obj, "big_number"); | |||||
checktype(new_obj, "int64_number"); | |||||
checktype(new_obj, "negative_number"); | |||||
checktype(new_obj, "a_null"); | checktype(new_obj, "a_null"); | ||||
json_object_put(new_obj); | json_object_put(new_obj); | ||||
@@ -76,6 +81,8 @@ static void getit(struct json_object *new_obj, const char *field) | |||||
json_object_get_int(o)); | json_object_get_int(o)); | ||||
printf("new_obj.%s json_object_get_int64()=%" PRId64 "\n", field, | printf("new_obj.%s json_object_get_int64()=%" PRId64 "\n", field, | ||||
json_object_get_int64(o)); | json_object_get_int64(o)); | ||||
printf("new_obj.%s json_object_get_uint64()=%" PRIu64 "\n", field, | |||||
json_object_get_uint64(o)); | |||||
printf("new_obj.%s json_object_get_boolean()=%d\n", field, | printf("new_obj.%s json_object_get_boolean()=%d\n", field, | ||||
json_object_get_boolean(o)); | json_object_get_boolean(o)); | ||||
printf("new_obj.%s json_object_get_double()=%f\n", field, | printf("new_obj.%s json_object_get_double()=%f\n", field, | ||||
@@ -4,43 +4,57 @@ Parsed input: { | |||||
"decimal_number": 99.55, | "decimal_number": 99.55, | ||||
"boolean_true": true, | "boolean_true": true, | ||||
"boolean_false": false, | "boolean_false": false, | ||||
"big_number": 2147483649, | |||||
"int64_number": 2147483649, | |||||
"negative_number": -321321321, | |||||
"a_null": null, | "a_null": null, | ||||
} | } | ||||
Result is not NULL | Result is not NULL | ||||
new_obj.string_of_digits json_object_get_type()=string | new_obj.string_of_digits json_object_get_type()=string | ||||
new_obj.string_of_digits json_object_get_int()=123 | new_obj.string_of_digits json_object_get_int()=123 | ||||
new_obj.string_of_digits json_object_get_int64()=123 | new_obj.string_of_digits json_object_get_int64()=123 | ||||
new_obj.string_of_digits json_object_get_uint64()=123 | |||||
new_obj.string_of_digits json_object_get_boolean()=1 | new_obj.string_of_digits json_object_get_boolean()=1 | ||||
new_obj.string_of_digits json_object_get_double()=123.000000 | new_obj.string_of_digits json_object_get_double()=123.000000 | ||||
new_obj.regular_number json_object_get_type()=int | new_obj.regular_number json_object_get_type()=int | ||||
new_obj.regular_number json_object_get_int()=222 | new_obj.regular_number json_object_get_int()=222 | ||||
new_obj.regular_number json_object_get_int64()=222 | new_obj.regular_number json_object_get_int64()=222 | ||||
new_obj.regular_number json_object_get_uint64()=222 | |||||
new_obj.regular_number json_object_get_boolean()=1 | new_obj.regular_number json_object_get_boolean()=1 | ||||
new_obj.regular_number json_object_get_double()=222.000000 | new_obj.regular_number json_object_get_double()=222.000000 | ||||
new_obj.decimal_number json_object_get_type()=double | new_obj.decimal_number json_object_get_type()=double | ||||
new_obj.decimal_number json_object_get_int()=99 | new_obj.decimal_number json_object_get_int()=99 | ||||
new_obj.decimal_number json_object_get_int64()=99 | new_obj.decimal_number json_object_get_int64()=99 | ||||
new_obj.decimal_number json_object_get_uint64()=99 | |||||
new_obj.decimal_number json_object_get_boolean()=1 | new_obj.decimal_number json_object_get_boolean()=1 | ||||
new_obj.decimal_number json_object_get_double()=99.550000 | new_obj.decimal_number json_object_get_double()=99.550000 | ||||
new_obj.boolean_true json_object_get_type()=boolean | new_obj.boolean_true json_object_get_type()=boolean | ||||
new_obj.boolean_true json_object_get_int()=1 | new_obj.boolean_true json_object_get_int()=1 | ||||
new_obj.boolean_true json_object_get_int64()=1 | new_obj.boolean_true json_object_get_int64()=1 | ||||
new_obj.boolean_true json_object_get_uint64()=1 | |||||
new_obj.boolean_true json_object_get_boolean()=1 | new_obj.boolean_true json_object_get_boolean()=1 | ||||
new_obj.boolean_true json_object_get_double()=1.000000 | new_obj.boolean_true json_object_get_double()=1.000000 | ||||
new_obj.boolean_false json_object_get_type()=boolean | new_obj.boolean_false json_object_get_type()=boolean | ||||
new_obj.boolean_false json_object_get_int()=0 | new_obj.boolean_false json_object_get_int()=0 | ||||
new_obj.boolean_false json_object_get_int64()=0 | new_obj.boolean_false json_object_get_int64()=0 | ||||
new_obj.boolean_false json_object_get_uint64()=0 | |||||
new_obj.boolean_false json_object_get_boolean()=0 | new_obj.boolean_false json_object_get_boolean()=0 | ||||
new_obj.boolean_false json_object_get_double()=0.000000 | new_obj.boolean_false json_object_get_double()=0.000000 | ||||
new_obj.big_number json_object_get_type()=int | |||||
new_obj.big_number json_object_get_int()=2147483647 | |||||
new_obj.big_number json_object_get_int64()=2147483649 | |||||
new_obj.big_number json_object_get_boolean()=1 | |||||
new_obj.big_number json_object_get_double()=2147483649.000000 | |||||
new_obj.int64_number json_object_get_type()=int | |||||
new_obj.int64_number json_object_get_int()=2147483647 | |||||
new_obj.int64_number json_object_get_int64()=2147483649 | |||||
new_obj.int64_number json_object_get_uint64()=2147483649 | |||||
new_obj.int64_number json_object_get_boolean()=1 | |||||
new_obj.int64_number json_object_get_double()=2147483649.000000 | |||||
new_obj.negative_number json_object_get_type()=int | |||||
new_obj.negative_number json_object_get_int()=-321321321 | |||||
new_obj.negative_number json_object_get_int64()=-321321321 | |||||
new_obj.negative_number json_object_get_uint64()=0 | |||||
new_obj.negative_number json_object_get_boolean()=1 | |||||
new_obj.negative_number json_object_get_double()=-321321321.000000 | |||||
new_obj.a_null json_object_get_type()=null | new_obj.a_null json_object_get_type()=null | ||||
new_obj.a_null json_object_get_int()=0 | new_obj.a_null json_object_get_int()=0 | ||||
new_obj.a_null json_object_get_int64()=0 | new_obj.a_null json_object_get_int64()=0 | ||||
new_obj.a_null json_object_get_uint64()=0 | |||||
new_obj.a_null json_object_get_boolean()=0 | new_obj.a_null json_object_get_boolean()=0 | ||||
new_obj.a_null json_object_get_double()=0.000000 | new_obj.a_null json_object_get_double()=0.000000 | ||||
@@ -52,5 +66,6 @@ new_obj.regular_number : 0,0,0,1,0,0,0 | |||||
new_obj.decimal_number : 0,0,1,0,0,0,0 | new_obj.decimal_number : 0,0,1,0,0,0,0 | ||||
new_obj.boolean_true : 0,1,0,0,0,0,0 | new_obj.boolean_true : 0,1,0,0,0,0,0 | ||||
new_obj.boolean_false : 0,1,0,0,0,0,0 | new_obj.boolean_false : 0,1,0,0,0,0,0 | ||||
new_obj.big_number : 0,0,0,1,0,0,0 | |||||
new_obj.int64_number : 0,0,0,1,0,0,0 | |||||
new_obj.negative_number : 0,0,0,1,0,0,0 | |||||
new_obj.a_null : 1,0,0,0,0,0,0 | new_obj.a_null : 1,0,0,0,0,0,0 |
@@ -15,6 +15,11 @@ int main() | |||||
struct json_object *int1 = json_object_new_int(0); | struct json_object *int1 = json_object_new_int(0); | ||||
struct json_object *int2 = json_object_new_int(1); | struct json_object *int2 = json_object_new_int(1); | ||||
struct json_object *int3 = json_object_new_int(1); | struct json_object *int3 = json_object_new_int(1); | ||||
struct json_object *int4 = json_object_new_int(-1); | |||||
struct json_object *uint1 = json_object_new_uint64(0); | |||||
struct json_object *uint2 = json_object_new_uint64(1); | |||||
struct json_object *uint3 = json_object_new_uint64(1); | |||||
struct json_object *uint4 = json_object_new_uint64((uint64_t)INT64_MAX + 100); | |||||
if (!json_object_equal(int1, int2)) | if (!json_object_equal(int1, int2)) | ||||
printf("JSON integer comparison is correct\n"); | printf("JSON integer comparison is correct\n"); | ||||
@@ -31,9 +36,69 @@ int main() | |||||
else | else | ||||
printf("JSON same integer comparison failed\n"); | printf("JSON same integer comparison failed\n"); | ||||
if (!json_object_equal(uint1, uint2)) | |||||
printf("JSON usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON usigned integer comparison failed\n"); | |||||
if (json_object_equal(uint1, uint1)) | |||||
printf("JSON same usigned object comparison is correct\n"); | |||||
else | |||||
printf("JSON same usigned object comparison failed\n"); | |||||
if (json_object_equal(uint2, uint3)) | |||||
printf("JSON same usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON same usigned integer comparison failed\n"); | |||||
if (json_object_equal(int2, uint2)) | |||||
printf("JSON integer & usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON integer & usigned integer comparison failed\n"); | |||||
if (!json_object_equal(int2, uint4)) | |||||
printf("JSON integer & usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON integer & usigned integer comparison failed\n"); | |||||
if (!json_object_equal(int4, uint2)) | |||||
printf("JSON integer & usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON integer & usigned integer comparison failed\n"); | |||||
if (!json_object_equal(int4, uint4)) | |||||
printf("JSON integer & usigned integer comparison is correct\n"); | |||||
else | |||||
printf("JSON integer & usigned integer comparison failed\n"); | |||||
if (json_object_equal(uint2, int2)) | |||||
printf("JSON usigned integer & integer comparison is correct\n"); | |||||
else | |||||
printf("JSON usigned integer & integer comparison failed\n"); | |||||
if (!json_object_equal(uint2, int4)) | |||||
printf("JSON usigned integer & integer comparison is correct\n"); | |||||
else | |||||
printf("JSON usigned integer & integer comparison failed\n"); | |||||
if (!json_object_equal(uint4, int2)) | |||||
printf("JSON usigned integer & integer comparison is correct\n"); | |||||
else | |||||
printf("JSON usigned integer & integer comparison failed\n"); | |||||
if (!json_object_equal(uint4, int4)) | |||||
printf("JSON usigned integer & integer comparison is correct\n"); | |||||
else | |||||
printf("JSON usigned integer & integer comparison failed\n"); | |||||
json_object_put(int1); | json_object_put(int1); | ||||
json_object_put(int2); | json_object_put(int2); | ||||
json_object_put(int3); | json_object_put(int3); | ||||
json_object_put(int4); | |||||
json_object_put(uint1); | |||||
json_object_put(uint2); | |||||
json_object_put(uint3); | |||||
json_object_put(uint4); | |||||
/* string tests */ | /* string tests */ | ||||
struct json_object *str1 = json_object_new_string("TESTSTRING"); | struct json_object *str1 = json_object_new_string("TESTSTRING"); | ||||
@@ -1,6 +1,17 @@ | |||||
JSON integer comparison is correct | JSON integer comparison is correct | ||||
JSON same object comparison is correct | JSON same object comparison is correct | ||||
JSON same integer comparison is correct | JSON same integer comparison is correct | ||||
JSON usigned integer comparison is correct | |||||
JSON same usigned object comparison is correct | |||||
JSON same usigned integer comparison is correct | |||||
JSON integer & usigned integer comparison is correct | |||||
JSON integer & usigned integer comparison is correct | |||||
JSON integer & usigned integer comparison is correct | |||||
JSON integer & usigned integer comparison is correct | |||||
JSON usigned integer & integer comparison is correct | |||||
JSON usigned integer & integer comparison is correct | |||||
JSON usigned integer & integer comparison is correct | |||||
JSON usigned integer & integer comparison is correct | |||||
Comparing equal strings is correct | Comparing equal strings is correct | ||||
Comparing different strings is correct | Comparing different strings is correct | ||||
Comparing equal doubles is correct | Comparing equal doubles is correct | ||||
@@ -30,8 +30,10 @@ int main(int argc, char **argv) | |||||
tmp = json_object_new_int64(INT64_MAX); | tmp = json_object_new_int64(INT64_MAX); | ||||
json_object_int_inc(tmp, 100); | json_object_int_inc(tmp, 100); | ||||
assert(json_object_get_int64(tmp) == INT64_MAX); | assert(json_object_get_int64(tmp) == INT64_MAX); | ||||
assert(json_object_get_uint64(tmp) == (uint64_t)INT64_MAX + 100U); | |||||
json_object_int_inc(tmp, -100); | json_object_int_inc(tmp, -100); | ||||
assert(json_object_get_int64(tmp) != INT64_MAX); | |||||
assert(json_object_get_int64(tmp) == INT64_MAX); | |||||
assert(json_object_get_uint64(tmp) == (uint64_t)INT64_MAX); | |||||
json_object_put(tmp); | json_object_put(tmp); | ||||
printf("INT64 ADD OVERFLOW PASSED\n"); | printf("INT64 ADD OVERFLOW PASSED\n"); | ||||
tmp = json_object_new_int64(INT64_MIN); | tmp = json_object_new_int64(INT64_MIN); | ||||
@@ -41,6 +43,19 @@ int main(int argc, char **argv) | |||||
assert(json_object_get_int64(tmp) != INT64_MIN); | assert(json_object_get_int64(tmp) != INT64_MIN); | ||||
json_object_put(tmp); | json_object_put(tmp); | ||||
printf("INT64 ADD UNDERFLOW PASSED\n"); | printf("INT64 ADD UNDERFLOW PASSED\n"); | ||||
// uint64 + negative int64--> negative int64 | |||||
tmp = json_object_new_uint64(400); | |||||
json_object_int_inc(tmp, -200); | |||||
assert(json_object_get_int64(tmp) == 200); | |||||
assert(json_object_get_uint64(tmp) == 200); | |||||
json_object_put(tmp); | |||||
printf("UINT64 ADD PASSED\n"); | |||||
tmp = json_object_new_uint64(100); | |||||
json_object_int_inc(tmp, -200); | |||||
assert(json_object_get_int64(tmp) == -100); | |||||
assert(json_object_get_uint64(tmp) == 0); | |||||
json_object_put(tmp); | |||||
printf("UINT64 ADD UNDERFLOW PASSED\n"); | |||||
printf("PASSED\n"); | printf("PASSED\n"); | ||||
return 0; | return 0; | ||||
@@ -4,4 +4,6 @@ INT ADD UNDERFLOW PASSED | |||||
INT64 ADD PASSED | INT64 ADD PASSED | ||||
INT64 ADD OVERFLOW PASSED | INT64 ADD OVERFLOW PASSED | ||||
INT64 ADD UNDERFLOW PASSED | INT64 ADD UNDERFLOW PASSED | ||||
UINT64 ADD PASSED | |||||
UINT64 ADD UNDERFLOW PASSED | |||||
PASSED | PASSED |
@@ -128,8 +128,18 @@ static void test_basic_parse() | |||||
single_basic_parse("[0e]", 1); | single_basic_parse("[0e]", 1); | ||||
single_basic_parse("[0e+]", 1); | single_basic_parse("[0e+]", 1); | ||||
single_basic_parse("[0e+-1]", 1); | single_basic_parse("[0e+-1]", 1); | ||||
single_basic_parse("[18446744073709551616]", 1); | |||||
single_basic_parse("\"hello world!\"", 1); | single_basic_parse("\"hello world!\"", 1); | ||||
// uint64/int64 range test | |||||
single_basic_parse("[9223372036854775806]", 1); | |||||
single_basic_parse("[9223372036854775807]", 1); | |||||
single_basic_parse("[9223372036854775808]", 1); | |||||
single_basic_parse("[-9223372036854775807]", 1); | |||||
single_basic_parse("[-9223372036854775808]", 1); | |||||
single_basic_parse("[-9223372036854775809]", 1); | |||||
single_basic_parse("[18446744073709551614]", 1); | |||||
single_basic_parse("[18446744073709551615]", 1); | |||||
single_basic_parse("[18446744073709551616]", 1); | |||||
} | } | ||||
static void test_utf8_parse() | static void test_utf8_parse() | ||||
@@ -66,8 +66,16 @@ new_obj.to_string(false)=false | |||||
new_obj.to_string([0e])=[ 0.0 ] | new_obj.to_string([0e])=[ 0.0 ] | ||||
new_obj.to_string([0e+])=[ 0.0 ] | new_obj.to_string([0e+])=[ 0.0 ] | ||||
new_obj.to_string([0e+-1])=null | new_obj.to_string([0e+-1])=null | ||||
new_obj.to_string([18446744073709551616])=[ 9223372036854775807 ] | |||||
new_obj.to_string("hello world!")="hello world!" | new_obj.to_string("hello world!")="hello world!" | ||||
new_obj.to_string([9223372036854775806])=[ 9223372036854775806 ] | |||||
new_obj.to_string([9223372036854775807])=[ 9223372036854775807 ] | |||||
new_obj.to_string([9223372036854775808])=[ 9223372036854775808 ] | |||||
new_obj.to_string([-9223372036854775807])=[ -9223372036854775807 ] | |||||
new_obj.to_string([-9223372036854775808])=[ -9223372036854775808 ] | |||||
new_obj.to_string([-9223372036854775809])=[ -9223372036854775808 ] | |||||
new_obj.to_string([18446744073709551614])=[ 18446744073709551614 ] | |||||
new_obj.to_string([18446744073709551615])=[ 18446744073709551615 ] | |||||
new_obj.to_string([18446744073709551616])=[ 18446744073709551615 ] | |||||
================================== | ================================== | ||||
new_obj.to_string()=null | new_obj.to_string()=null | ||||
new_obj.to_string({})=null | new_obj.to_string({})=null | ||||
@@ -15,10 +15,18 @@ void checkit(const char *buf) | |||||
printf("buf=%s parseit=%d, value=%" PRId64 " \n", buf, retval, cint64); | printf("buf=%s parseit=%d, value=%" PRId64 " \n", buf, retval, cint64); | ||||
} | } | ||||
void checkit_uint(const char *buf) | |||||
{ | |||||
uint64_t cuint64 = 666; | |||||
int retval = json_parse_uint64(buf, &cuint64); | |||||
printf("buf=%s parseit=%d, value=%" PRIu64 " \n", buf, retval, cuint64); | |||||
} | |||||
/** | /** | ||||
* This test calls json_parse_int64 with a variety of different strings. | |||||
* It's purpose is to ensure that the results are consistent across all | |||||
* different environments that it might be executed in. | |||||
* This test calls json_parse_int64 and json_parse_int64 with a variety | |||||
* of different strings. It's purpose is to ensure that the results are | |||||
* consistent across all different environments that it might be executed in. | |||||
* | * | ||||
* This always exits with a 0 exit value. The output should be compared | * This always exits with a 0 exit value. The output should be compared | ||||
* against previously saved expected output. | * against previously saved expected output. | ||||
@@ -27,6 +35,7 @@ int main() | |||||
{ | { | ||||
char buf[100]; | char buf[100]; | ||||
printf("==========json_parse_int64() test===========\n"); | |||||
checkit("x"); | checkit("x"); | ||||
checkit("0"); | checkit("0"); | ||||
@@ -59,8 +68,10 @@ int main() | |||||
checkit(buf); | checkit(buf); | ||||
strcpy(buf, "4294967295"); // aka UINT32_MAX | strcpy(buf, "4294967295"); // aka UINT32_MAX | ||||
checkit(buf); | |||||
sprintf(buf, "4294967296"); // aka UINT32_MAX + 1 | |||||
strcpy(buf, "4294967296"); // aka UINT32_MAX + 1 | |||||
checkit(buf); | |||||
strcpy(buf, "21474836470"); // INT32_MAX * 10 | strcpy(buf, "21474836470"); // INT32_MAX * 10 | ||||
checkit(buf); | checkit(buf); | ||||
@@ -111,5 +122,68 @@ int main() | |||||
strcpy(buf, "123"); | strcpy(buf, "123"); | ||||
checkit(buf); | checkit(buf); | ||||
printf("\n==========json_parse_uint64() test===========\n"); | |||||
checkit_uint("x"); | |||||
checkit_uint("0"); | |||||
checkit_uint("-0"); | |||||
checkit_uint("00000000"); | |||||
checkit_uint("-00000000"); | |||||
checkit_uint("1"); | |||||
strcpy(buf, "2147483647"); // aka INT32_MAX | |||||
checkit_uint(buf); | |||||
strcpy(buf, "-1"); | |||||
checkit_uint(buf); | |||||
strcpy(buf, "-9223372036854775808"); | |||||
checkit_uint(buf); | |||||
strcpy(buf, " 1"); | |||||
checkit_uint(buf); | |||||
strcpy(buf, "00001234"); | |||||
checkit_uint(buf); | |||||
strcpy(buf, "0001234x"); | |||||
checkit_uint(buf); | |||||
strcpy(buf, "4294967295"); // aka UINT32_MAX | |||||
checkit_uint(buf); | |||||
strcpy(buf, "4294967296"); // aka UINT32_MAX + 1 | |||||
checkit_uint(buf); | |||||
strcpy(buf, "21474836470"); // INT32_MAX * 10 | |||||
checkit_uint(buf); | |||||
strcpy(buf, "31474836470"); // INT32_MAX * 10 + a bunch | |||||
checkit_uint(buf); | |||||
strcpy(buf, "9223372036854775806"); // INT64_MAX - 1 | |||||
checkit_uint(buf); | |||||
strcpy(buf, "9223372036854775807"); // INT64_MAX | |||||
checkit_uint(buf); | |||||
strcpy(buf, "9223372036854775808"); // INT64_MAX + 1 | |||||
checkit_uint(buf); | |||||
strcpy(buf, "18446744073709551614"); // UINT64_MAX - 1 | |||||
checkit_uint(buf); | |||||
strcpy(buf, "18446744073709551615"); // UINT64_MAX | |||||
checkit_uint(buf); | |||||
strcpy(buf, "18446744073709551616"); // UINT64_MAX + 1 | |||||
checkit_uint(buf); | |||||
// Ensure we can still parse valid numbers after parsing out of range ones. | |||||
strcpy(buf, "123"); | |||||
checkit_uint(buf); | |||||
return 0; | return 0; | ||||
} | } |
@@ -1,3 +1,4 @@ | |||||
==========json_parse_int64() test=========== | |||||
buf=x parseit=1, value=-666 | buf=x parseit=1, value=-666 | ||||
buf=0 parseit=0, value=0 | buf=0 parseit=0, value=0 | ||||
buf=-0 parseit=0, value=0 | buf=-0 parseit=0, value=0 | ||||
@@ -11,6 +12,8 @@ buf=00001234 parseit=0, value=1234 | |||||
buf=0001234x parseit=0, value=1234 | buf=0001234x parseit=0, value=1234 | ||||
buf=-00001234 parseit=0, value=-1234 | buf=-00001234 parseit=0, value=-1234 | ||||
buf=-00001234x parseit=0, value=-1234 | buf=-00001234x parseit=0, value=-1234 | ||||
buf=4294967295 parseit=0, value=4294967295 | |||||
buf=4294967296 parseit=0, value=4294967296 | |||||
buf=21474836470 parseit=0, value=21474836470 | buf=21474836470 parseit=0, value=21474836470 | ||||
buf=31474836470 parseit=0, value=31474836470 | buf=31474836470 parseit=0, value=31474836470 | ||||
buf=-2147483647 parseit=0, value=-2147483647 | buf=-2147483647 parseit=0, value=-2147483647 | ||||
@@ -27,3 +30,28 @@ buf=18446744073709551615 parseit=0, value=9223372036854775807 | |||||
buf=18446744073709551616 parseit=0, value=9223372036854775807 | buf=18446744073709551616 parseit=0, value=9223372036854775807 | ||||
buf=-18446744073709551616 parseit=0, value=-9223372036854775808 | buf=-18446744073709551616 parseit=0, value=-9223372036854775808 | ||||
buf=123 parseit=0, value=123 | buf=123 parseit=0, value=123 | ||||
==========json_parse_uint64() test=========== | |||||
buf=x parseit=1, value=666 | |||||
buf=0 parseit=0, value=0 | |||||
buf=-0 parseit=1, value=0 | |||||
buf=00000000 parseit=0, value=0 | |||||
buf=-00000000 parseit=1, value=0 | |||||
buf=1 parseit=0, value=1 | |||||
buf=2147483647 parseit=0, value=2147483647 | |||||
buf=-1 parseit=1, value=18446744073709551615 | |||||
buf=-9223372036854775808 parseit=1, value=9223372036854775808 | |||||
buf= 1 parseit=0, value=1 | |||||
buf=00001234 parseit=0, value=1234 | |||||
buf=0001234x parseit=0, value=1234 | |||||
buf=4294967295 parseit=0, value=4294967295 | |||||
buf=4294967296 parseit=0, value=4294967296 | |||||
buf=21474836470 parseit=0, value=21474836470 | |||||
buf=31474836470 parseit=0, value=31474836470 | |||||
buf=9223372036854775806 parseit=0, value=9223372036854775806 | |||||
buf=9223372036854775807 parseit=0, value=9223372036854775807 | |||||
buf=9223372036854775808 parseit=0, value=9223372036854775808 | |||||
buf=18446744073709551614 parseit=0, value=18446744073709551614 | |||||
buf=18446744073709551615 parseit=0, value=18446744073709551615 | |||||
buf=18446744073709551616 parseit=0, value=18446744073709551615 | |||||
buf=123 parseit=0, value=123 |
@@ -15,6 +15,16 @@ int main(int argc, char **argv) | |||||
assert (json_object_get_int64(tmp)==321321321); | assert (json_object_get_int64(tmp)==321321321); | ||||
json_object_put(tmp); | json_object_put(tmp); | ||||
printf("INT64 PASSED\n"); | printf("INT64 PASSED\n"); | ||||
tmp=json_object_new_uint64(123); | |||||
assert (json_object_get_int(tmp)==123); | |||||
assert (json_object_get_int64(tmp)==123); | |||||
assert (json_object_get_uint64(tmp)==123); | |||||
json_object_set_uint64(tmp,(uint64_t)321321321); | |||||
assert (json_object_get_uint64(tmp)==321321321); | |||||
json_object_set_uint64(tmp,9223372036854775808U); | |||||
assert (json_object_get_uint64(tmp)==9223372036854775808U); | |||||
json_object_put(tmp); | |||||
printf("UINT64 PASSED\n"); | |||||
tmp=json_object_new_boolean(1); | tmp=json_object_new_boolean(1); | ||||
assert (json_object_get_boolean(tmp)==1); | assert (json_object_get_boolean(tmp)==1); | ||||
json_object_set_boolean(tmp,0); | json_object_set_boolean(tmp,0); | ||||
@@ -29,6 +39,12 @@ int main(int argc, char **argv) | |||||
assert (json_object_get_double(tmp)==34.56); | assert (json_object_get_double(tmp)==34.56); | ||||
json_object_set_double(tmp,6435.34); | json_object_set_double(tmp,6435.34); | ||||
assert (json_object_get_double(tmp)==6435.34); | assert (json_object_get_double(tmp)==6435.34); | ||||
json_object_set_double(tmp,2e21); | |||||
assert (json_object_get_int64(tmp)==INT64_MAX); | |||||
assert (json_object_get_uint64(tmp)==UINT64_MAX); | |||||
json_object_set_double(tmp,-2e21); | |||||
assert (json_object_get_int64(tmp)==INT64_MIN); | |||||
assert (json_object_get_uint64(tmp)==0); | |||||
json_object_put(tmp); | json_object_put(tmp); | ||||
printf("DOUBLE PASSED\n"); | printf("DOUBLE PASSED\n"); | ||||
#define SHORT "SHORT" | #define SHORT "SHORT" | ||||
@@ -1,5 +1,6 @@ | |||||
INT PASSED | INT PASSED | ||||
INT64 PASSED | INT64 PASSED | ||||
UINT64 PASSED | |||||
BOOL PASSED | BOOL PASSED | ||||
DOUBLE PASSED | DOUBLE PASSED | ||||
STRING PASSED | STRING PASSED | ||||