Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #338, add json_object_add_int functions #363

Merged
merged 1 commit into from Nov 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 26 additions & 0 deletions json_object.c
Expand Up @@ -666,6 +666,19 @@ int json_object_set_int(struct json_object *jso,int new_value){
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)
{
Expand Down Expand Up @@ -711,6 +724,19 @@ int json_object_set_int64(struct json_object *jso,int64_t new_value){
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 */

#if defined(HAVE___THREAD)
Expand Down
31 changes: 31 additions & 0 deletions json_object.h
Expand Up @@ -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);

/** 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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe more of a preference [from me] here, but, keeping the name json_object_inc_int() [like mentioned in issue #338 ] or similar, could be a good idea, because it makes it clearer that it's incrementing an int value;

in the context of libjson-c a name that like json_object_add_xxx reminds me of the json_object_object_add() or json_object_array_add() functions where a JSON object is added to a another JSON object

i'd also rename the int val param to int inc
and you can also create a convenience macro called json_object_dec_int() where

#define json_object_dec_int(x,y)    json_object_inc_int(x, -(y))

but these are all just preferences/thoughts :)



/** Get the int value of a json_object
*
Expand Down Expand Up @@ -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);

/** 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 */

Expand Down
1 change: 1 addition & 0 deletions tests/Makefile.am
Expand Up @@ -25,6 +25,7 @@ TESTS+= test_compare.test
TESTS+= test_set_value.test
TESTS+= test_visit.test
TESTS+= test_json_pointer.test
TESTS+= test_int_add.test

check_PROGRAMS=
check_PROGRAMS += $(TESTS:.test=)
Expand Down
41 changes: 41 additions & 0 deletions tests/test_int_add.c
@@ -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;
}
7 changes: 7 additions & 0 deletions tests/test_int_add.expected
@@ -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
1 change: 1 addition & 0 deletions tests/test_int_add.test