diff --git a/api.c b/api.c index c05f08684fcb8a29ce8abd91254a7741eb6c5af8..fbc9dea4f44ebf507dc4b1611c94efb25ae87bf6 100644 --- a/api.c +++ b/api.c @@ -66,12 +66,87 @@ out: return NULL; } +int get_idx(char *key) +{ + char *open_brace = strchr(key, '['); + printf("open_brace=%s\n", open_brace); + if (open_brace) { + char *close_brace = strchr(open_brace, ']'); + if (close_brace) { + int len = close_brace - open_brace; + printf("len=%d\n", len); + char *idx_str = calloc(1, len); + strncpy(idx_str, open_brace + 1, len-1); + printf("idx_str = %s\n", idx_str); + int idx = atoi(idx_str); + printf("idx = %d\n", idx); + *open_brace = '\0'; + printf("key=%s\n", key); + return idx; + } + } + + return -2; +} + +int add_array(struct json_object *ptr, int idx, char *val, enum json_type type, char *key) +{ + struct json_object *tmp; + struct json_object *j_val; + printf("%s %d\n", __func__, __LINE__); + switch(type) { + case json_type_array: + j_val = json_tokener_parse(val); + break; + case json_type_boolean: + ;; + break; + case json_type_object: + j_val = json_tokener_parse(val); + break; + case json_type_string: + j_val = json_object_new_string(val); + break; + case json_type_double: + j_val = json_object_new_double(atof(val)); + break; + case json_type_int: + j_val = json_object_new_double(atoi(val)); + break; + default: + return -1; + break; + } +printf("%s %d\n", __func__, __LINE__); + json_object_object_get_ex(ptr, key, &tmp); + if (json_object_is_type(tmp, json_type_array)) { + if (tmp && idx != -1) { + json_object_array_put_idx(tmp, idx, j_val); + } else if (tmp && idx == -1) { + printf("%s %d\n", __func__, __LINE__); + json_object_array_add(tmp, j_val); + } + } else { + printf("%s %d\n", __func__, __LINE__); + tmp = json_object_new_array(); + json_object_array_add(tmp, j_val); + 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("ptr=%s\n", json_object_get_string(ptr)); + printf("key=%s\n", key); + json_object_object_add(ptr, key, tmp); + } +printf("%s %d\n", __func__, __LINE__); + return 0; +} + int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type type) { struct json_object *ptr, *tmp, *tar; const char *delimiter = "."; char buffer[1024] = {0}; char *p, *prev = fmt; + int idx; if (!*src) { printf("lets allocate new object\n"); @@ -90,37 +165,29 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type /* if next key exists, parse prev key, let switch-case add/alter last key */ if (p) { json_object_object_get_ex(tmp, prev, &ptr); - + /* if we need to step further and currently marked value isnt an object, we need to overwrite it */ + if (!json_object_is_type(ptr, json_type_object)) { + ptr = json_object_new_object(); + json_object_object_add(tmp, prev, ptr); + } printf("p=%s\n", p); /* TODO: if prev contains [x], get idx of x */ - char *open_brace = strchr(prev, '['); - printf("open_brace=%s\n", open_brace); - if (open_brace) { - char *close_brace = strchr(open_brace, ']'); - if (close_brace) { - int len = close_brace - open_brace; - printf("len=%d\n", len); - char *idx_str = calloc(1, len); - strncpy(idx_str, open_brace + 1, len-1); - printf("idx_str = %s\n", idx_str); - int idx = atoi(idx_str); - printf("idx = %d\n", idx); - *open_brace = '\0'; - printf("prev=%s\n", prev); + idx = get_idx(prev); + printf("%s %d\n", __func__, __LINE__); + /* TODO: make enums for rv of get_idx */ + if (idx != -2) { + if (ptr && json_object_get_type(ptr) == json_type_array) { printf("%s %d\n", __func__, __LINE__); - if (ptr && json_object_get_type(ptr) == json_type_array) { - printf("%s %d\n", __func__, __LINE__); - ptr = json_object_array_get_idx(ptr, idx); - } 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("ptr=%s\n", json_object_get_string(ptr)); - printf("prev=%s\n", prev); - json_object_object_add(tmp, prev, ptr); - //json_object_array_add(tmp, ptr); - } + ptr = json_object_array_get_idx(ptr, idx); + } 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("ptr=%s\n", json_object_get_string(ptr)); + printf("prev=%s\n", prev); + json_object_object_add(tmp, prev, ptr); + //json_object_array_add(tmp, ptr); } } @@ -158,10 +225,23 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type } break; case json_type_string: - json_object_object_add(ptr, prev, json_object_new_string(val)); + idx = get_idx(prev); + if (idx == -2) + json_object_object_add(ptr, prev, json_object_new_string(val)); + else { + printf("%s %d\n", __func__, __LINE__); + add_array(ptr, idx, val, type, prev); + } break; case json_type_int: - json_object_object_add(ptr, prev, json_object_new_int(atoi(val))); + printf("%s %d\n", __func__, __LINE__); + idx = get_idx(prev); + if (idx == -2) + json_object_object_add(ptr, prev, json_object_new_int(atoi(val))); + else { + printf("%s %d\n", __func__, __LINE__); + add_array(ptr, idx, val, type, prev); + } break; case json_type_array: { @@ -179,7 +259,14 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type } break; case json_type_double: - json_object_object_add(ptr, prev, json_object_new_int(atof(val))); + idx = get_idx(prev); + if (idx == -2) + json_object_object_add(ptr, prev, json_object_new_int(atof(val))); + else { + printf("%s %d\n", __func__, __LINE__); + add_array(ptr, idx, val, type, prev); + } + break; case json_type_boolean: { @@ -252,7 +339,7 @@ struct json_object *get(char *fmt, struct json_object *src) int main() { - struct json_object *obj = path_to_obj("/home/jakob/git/json-editor-api/test.json"); + struct json_object *obj = path_to_obj("/home/jakob/git/json-editor/test.json"); struct json_object *ptr; printf("%s %d\n", __func__, __LINE__); @@ -269,7 +356,7 @@ int main() printf("%s\n", json_object_get_string(ptr)); - set_by_string("test.apdfgj[1]", &obj, "1", json_type_string); + set_by_string("test.apdfgj[0]", &obj, "1", json_type_string); printf("%s\n", json_object_get_string(obj));