Issue #338, add json_object_add_int functionstags/json-c-0.13-20171207
@@ -666,6 +666,19 @@ int json_object_set_int(struct json_object *jso,int new_value){ | |||||
return 1; | return 1; | ||||
} | } | ||||
int json_object_add_int(struct json_object *jso, int val) { | |||||
if (!jso || jso->o_type != json_type_int) | |||||
return 0; | |||||
if (val > 0 && jso->o.c_int64 > INT32_MAX - val) { | |||||
jso->o.c_int64 = INT32_MAX; | |||||
} else if (val < 0 && jso->o.c_int64 < INT32_MIN - val) { | |||||
jso->o.c_int64 = INT32_MIN; | |||||
} else { | |||||
jso->o.c_int64 += val; | |||||
} | |||||
return 1; | |||||
} | |||||
struct json_object* json_object_new_int64(int64_t i) | struct json_object* json_object_new_int64(int64_t i) | ||||
{ | { | ||||
@@ -711,6 +724,19 @@ int json_object_set_int64(struct json_object *jso,int64_t new_value){ | |||||
return 1; | return 1; | ||||
} | } | ||||
int json_object_add_int64(struct json_object *jso, int64_t val) { | |||||
if (!jso || jso->o_type != json_type_int) | |||||
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; | |||||
} | |||||
return 1; | |||||
} | |||||
/* json_object_double */ | /* json_object_double */ | ||||
#if defined(HAVE___THREAD) | #if defined(HAVE___THREAD) | ||||
@@ -718,6 +718,22 @@ JSON_EXPORT int32_t json_object_get_int(const struct json_object *obj); | |||||
*/ | */ | ||||
JSON_EXPORT int json_object_set_int(struct json_object *obj,int new_value); | JSON_EXPORT int json_object_set_int(struct json_object *obj,int new_value); | ||||
/** Add the int value to the value of a json object | |||||
* | |||||
* The type of obj is checked to be a json type int and 0 is returned | |||||
* if it is not without any further actions. If the type of obj is | |||||
* json_type_int the int value is added to the object value. | |||||
* If the addition would result in a overflow, the object value | |||||
* is set to INT32_MAX. | |||||
* If the addition would result in a underflow, the object value | |||||
* is set to INT32_MIN. | |||||
* | |||||
* @param obj the json_object instance | |||||
* @param val the value to add | |||||
* @returns 1 if the addition succeded, 0 otherwise | |||||
*/ | |||||
JSON_EXPORT int json_object_add_int(struct json_object *obj, int val); | |||||
/** Get the int value of a json_object | /** Get the int value of a json_object | ||||
* | * | ||||
@@ -747,6 +763,21 @@ 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); | ||||
/** Add a int64_t value to the int64_t value of a json_object | |||||
* | |||||
* The type of obj is checked to be a json_type_int and 0 is returned | |||||
* if it is not without any further actions. If the type of obj is | |||||
* json_type_int the int64 value is added to the object value. | |||||
* If the addition to the object would result in a overflow the | |||||
* object value is set to INT64_MAX. | |||||
* If the addition would result in a underflow, the | |||||
* object value is set to INT64_MIN. | |||||
* | |||||
* @param obj the json_object instance | |||||
* @param val the int64_vaule to add | |||||
* @returns 1 if the addition succeeded, 0 otherwise | |||||
*/ | |||||
JSON_EXPORT int json_object_add_int64(struct json_object *obj, int64_t val); | |||||
/* double type methods */ | /* double type methods */ | ||||
@@ -25,6 +25,7 @@ TESTS+= test_compare.test | |||||
TESTS+= test_set_value.test | TESTS+= test_set_value.test | ||||
TESTS+= test_visit.test | TESTS+= test_visit.test | ||||
TESTS+= test_json_pointer.test | TESTS+= test_json_pointer.test | ||||
TESTS+= test_int_add.test | |||||
check_PROGRAMS= | check_PROGRAMS= | ||||
check_PROGRAMS += $(TESTS:.test=) | check_PROGRAMS += $(TESTS:.test=) | ||||
@@ -0,0 +1,41 @@ | |||||
#include <assert.h> | |||||
#include <stdio.h> | |||||
#include "json.h" | |||||
int main(int argc, char **argv) | |||||
{ | |||||
json_object *tmp = json_object_new_int(123); | |||||
json_object_add_int(tmp, 123); | |||||
assert(json_object_get_int(tmp) == 246); | |||||
json_object_put(tmp); | |||||
printf("INT ADD PASSED\n"); | |||||
tmp = json_object_new_int(INT32_MAX); | |||||
json_object_add_int(tmp, 100); | |||||
assert(json_object_get_int(tmp) == INT32_MAX); | |||||
json_object_put(tmp); | |||||
printf("INT ADD OVERFLOW PASSED\n"); | |||||
tmp = json_object_new_int(INT32_MIN); | |||||
json_object_add_int(tmp, -100); | |||||
assert(json_object_get_int(tmp) == INT32_MIN); | |||||
json_object_put(tmp); | |||||
printf("INT ADD UNDERFLOW PASSED\n"); | |||||
tmp = json_object_new_int64(321321321); | |||||
json_object_add_int(tmp, 321321321); | |||||
assert(json_object_get_int(tmp) == 642642642); | |||||
json_object_put(tmp); | |||||
printf("INT64 ADD PASSED\n"); | |||||
tmp = json_object_new_int64(INT64_MAX); | |||||
json_object_add_int64(tmp, 100); | |||||
assert(json_object_get_int64(tmp) == INT64_MAX); | |||||
json_object_put(tmp); | |||||
printf("INT64 ADD OVERFLOW PASSED\n"); | |||||
tmp = json_object_new_int64(INT64_MIN); | |||||
json_object_add_int64(tmp, -100); | |||||
assert(json_object_get_int64(tmp) == INT64_MIN); | |||||
json_object_put(tmp); | |||||
printf("INT64 ADD UNDERFLOW PASSED\n"); | |||||
printf("PASSED\n"); | |||||
return 0; | |||||
} |
@@ -0,0 +1,7 @@ | |||||
INT ADD PASSED | |||||
INT ADD OVERFLOW PASSED | |||||
INT ADD UNDERFLOW PASSED | |||||
INT64 ADD PASSED | |||||
INT64 ADD OVERFLOW PASSED | |||||
INT64 ADD UNDERFLOW PASSED | |||||
PASSED |
@@ -0,0 +1 @@ | |||||
test_basic.test |