Browse Source

At json_object_to_json_string_length()

* Failure case set first, to be default action
* no clutter and no fail cases after
pull/517/head
Lauri Jakku 6 years ago
parent
commit
355cd0d4f0
1 changed files with 65 additions and 22 deletions
  1. +65
    -22
      json_object.c

+ 65
- 22
json_object.c View File

@@ -220,14 +220,16 @@ static void json_object_generic_delete(struct json_object* jso)
lh_table_delete(json_object_table, jso); lh_table_delete(json_object_table, jso);
#endif /* REFCOUNT_DEBUG */ #endif /* REFCOUNT_DEBUG */
printbuf_free(jso->_pb); printbuf_free(jso->_pb);
jso->_pb = NULL;
free(jso); free(jso);
jso= NULL;
} }


static struct json_object* json_object_new(enum json_type o_type) static struct json_object* json_object_new(enum json_type o_type)
{ {
struct json_object *jso; struct json_object *jso;


jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
jso = (struct json_object*)calloc(1, sizeof(struct json_object));
if (!jso) if (!jso)
return NULL; return NULL;
jso->o_type = o_type; jso->o_type = o_type;
@@ -325,27 +327,35 @@ const char* json_object_to_json_string_length(struct json_object *jso, int flags
const char *r = NULL; const char *r = NULL;
size_t s = 0; size_t s = 0;


if (!jso)
{
s = 4;
r = "null";
}
else if ((jso->_pb) || (jso->_pb = printbuf_new()))
/* Failure case set first */
s = 4;
r = "null";
/* no clutter and no fail cases after */
if (jso)
{ {
printbuf_reset(jso->_pb);
if ( jso->_pb == NULL )
jso->_pb = printbuf_new();


if(jso->_to_json_string(jso, jso->_pb, 0, flags) >= 0)
if ( jso->_pb != NULL )
{ {
s = (size_t)jso->_pb->bpos;
r = jso->_pb->buf;
printbuf_reset(jso->_pb);

if(jso->_to_json_string(jso, jso->_pb, 0, flags) >= 0)
{
s = (size_t)jso->_pb->bpos;
r = jso->_pb->buf;
}
} }
} }


if (length) if (length)
*length = s; *length = s;

return r; return r;
} }



const char* json_object_to_json_string_ext(struct json_object *jso, int flags) const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
{ {
return json_object_to_json_string_length(jso, flags, NULL); return json_object_to_json_string_length(jso, flags, NULL);
@@ -400,10 +410,12 @@ static int json_object_object_to_json_string(struct json_object* jso,
indent(pb, level+1, flags); indent(pb, level+1, flags);
printbuf_strappend(pb, "\""); printbuf_strappend(pb, "\"");
json_escape_str(pb, iter.key, strlen(iter.key), flags); json_escape_str(pb, iter.key, strlen(iter.key), flags);

if (flags & JSON_C_TO_STRING_SPACED) if (flags & JSON_C_TO_STRING_SPACED)
printbuf_strappend(pb, "\": "); printbuf_strappend(pb, "\": ");
else else
printbuf_strappend(pb, "\":"); printbuf_strappend(pb, "\":");

if(iter.val == NULL) if(iter.val == NULL)
printbuf_strappend(pb, "null"); printbuf_strappend(pb, "null");
else else
@@ -467,6 +479,19 @@ struct lh_table* json_object_get_object(const struct json_object *jso)
} }
} }


static char *stringdup(const char *s)
{
size_t len = strnlen (s, 1024) + 1;
char *new = malloc (len);

if (new == NULL)
return NULL;

new[len] = 0;
return (char *) memcpy (new, s, len);
}


int json_object_object_add_ex(struct json_object* jso, int json_object_object_add_ex(struct json_object* jso,
const char *const key, const char *const key,
struct json_object *const val, struct json_object *const val,
@@ -481,9 +506,9 @@ int json_object_object_add_ex(struct json_object* jso,
// We lookup the entry and replace the value, rather than just deleting // We lookup the entry and replace the value, rather than just deleting
// and re-adding it, so the existing key remains valid. // and re-adding it, so the existing key remains valid.
hash = lh_get_hash(jso->o.c_object, (const void *)key); hash = lh_get_hash(jso->o.c_object, (const void *)key);
existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL :
lh_table_lookup_entry_w_hash(jso->o.c_object,
(const void *)key, hash);
existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ?
NULL :
lh_table_lookup_entry_w_hash(jso->o.c_object, (const void *)key, hash);


// The caller must avoid creating loops in the object tree, but do a // The caller must avoid creating loops in the object tree, but do a
// quick check anyway to make sure we're not creating a trivial loop. // quick check anyway to make sure we're not creating a trivial loop.
@@ -492,17 +517,26 @@ int json_object_object_add_ex(struct json_object* jso,


if (!existing_entry) if (!existing_entry)
{ {
const void *const k = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ?
(const void *)key : strdup(key);
char *key_dup = stringdup(key);

/* key duplicate must be done first */
const void *const k = ((opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ? (const void *)key : (const void *)key_dup);

/* key duplicate must be freed here if constant */
if (opts & JSON_C_OBJECT_KEY_IS_CONSTANT)
free(key_dup);

if (k == NULL) if (k == NULL)
return -1; return -1;

return lh_table_insert_w_hash(jso->o.c_object, k, val, hash, opts); return lh_table_insert_w_hash(jso->o.c_object, k, val, hash, opts);
} else {
existing_value = (json_object *) lh_entry_v(existing_entry);
if (existing_value)
json_object_put(existing_value);
existing_entry->v = val;
return 0;
} }
existing_value = (json_object *) lh_entry_v(existing_entry);
if (existing_value)
json_object_put(existing_value);
existing_entry->v = val;
return 0;
} }


int json_object_object_add(struct json_object* jso, const char *key, int json_object_object_add(struct json_object* jso, const char *key,
@@ -1491,7 +1525,15 @@ int json_object_deep_copy(struct json_object *src, struct json_object **dst, jso
int rc; int rc;


/* Check if arguments are sane ; *dst must not point to a non-NULL object */ /* Check if arguments are sane ; *dst must not point to a non-NULL object */
if (!src || !dst || *dst) {
if (!src) {
errno = EINVAL;
return -1;
}
if (!dst) {
errno = EINVAL;
return -1;
}
if (*dst) {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
@@ -1501,6 +1543,7 @@ int json_object_deep_copy(struct json_object *src, struct json_object **dst, jso


rc = json_object_deep_copy_recursive(src, NULL, NULL, -1, dst, shallow_copy); rc = json_object_deep_copy_recursive(src, NULL, NULL, -1, dst, shallow_copy);
if (rc < 0) { if (rc < 0) {

json_object_put(*dst); json_object_put(*dst);
*dst = NULL; *dst = NULL;
} }


Loading…
Cancel
Save