summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2018-09-01 10:04:16 +0000
committerGraham Leggett <minfrin@apache.org>2018-09-01 10:04:16 +0000
commit5f2629a7697bf106e7473c854674384443d1a763 (patch)
tree1c3bd8600a297e1b33fcca12698e3e5b3a2db0c4
parent42fb641622c00adc6c822cdfc78ebecc73cfc3fe (diff)
downloadapr-5f2629a7697bf106e7473c854674384443d1a763.tar.gz
Revert 1839755 for now to unblock apr_jose.h.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1839813 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--include/apr_json.h23
-rw-r--r--json/apr_json.c26
-rw-r--r--json/apr_json_decode.c6
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;