diff --git a/api.c b/api.c index 77b443cb6f32204a333112837344e198a3a54fa8..39d2565a72a8f7fccfe741acaae0035256215843 100644 --- a/api.c +++ b/api.c @@ -155,12 +155,55 @@ int add_array(struct json_object *ptr, int idx, char *val, enum json_type type, return 0; } +int add_val(struct json_object *ptr, char *key, char *val, enum json_type type) +{ + struct json_object *j_val; + int idx; + + idx = get_idx(key); + printf("%s %d key=%s\n", __func__, __LINE__, key); + j_val = dummy_val(val, type); + if (!j_val || !json_object_is_type(j_val, type)) { + fprintf(stderr, "Invalid input value!\n"); + return -1; + } + printf("%s %d val=%s, j_val=%s\n", __func__, __LINE__, val, json_object_get_string(j_val)); + + + if (json_type_object == type) { + /* TODO: does this actually work? what would be the test case for this? */ + if (idx == -2) { + struct json_object *tmp = ptr; + + if (key) + ptr = json_object_new_object(); + + json_object_object_foreach(j_val, key1, val1) + json_object_object_add(ptr, key1, val1); + if (key) + json_object_object_add(tmp, key, ptr); + } else { + add_array(ptr, idx, val, type, key); + } + + return 0; + } + + + if (idx == -2 || type == json_type_array) + json_object_object_add(ptr, key, j_val); + else + add_array(ptr, idx, val, type, key); + + 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; + char fmt_cpy[1024] = {0}; + char *p, *key = fmt; int idx; if (!*src) { @@ -174,25 +217,26 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type ptr = tmp = *src; if (!fmt) goto add_key; - printf("%s %d\n", __func__, __LINE__); - strcpy(buffer, fmt); - printf("%s %d\n", __func__, __LINE__); - p = strtok(buffer,delimiter); - printf("%s %d\n", __func__, __LINE__); + + strcpy(fmt_cpy, fmt); + p = strtok(fmt_cpy,delimiter); + while (p != NULL) { - prev = p; + key = p; p = strtok(NULL, delimiter); - /* if next key exists, parse prev key, let switch-case add/alter last key */ + /* if next key exists, parse key, let switch-case add/alter last key */ if (p) { /* TODO: pretty wonky order with get idx first to overwrite braces?*/ - idx = get_idx(prev); - json_object_object_get_ex(tmp, prev, &ptr); + idx = get_idx(key); + /* if we need to step further and currently marked value isnt an object, we need to overwrite it */ + json_object_object_get_ex(tmp, 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, prev, ptr); + json_object_object_add(tmp, key, ptr); } + printf("key=%s\n", key); printf("p=%s\n", p); /* TODO: make enums for rv of get_idx */ @@ -214,21 +258,21 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type 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); + printf("key=%s\n", key); + json_object_object_add(tmp, key, ptr); 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); } } - /* create prev object if it does not exist */ + /* 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, prev, ptr); + json_object_object_add(tmp, 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)); } @@ -237,101 +281,13 @@ int set_by_string(char *fmt, struct json_object **src, char *val, enum json_type tmp = ptr; } - printf("%s %d prev=%s\n", __func__, __LINE__, prev); + printf("%s %d key=%s\n", __func__, __LINE__, key); - json_object_object_get_ex(ptr, prev, &tar); + json_object_object_get_ex(ptr, key, &tar); add_key: printf("%s %d\n", __func__, __LINE__); - switch(type) { - case json_type_object: - { - struct json_object *parsed_val = json_tokener_parse(val); - - printf("%s %d\n", __func__, __LINE__); - if (!parsed_val) { - fprintf(stderr, "Invalid object format\n"); - return -1; - } else if (type != json_object_get_type(parsed_val)) { - fprintf(stderr, "Types don't match!\n"); - return -1; - } - - printf("%s %d\n", __func__, __LINE__); - /* TODO: does this actually work? what would be the test case for this? */ - idx = get_idx(prev); - printf("%s %d\n", __func__, __LINE__); - if (idx == -2) { - if (prev) - ptr = json_object_new_object(); - json_object_object_foreach(parsed_val, key1, val1) - json_object_object_add(ptr, key1, val1); - if (prev) - json_object_object_add(tmp, prev, ptr); - } else { - add_array(ptr, idx, val, type, prev); - } - } - break; - case json_type_string: - 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: - printf("%s %d prev = %s\n", __func__, __LINE__, prev); - idx = get_idx(prev); - if (idx == -2) { - printf("%s %d ptr=%s, idx=%d\n", __func__, __LINE__, json_object_get_string(ptr), idx); - 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: - { - struct json_object *parsed_val = json_tokener_parse(val); - - if (!parsed_val) { - fprintf(stderr, "Invalid array format\n"); - return -1; - } else if (type != json_object_get_type(parsed_val)) { - fprintf(stderr, "Types don't match!\n"); - return -1; - } - - json_object_object_add(ptr, prev, parsed_val); - } - break; - case json_type_double: - idx = get_idx(prev); - if (idx == -2) - json_object_object_add(ptr, prev, json_object_new_double(atof(val))); - else { - printf("%s %d\n", __func__, __LINE__); - add_array(ptr, idx, val, type, prev); - } - break; - case json_type_boolean: - { - bool bool_val = false; - - if (strncasecmp(val, "true", 4) || atoi(val) == 1) - bool_val = true; - - - json_object_object_add(ptr, prev, json_object_new_boolean(bool_val)); - } - break; - default: - fprintf(stderr, "Not valid input type!\n"); - break; - } + add_val(ptr, key, val, type); return 0; } @@ -339,7 +295,7 @@ printf("%s %d\n", __func__, __LINE__); int set(char *fmt, struct json_object *src, struct json_object *val) { const char *delimiter = "."; - char buffer[1024] = {0}; + char fmt_cpy[1024] = {0}; char *p; if (json_object_get_type(val) != json_type_object) { @@ -349,10 +305,10 @@ int set(char *fmt, struct json_object *src, struct json_object *val) src = get(fmt, src); - strcpy(buffer, fmt); + strcpy(fmt_cpy, fmt); /* TODO: put this in some separate function */ - for (p = strtok(buffer,delimiter); p != NULL; p = strtok(NULL, delimiter)) { + for (p = strtok(fmt_cpy,delimiter); p != NULL; p = strtok(NULL, delimiter)) { struct json_object *ptr, *tmp = src; json_object_object_get_ex(tmp, p, &ptr); @@ -374,11 +330,11 @@ struct json_object *get(char *fmt, struct json_object *src) { struct json_object *ptr, *tmp = src; const char *delimiter = "."; - char buffer[1024] = {0}; + char fmt_cpy[1024] = {0}; - strcpy(buffer, fmt); + strcpy(fmt_cpy, fmt); - for (char *p = strtok(buffer,delimiter); p != NULL; p = strtok(NULL, delimiter)) { + for (char *p = strtok(fmt_cpy,delimiter); p != NULL; p = strtok(NULL, delimiter)) { json_object_object_get_ex(tmp, p, &ptr); tmp = ptr; }