From 47bf50f557d1f71a9a54fca7084316f422e9f44e Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakob.olsson@iopsys.eu>
Date: Wed, 2 Oct 2019 14:55:40 +0200
Subject: [PATCH] overwrite nested arrays when necessary

---
 api.c | 43 ++++++++++++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 17 deletions(-)

diff --git a/api.c b/api.c
index 9048ccd..34b1633 100644
--- a/api.c
+++ b/api.c
@@ -234,7 +234,7 @@ int add_val(struct json_object *ptr, char *key, char *val, enum json_type type)
 
 int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type type)
 {
-	struct json_object *ptr, *tmp;
+	struct json_object *ptr, *outer_obj, *tmp;
 	const char *delimiter = ".";
 	char fmt_cpy[1024] = {0}, parsed_key[32] = {0};
 	char *p, *key = fmt;
@@ -249,7 +249,7 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type
 	printf("format = %s\n", fmt);
 	printf("set val = %s\n", val);
 
-	ptr = tmp = *src;
+	ptr = outer_obj = *src;
 	if (!fmt)
 		goto add_key;
 
@@ -273,21 +273,30 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type
 
 
 			/* if we need to step further and currently marked value isnt an object, we need to overwrite it */
-			json_object_object_get_ex(tmp, parsed_key, &ptr);
+			json_object_object_get_ex(outer_obj, parsed_key, &ptr);
 			if (!json_object_is_type(ptr, json_type_object) && !json_object_is_type(ptr, json_type_array)) {
 				ptr = json_object_new_object();
-				json_object_object_add(tmp, parsed_key, ptr);
+				json_object_object_add(outer_obj, parsed_key, ptr);
 			}
 
-
 			/* TODO: make enums for rv of get_idx */
 			if (len > 0) {
 				for (int i = 0; i < len; i++) {
 					printf("%s %d, ptr = %s\n", __func__, __LINE__, json_object_get_string(ptr));
 					if (ptr && json_object_get_type(ptr) == json_type_array) {
 						printf("%s %d\n", __func__, __LINE__);
-						if (idx[i] > -1 && idx[i] < json_object_array_length(ptr))
-							ptr = json_object_array_get_idx(ptr, idx[i]);
+						if (idx[i] > -1 && idx[i] < json_object_array_length(ptr)) {
+							tmp = json_object_array_get_idx(ptr, idx[i]);
+							if (!json_object_is_type(tmp, json_type_object)) {
+								struct json_object *obj = json_object_new_object();
+								if (!obj)
+									return -1;
+
+								json_object_array_put_idx(ptr, idx[i], obj);
+								tmp = json_object_array_get_idx(ptr, idx[i]);
+							}
+							ptr = tmp;
+						}
 						else {
 							printf("%s %d\n", __func__, __LINE__);
 							if (i == len - 1)
@@ -300,16 +309,16 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type
 						}
 					} else {
 						ptr = json_object_new_array();
-						printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(tmp)), json_type_to_name(json_object_get_type(ptr)));
-						printf("tmp=%s\n", json_object_get_string(tmp));
+						printf("%s %d type=%s, ptr_type=%s\n", __func__, __LINE__, json_type_to_name(json_object_get_type(outer_obj)), json_type_to_name(json_object_get_type(ptr)));
+						printf("outer_obj=%s\n", json_object_get_string(outer_obj));
 						printf("ptr=%s\n", json_object_get_string(ptr));
 						printf("key=%s\n", key);
-						json_object_object_add(tmp, parsed_key, ptr);
+						json_object_object_add(outer_obj, parsed_key, ptr);
 						if (i == len - 1) {
 							json_object_array_add(ptr, json_object_new_object());
 							ptr = json_object_array_get_idx(ptr, json_object_array_length(ptr) - 1);
 						}
-						//json_object_array_add(tmp, ptr);
+						//json_object_array_add(outer_obj, ptr);
 					}
 				}
 			}
@@ -317,16 +326,16 @@ int set_by_string(struct json_object **src, char *fmt, char *val, enum json_type
 			/* create key object if it does not exist */
 			if (!ptr) {
 				ptr = json_object_new_object();
-				if (json_object_get_type(tmp) == json_type_array)
-					json_object_array_add(tmp, ptr);
-				else if (json_object_get_type(tmp) == json_type_object)
-					json_object_object_add(tmp, parsed_key, ptr);
+				if (json_object_get_type(outer_obj) == json_type_array)
+					json_object_array_add(outer_obj, ptr);
+				else if (json_object_get_type(outer_obj) == json_type_object)
+					json_object_object_add(outer_obj, parsed_key, ptr);
 				printf("%s %d: ptr=%s\n", __func__, __LINE__, json_object_get_string(ptr));
-				printf("%s %d: tmp=%s\n", __func__, __LINE__, json_object_get_string(tmp));
+				printf("%s %d: outer_obj=%s\n", __func__, __LINE__, json_object_get_string(outer_obj));
 			}
 		}
 
-		tmp = ptr;
+		outer_obj = ptr;
 	}
 
 	printf("%s %d key=%s\n", __func__, __LINE__, parsed_key);
-- 
GitLab