diff options
-rw-r--r-- | include/apr_json.h | 23 | ||||
-rw-r--r-- | json/apr_json.c | 26 | ||||
-rw-r--r-- | json/apr_json_decode.c | 6 |
3 files changed, 29 insertions, 26 deletions
diff --git a/include/apr_json.h b/include/apr_json.h index a41180eae..06ec58ebf 100644 --- a/include/apr_json.h +++ b/include/apr_json.h @@ -178,7 +178,7 @@ struct apr_json_object_t { * Use apr_json_array_create() to allocate. */ struct apr_json_array_t { - /** The values in the array are in this list */ + /** The key value pairs in the object are in this list */ APR_RING_HEAD(apr_json_array_list_t, apr_json_value_t) list; /** Array of JSON objects */ apr_array_header_t *array; @@ -271,9 +271,8 @@ APR_DECLARE(apr_json_value_t *) /** * Associate a value with a key in a JSON object. * @param obj The JSON object. - * @param key Pointer to the key. - * @param klen Length of the key, or APR_JSON_VALUE_STRING if NUL - * terminated. + * @param key Pointer to the key string, including any whitespace + * required. * @param val Value to associate with the key. * @param pool Pool to use. * @return APR_SUCCESS on success, APR_EINVAL if the key is @@ -281,19 +280,20 @@ APR_DECLARE(apr_json_value_t *) * @remark If the value is NULL the key value pair is deleted. */ APR_DECLARE(apr_status_t) apr_json_object_set(apr_json_value_t *obj, - const char *key, apr_ssize_t klen, apr_json_value_t *val, - apr_pool_t *pool) __attribute__((nonnull(1, 2, 5))); + apr_json_value_t *key, apr_json_value_t *val, + apr_pool_t *pool) __attribute__((nonnull(1, 4))); /** * Look up the value associated with a key in a JSON object. * @param obj The JSON object. * @param key Pointer to the key. * @param klen Length of the key, or APR_JSON_VALUE_STRING if NUL - * terminated. + * terminated. * @return Returns NULL if the key is not present. */ -APR_DECLARE(apr_json_kv_t *) apr_json_object_get(apr_json_value_t *obj, - const char *key, apr_ssize_t klen) +APR_DECLARE(apr_json_kv_t *) + apr_json_object_get(apr_json_value_t *obj, const char *key, + apr_ssize_t klen) __attribute__((nonnull(1, 2))); /** @@ -325,12 +325,13 @@ APR_DECLARE(apr_json_kv_t *) apr_json_object_next(apr_json_value_t *obj, * Add the value to the end of this array. * @param arr The JSON array. * @param val Value to add to the array. + * @param pool Pool to use. * @return APR_SUCCESS on success, APR_EINVAL if the array value is not * an APR_JSON_ARRAY. */ APR_DECLARE(apr_status_t) apr_json_array_add(apr_json_value_t *arr, - apr_json_value_t *val) - __attribute__((nonnull(1, 2))); + apr_json_value_t *val, apr_pool_t *pool) + __attribute__((nonnull(1, 2, 3))); /** * Look up the value associated with a key in a JSON object. diff --git a/json/apr_json.c b/json/apr_json.c index d3bc8329d..b8b55fc9a 100644 --- a/json/apr_json.c +++ b/json/apr_json.c @@ -129,23 +129,25 @@ apr_json_value_t *apr_json_null_create(apr_pool_t *pool) return json; } -apr_status_t apr_json_object_set(apr_json_value_t *object, const char *key, - apr_ssize_t klen, apr_json_value_t *val, apr_pool_t *pool) +apr_status_t apr_json_object_set(apr_json_value_t *object, apr_json_value_t *key, + apr_json_value_t *val, apr_pool_t *pool) { apr_json_kv_t *kv; apr_hash_t *hash; - if (object->type != APR_JSON_OBJECT) { + if (object->type != APR_JSON_OBJECT || !key + || key->type != APR_JSON_STRING) { return APR_EINVAL; } hash = object->value.object->hash; - kv = apr_hash_get(hash, key, klen); + kv = apr_hash_get(hash, key->value.string.p, key->value.string.len); if (!val) { if (kv) { - apr_hash_set(hash, key, klen, NULL); + apr_hash_set(hash, key->value.string.p, key->value.string.len, + NULL); APR_RING_REMOVE((kv), link); } return APR_SUCCESS; @@ -155,10 +157,11 @@ apr_status_t apr_json_object_set(apr_json_value_t *object, const char *key, kv = apr_palloc(pool, sizeof(apr_json_kv_t)); APR_RING_ELEM_INIT(kv, link); APR_JSON_OBJECT_INSERT_TAIL(object->value.object, kv); - kv->k = apr_json_string_create(pool, key, klen); - apr_hash_set(hash, kv->k->value.string.p, kv->k->value.string.len, kv); + apr_hash_set(hash, key->value.string.p, key->value.string.len, + kv); } + kv->k = key; kv->v = val; return APR_SUCCESS; @@ -209,7 +212,8 @@ apr_json_kv_t *apr_json_object_next(apr_json_value_t *obj, apr_json_kv_t *kv) } } -apr_status_t apr_json_array_add(apr_json_value_t *arr, apr_json_value_t *val) +apr_status_t apr_json_array_add(apr_json_value_t *arr, + apr_json_value_t *val, apr_pool_t *pool) { apr_array_header_t *array; @@ -312,8 +316,7 @@ apr_json_value_t *apr_json_overlay(apr_pool_t *p, if (!apr_hash_get(overlay->value.object->hash, kv->k->value.string.p, kv->k->value.string.len)) { - apr_json_object_set(res, kv->k->value.string.p, - kv->k->value.string.len, kv->v, p); + apr_json_object_set(res, kv->k, kv->v, p); } else if (APR_JSON_FLAGS_STRICT & flags) { @@ -326,8 +329,7 @@ apr_json_value_t *apr_json_overlay(apr_pool_t *p, kv != APR_RING_SENTINEL(&(overlay->value.object)->list, apr_json_kv_t, link); kv = APR_RING_NEXT((kv), link)) { - apr_json_object_set(res, kv->k->value.string.p, - kv->k->value.string.len, kv->v, p); + apr_json_object_set(res, kv->k, kv->v, p); } diff --git a/json/apr_json_decode.c b/json/apr_json_decode.c index d4b8b315d..e8d44013b 100644 --- a/json/apr_json_decode.c +++ b/json/apr_json_decode.c @@ -390,7 +390,8 @@ static apr_status_t apr_json_decode_array(apr_json_scanner_t * self, return status; } - if (APR_SUCCESS != (status = apr_json_array_add(array, element))) { + if (APR_SUCCESS + != (status = apr_json_array_add(array, element, self->pool))) { return status; } @@ -500,8 +501,7 @@ static apr_status_t apr_json_decode_object(apr_json_scanner_t * self, if ((status = apr_json_decode_value(self, &value))) goto out; - apr_json_object_set(json, key->value.string.p, key->value.string.len, - value, self->pool); + apr_json_object_set(json, key, value, self->pool); if (self->p == self->e) { status = APR_EOF; |