aboutsummaryrefslogtreecommitdiff
path: root/lib/dyn_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dyn_utils.c')
-rw-r--r--lib/dyn_utils.c247
1 files changed, 246 insertions, 1 deletions
diff --git a/lib/dyn_utils.c b/lib/dyn_utils.c
index 81e6d1d..8e24c3f 100644
--- a/lib/dyn_utils.c
+++ b/lib/dyn_utils.c
@@ -1,6 +1,251 @@
#include <dtree/dyn_tree.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/*** Forward declared functions ***/
+
+#define TRUE 1
+#define FALSE 0
+
+static int json_len = 0;
+
+int human(short mm) {
+ if(mm == DYNTREE_JSON_HUMAN) return 1;
+ return 0;
+}
+
+int parse_key_value(dtree *key, char *buffer, short mode)
+{
+ if(key->type != LITERAL) 5;
+
+ size_t key_len = key->used;
+ int base = 3;
+
+ /* Make an array that will survive function switch */
+ char lit[key_len + base + 1];
+
+ strcpy(buffer, "\"");
+ strcat(buffer, key->payload.literal);
+ strcat(buffer, "\":");
+ strcat(buffer, "\0");
+ return 0;
+}
+
+const char *parse_value_list(dtree *value, char *buffer, char *global, short mode, int depth, int last)
+{
+ if(value == NULL) return "[ERROR]";
+
+ /* The new offset we need (in \t) */
+
+ int no_len = depth + 1;
+ char new_offset[no_len];
+ int i;
+ for(i = 0; i < depth + 1; i++)
+ strcat(new_offset, "\t");
+
+ int base;
+// if(human(mode)) base = 4 + no_len; // "<key>"
+ base = 2;
+ if(!last) base++;
+
+ switch(value->type) {
+ case LITERAL:
+ {
+ size_t key_len = value->used;
+
+ strcpy(buffer, "\"");
+ strcat(buffer, value->payload.literal);
+ strcat(buffer, "\"");
+ strcat(buffer, "\0");
+
+ if(last == 0) strcat(buffer, ",");
+ break;
+ }
+
+ case NUMERAL:
+ {
+ char str[15];
+ sprintf(str, "%ld", value->payload.numeral);
+ int val_len = (int) strlen((char*) str);
+
+ strcat(buffer, str);
+ if(last == 0) strcat(buffer, ",");
+ strcat(buffer, "\0");
+
+ break;
+ }
+
+ case RECURSIVE:
+ {
+ if(value->used > 0) {
+
+ dt_uni_t test = value->payload.recursive[0]->type;
+
+ if(test == LITERAL || test == NUMERAL) {
+ fflush(stdout);
+
+ int j;
+ for(j = 0; j < value->used; j++) {
+ dtree *child = value->payload.recursive[j];
+
+ char vall[1024];
+ parse_value_list(child, vall, global, mode, depth + 1, (i == value->used - 1) ? TRUE : FALSE);
+ fflush(stdout);
+ }
+
+ fflush(stdout);
+
+ } else if(test == PAIR) {
+ fflush(stdout);
+// *global = realloc(*global, sizeof(char) * strlen(*global) + 1);
+ append(global, "{");
+
+ int j;
+ for(j = 0; j < value->used; j++) {
+ dtree *child = value->payload.recursive[j];
+
+ if(child->type == PAIR) {
+ dtree *key = child->payload.recursive[0];
+ dtree *val = child->payload.recursive[1];
+
+ char kkey[1024];
+
+ parse_key_value(key, kkey, mode);
+ fflush(stdout);
+// *global = realloc(*global, sizeof(char) * strlen(*global) + strlen(kkey));
+ append(global, kkey);
+
+ char vval[1024];
+ parse_value_list(val, vval, global, mode, 1, (j == child->used - 1) ? TRUE : FALSE);
+ fflush(stdout);
+
+// *global = realloc(*global, sizeof(char) * strlen(*global) + strlen(vval));
+ append(global, vval);
+ }
+ }
+
+ fflush(stdout);
+// *global = realloc(*global, sizeof(char) * strlen(*global) + 1);
+ append(global, "}");
+ }
+
+ } else {
+ fflush(stdout);
+ }
+ }
+
+ default: INVALID_PAYLOAD;
+ }
+
+ return "";
+}
+
+void append(char *buffer, char *message)
+{
+ int msg_len = (int) strlen(message);
+ sprintf(buffer + json_len, message);
+ json_len += msg_len;
+}
+
+/******/
+
const char *rdb_error_getmsg(dt_err *e)
{
-} \ No newline at end of file
+}
+
+dt_err dtree_encode_set(dtree *data, short setting)
+{
+ if(data == NULL) return INVALID_PARAMS;
+
+ /* Check if setting is valid */
+ switch(setting) {
+ case DYNTREE_ENCODE_NONE:
+ case DYNTREE_JSON_MINIFIED:
+ case DYNTREE_JSON_HUMAN:
+ break;
+
+ default: return INVALID_PARAMS;
+ }
+
+ data->encset = setting;
+ return SUCCESS;
+}
+
+
+dt_err dtree_encode_json(dtree *data, char *json_data)
+{
+ if(data == NULL) return INVALID_PARAMS;
+
+ json_len = 0;
+
+ /* Check if setting is valid */
+ switch(data->encset) {
+ case DYNTREE_JSON_MINIFIED:
+ case DYNTREE_JSON_HUMAN:
+ break;
+
+ default: return INVALID_PARAMS;
+ }
+
+ /* Assume mode for all children */
+ short mode = data->encset;
+
+ char *open = "{";
+ char *close = "}";
+
+ if(data->type == RECURSIVE) {
+
+ fflush(stdout);
+ append(json_data, open);
+
+ /* Iterate through all it's children */
+ int i;
+ for(i = 0; i < data->used; i++) {
+ dtree *child = data->payload.recursive[i];
+
+ if(child->type == PAIR) {
+ dtree *key = child->payload.recursive[0];
+ dtree *val = child->payload.recursive[1];
+
+ char kkey[1024];
+ parse_key_value(key, kkey, mode);;
+ fflush(stdout);
+ append(json_data, kkey);
+ memset(kkey, 0, 1024);
+
+ char vval[1024];
+ parse_value_list(val, vval, json_data, mode, 1, (i == data->used - 1) ? TRUE : FALSE);
+ fflush(stdout);
+
+ append(json_data, vval);
+ memset(vval, 0, 1024);
+
+ } else if(child->type == RECURSIVE) {
+ dt_err err = dtree_encode_json(child, json_data);
+ if(err) return err;
+ }
+ }
+
+ } else {
+ return INVALID_PAYLOAD;
+ }
+ fflush(stdout);
+
+ /* Add closing } and null terminator to finish */
+ append(json_data, close);
+ append(json_data, "\0");
+
+ return SUCCESS;
+}
+
+
+dt_err dtree_decode_json(dtree *(*data), const char *json_data)
+{
+
+}
+
+
+/**************** PRIVATE UTILITY FUNCTIONS ******************/ \ No newline at end of file