update json_object.c and testcase, delete json_object_uint_inc()

This commit is contained in:
dota17
2020-02-28 11:18:48 +08:00
parent 9532f94fa4
commit 6359b79847
4 changed files with 19 additions and 88 deletions

View File

@@ -594,8 +594,10 @@ json_bool json_object_get_boolean(const struct json_object *jso)
switch(jso->o.c_int.cint_type) { switch(jso->o.c_int.cint_type) {
case json_object_int_type_int64: case json_object_int_type_int64:
return (jso->o.c_int.cint.c_int64 != 0); return (jso->o.c_int.cint.c_int64 != 0);
default: case json_object_int_type_uint64:
return (jso->o.c_int.cint.c_uint64 != 0); 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);
@@ -624,11 +626,9 @@ 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];
if (jso->o.c_int.cint_type == json_object_int_type_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); snprintf(sbuf, sizeof(sbuf), "%" PRId64, jso->o.c_int.cint.c_int64);
else if (jso->o.c_int.cint_type == json_object_int_type_uint64)
snprintf(sbuf, sizeof(sbuf), "%" PRIu64, jso->o.c_int.cint.c_uint64);
else else
return 0; 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));
} }
@@ -653,7 +653,7 @@ int32_t json_object_get_int(const struct json_object *jso)
o_type = jso->o_type; o_type = jso->o_type;
if (jso->o.c_int.cint_type == json_object_int_type_int64) { if (jso->o.c_int.cint_type == json_object_int_type_int64) {
cint64 = jso->o.c_int.cint.c_int64; cint64 = jso->o.c_int.cint.c_int64;
} else if (jso->o.c_int.cint_type == json_object_int_type_uint64) { } else {
if (jso->o.c_int.cint.c_uint64 >= INT64_MAX) if (jso->o.c_int.cint.c_uint64 >= INT64_MAX)
cint64 = INT64_MAX; cint64 = INT64_MAX;
cint64 = (int64_t)jso->o.c_int.cint.c_uint64; cint64 = (int64_t)jso->o.c_int.cint.c_uint64;
@@ -734,7 +734,7 @@ int64_t json_object_get_int64(const struct json_object *jso)
return INT64_MAX; return INT64_MAX;
return (int64_t)jso->o.c_int.cint.c_uint64; return (int64_t)jso->o.c_int.cint.c_uint64;
default: default:
return 0; 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
@@ -772,7 +772,7 @@ uint64_t json_object_get_uint64(const struct json_object *jso)
case json_object_int_type_uint64: case json_object_int_type_uint64:
return jso->o.c_int.cint.c_uint64; return jso->o.c_int.cint.c_uint64;
default: default:
return 0; assert(0);
} }
case json_type_double: case json_type_double:
// UINT64_MAX can't be exactly represented as a double // UINT64_MAX can't be exactly represented as a double
@@ -830,40 +830,13 @@ int json_object_int_inc(struct json_object *jso, int64_t val) {
jso->o.c_int.cint.c_int64 = (int64_t)jso->o.c_int.cint.c_uint64 + 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; 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)) { } else if (val < 0 && jso->o.c_int.cint.c_uint64 >= (uint64_t)(-val)) {
jso->o.c_int.cint.c_uint64 = jso->o.c_int.cint.c_uint64 - (uint64_t)(-val); jso->o.c_int.cint.c_uint64 -= (uint64_t)(-val);
} else { } else {
jso->o.c_int.cint.c_uint64 += val; jso->o.c_int.cint.c_uint64 += val;
} }
return 1; return 1;
default: default:
return 0; assert(0);
}
}
int json_object_uint_inc(struct json_object *jso, uint64_t val) {
if (!jso || jso->o_type != json_type_int)
return 0;
switch(jso->o.c_int.cint_type) {
case json_object_int_type_int64:
if ((uint64_t)jso->o.c_int.cint.c_uint64 + val> UINT64_MAX) {
jso->o.c_int.cint.c_uint64 = UINT64_MAX;
jso->o.c_int.cint_type = json_object_int_type_uint64;
} else if ((uint64_t)jso->o.c_int.cint.c_uint64 + val < INT64_MAX) {
jso->o.c_int.cint.c_int64 += (int64_t)val;
} else {
jso->o.c_int.cint.c_uint64 =(uint64_t) jso->o.c_int.cint.c_uint64 + val;
jso->o.c_int.cint_type = json_object_int_type_uint64;
}
return 1;
case json_object_int_type_uint64:
if (jso->o.c_int.cint.c_uint64 > UINT64_MAX - val) {
jso->o.c_int.cint.c_uint64 = UINT64_MAX;
} else {
jso->o.c_int.cint.c_uint64 += val;
}
return 1;
default:
return 0;
} }
} }
@@ -1094,8 +1067,8 @@ double json_object_get_double(const struct json_object *jso)
case json_object_int_type_uint64: case json_object_int_type_uint64:
return jso->o.c_int.cint.c_uint64; return jso->o.c_int.cint.c_uint64;
default: default:
return 0.0; 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:
@@ -1475,26 +1448,22 @@ int json_object_equal(struct json_object* jso1, struct json_object* jso2)
case json_type_int: case json_type_int:
if (jso1->o.c_int.cint_type == json_object_int_type_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) 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); return (jso1->o.c_int.cint.c_int64 == jso2->o.c_int.cint.c_int64);
if (jso2->o.c_int.cint_type == json_object_int_type_uint64) { } else {
if (jso1->o.c_int.cint.c_int64 < 0) if (jso1->o.c_int.cint.c_int64 < 0)
return 0; return 0;
return ((uint64_t)jso1->o.c_int.cint.c_int64 == jso2->o.c_int.cint.c_uint64); return ((uint64_t)jso1->o.c_int.cint.c_int64 == jso2->o.c_int.cint.c_uint64);
} }
return 0; } else {
} if (jso2->o.c_int.cint_type == json_object_int_type_uint64) {
if (jso1->o.c_int.cint_type == json_object_int_type_uint64) {
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); return (jso1->o.c_int.cint.c_uint64 == jso2->o.c_int.cint.c_uint64);
if (jso2->o.c_int.cint_type == json_object_int_type_int64){ } else {
if (jso2->o.c_int.cint.c_int64 < 0) if (jso2->o.c_int.cint.c_int64 < 0)
return 0; return 0;
return (jso1->o.c_int.cint.c_uint64 == (uint64_t)jso2->o.c_int.cint.c_int64); return (jso1->o.c_int.cint.c_uint64 == (uint64_t)jso2->o.c_int.cint.c_int64);
} }
return 0;
} }
return 0;
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 &&
@@ -1563,6 +1532,8 @@ int json_c_shallow_copy_default(json_object *src, json_object *parent, const cha
case json_object_int_type_uint64: case json_object_int_type_uint64:
*dst = json_object_new_uint64(src->o.c_int.cint.c_uint64); *dst = json_object_new_uint64(src->o.c_int.cint.c_uint64);
break; break;
default:
assert(0);
} }
break; break;

View File

@@ -752,20 +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);
/** Increment a json_type_uint object by the given amount, which may be negative.
*
* If the type of obj is not json_type_uint then 0 is returned with no further
* action taken.
* If the addition would result in a overflow, the object value
* is set to UINT64_MAX.
* Neither overflow nor underflow affect the return value.
*
* @param obj the json_object instance
* @param val the value to add
* @returns 1 if the increment succeded, 0 otherwise
*/
JSON_EXPORT int json_object_uint_inc(struct json_object *obj, uint64_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.

View File

@@ -25,8 +25,6 @@ int main(int argc, char **argv)
tmp = json_object_new_int64(321321321); tmp = json_object_new_int64(321321321);
json_object_int_inc(tmp, 321321321); json_object_int_inc(tmp, 321321321);
assert(json_object_get_int(tmp) == 642642642); assert(json_object_get_int(tmp) == 642642642);
json_object_uint_inc(tmp, 321321321U);
assert(json_object_get_int(tmp) == 963963963);
json_object_put(tmp); json_object_put(tmp);
printf("INT64 ADD PASSED\n"); printf("INT64 ADD PASSED\n");
tmp = json_object_new_int64(INT64_MAX); tmp = json_object_new_int64(INT64_MAX);
@@ -37,16 +35,6 @@ int main(int argc, char **argv)
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); assert(json_object_get_uint64(tmp) == (uint64_t)INT64_MAX);
json_object_put(tmp); json_object_put(tmp);
tmp = json_object_new_int64(100);
json_object_uint_inc(tmp, 100);
assert(json_object_get_int64(tmp) == 200);
json_object_uint_inc(tmp, (uint64_t)INT64_MAX);
assert(json_object_get_int64(tmp) == INT64_MAX);
assert(json_object_get_uint64(tmp) == (uint64_t)INT64_MAX+200);
json_object_uint_inc(tmp, UINT64_MAX);
assert(json_object_get_int64(tmp) == INT64_MAX);
assert(json_object_get_uint64(tmp) == UINT64_MAX);
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);
json_object_int_inc(tmp, -100); json_object_int_inc(tmp, -100);
@@ -55,10 +43,6 @@ 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");
tmp = json_object_new_uint64(321321321);
json_object_uint_inc(tmp, 321321321);
assert(json_object_get_uint64(tmp) == 642642642);
json_object_put(tmp);
// uint64 + negative int64--> negative int64 // uint64 + negative int64--> negative int64
tmp = json_object_new_uint64(400); tmp = json_object_new_uint64(400);
json_object_int_inc(tmp, -200); json_object_int_inc(tmp, -200);
@@ -66,15 +50,6 @@ int main(int argc, char **argv)
assert(json_object_get_uint64(tmp) == 200); assert(json_object_get_uint64(tmp) == 200);
json_object_put(tmp); json_object_put(tmp);
printf("UINT64 ADD PASSED\n"); printf("UINT64 ADD PASSED\n");
tmp = json_object_new_uint64(UINT64_MAX);
json_object_uint_inc(tmp, 100);
assert(json_object_get_uint64(tmp) == UINT64_MAX);
json_object_put(tmp);
tmp = json_object_new_uint64(UINT64_MAX - 100);
json_object_uint_inc(tmp, 200);
assert(json_object_get_uint64(tmp) == UINT64_MAX);
json_object_put(tmp);
printf("UINT64 ADD OVERFLOW PASSED\n");
tmp = json_object_new_uint64(100); tmp = json_object_new_uint64(100);
json_object_int_inc(tmp, -200); json_object_int_inc(tmp, -200);
assert(json_object_get_int64(tmp) == -100); assert(json_object_get_int64(tmp) == -100);

View File

@@ -5,6 +5,5 @@ INT64 ADD PASSED
INT64 ADD OVERFLOW PASSED INT64 ADD OVERFLOW PASSED
INT64 ADD UNDERFLOW PASSED INT64 ADD UNDERFLOW PASSED
UINT64 ADD PASSED UINT64 ADD PASSED
UINT64 ADD OVERFLOW PASSED
UINT64 ADD UNDERFLOW PASSED UINT64 ADD UNDERFLOW PASSED
PASSED PASSED