summaryrefslogtreecommitdiff
path: root/json
diff options
context:
space:
mode:
authorGraham Leggett <minfrin@apache.org>2018-09-01 20:06:18 +0000
committerGraham Leggett <minfrin@apache.org>2018-09-01 20:06:18 +0000
commitee50e50e73418b0f1c3fac2be11f73ea773c78f0 (patch)
treee539a9087a3f38a1e27eeb8f037a2fdc03609871 /json
parent49c6f8385af187c1a66b0719829e1c7f17de301b (diff)
downloadapr-ee50e50e73418b0f1c3fac2be11f73ea773c78f0.tar.gz
apr_json: Split apr_json_object_set() into apr_json_object_set() with
a simple key, and apr_json_object_set() with the key as an apr_json_value_t, so the caller has a simpler interface to use to add a key value pair to an object. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1839840 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'json')
-rw-r--r--json/apr_json.c52
-rw-r--r--json/apr_json_decode.c2
2 files changed, 48 insertions, 6 deletions
diff --git a/json/apr_json.c b/json/apr_json.c
index ad4281cc2..4b5867fc0 100644
--- a/json/apr_json.c
+++ b/json/apr_json.c
@@ -129,13 +129,55 @@ 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, apr_json_value_t *key,
- apr_json_value_t *val, apr_pool_t *pool)
+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_json_kv_t *kv;
apr_hash_t *hash;
- if (object->type != APR_JSON_OBJECT || !key
+ if (object->type != APR_JSON_OBJECT) {
+ return APR_EINVAL;
+ }
+
+ if (klen == APR_JSON_VALUE_STRING) {
+ klen = strlen(key);
+ }
+
+ hash = object->value.object->hash;
+
+ kv = apr_hash_get(hash, key, klen);
+
+ if (!val) {
+ if (kv) {
+ apr_hash_set(hash, key, klen, NULL);
+ APR_RING_REMOVE((kv), link);
+ }
+ return APR_SUCCESS;
+ }
+
+ if (!kv) {
+ kv = apr_palloc(pool, sizeof(apr_json_kv_t));
+ APR_RING_ELEM_INIT(kv, link);
+ APR_JSON_OBJECT_INSERT_TAIL(object->value.object, kv);
+ apr_hash_set(hash, key, klen,
+ kv);
+ }
+
+ kv->k = apr_json_string_create(pool, key, klen);
+ kv->v = val;
+
+ return APR_SUCCESS;
+}
+
+apr_status_t apr_json_object_set_ex(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
|| key->type != APR_JSON_STRING) {
return APR_EINVAL;
}
@@ -316,7 +358,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, kv->v, p);
+ apr_json_object_set_ex(res, kv->k, kv->v, p);
}
else if (APR_JSON_FLAGS_STRICT & flags) {
@@ -329,7 +371,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, kv->v, p);
+ apr_json_object_set_ex(res, kv->k, kv->v, p);
}
diff --git a/json/apr_json_decode.c b/json/apr_json_decode.c
index c790d6fdc..5ef2cb854 100644
--- a/json/apr_json_decode.c
+++ b/json/apr_json_decode.c
@@ -501,7 +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, self->pool);
+ apr_json_object_set_ex(json, key, value, self->pool);
if (self->p == self->e) {
status = APR_EOF;