aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatharina Fey <kookie@spacekookie.de>2016-12-13 12:21:07 +0100
committerKatharina Fey <kookie@spacekookie.de>2019-06-04 20:21:53 +0200
commit805ea6f7be9c34fef416236a6aa9064e484c6714 (patch)
tree4d3d882917940981eb88b0a651caee4d8bee4afd
parent45025166f3299f32d63f34db0375adb7d81ff3db (diff)
Adding support for list roots:
[{'id': 5, ...}, {'id': 6, ...}] Which results in [LIST] [PAIR] <==> ['id'] => [5] ... structures. Advanced json parsing support is still experimental!
-rw-r--r--lib/dtree_utils.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/dtree_utils.c b/lib/dtree_utils.c
index f8110ec..b163236 100644
--- a/lib/dtree_utils.c
+++ b/lib/dtree_utils.c
@@ -83,7 +83,7 @@ dt_err dtree_decode_json(dtree *(*data), const char *json_data, size_t len)
/* Have a structure to record array types in the tree */
bool *is_array = malloc(sizeof(bool) * len);
- memset(bounds, 0, sizeof(bool) * len);
+ memset(is_array, 0, sizeof(bool) * len);
/* Set the currently focused node */
int focused = -1;
@@ -102,13 +102,21 @@ dt_err dtree_decode_json(dtree *(*data), const char *json_data, size_t len)
if(focused > 0 && tok.end >= bounds[focused].high) {
focused--;
- /* Because of how our root node is a VALUE node, we need the parents parent */
+ /**
+ * We need to check if our direct parent is a PAIR or LIST type
+ *
+ * If it is a PAIR, it means we need to extract 2-stage parents
+ * If it is a LIST, it means we can leave it at 1.
+ */
dtree *parent, *pair_parent;
dtree_parent(root, curr, &parent);
- dtree_parent(root, parent, &pair_parent);
+
+ if(parent->type == PAIR){
+ dtree_parent(root, parent, &parent); // Override the PARENT variable
+ }
/* Assign the new root node - old scope restored */
- curr = pair_parent;
+ curr = parent;
}
switch(tok.type) {
@@ -134,7 +142,17 @@ dt_err dtree_decode_json(dtree *(*data), const char *json_data, size_t len)
/* This is not elegant at all! */
if(tok.type == JSMN_ARRAY) is_array[focused] = true;
+ /* Then we check if our parent is an array */
+ if(focused - 1 >= 0 && is_array[focused - 1]) {
+ /** If our parent is an array we need to add a new object to our parent (CURR) **/
+ dtree *obj;
+ dtree_addlist(curr, &obj);
+
+ /* Then switch over our current value */
+ curr = obj;
+
+ }
/**
* Most of the time, we will create a new object under the key of