save
[protos/libecoli.git] / lib / ecoli_parsed.c
index 140edea..e951671 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <string.h>
 #include <assert.h>
 #include <errno.h>
@@ -146,9 +147,17 @@ struct ec_parsed *ec_parsed(void)
 
        TAILQ_INIT(&parsed->children);
 
+       parsed->attrs = ec_keyval();
+       if (parsed->attrs == NULL)
+               goto fail;
+
        return parsed;
 
  fail:
+       if (parsed != NULL)
+               ec_keyval_free(parsed->attrs);
+       ec_free(parsed);
+
        return NULL;
 }
 
@@ -173,6 +182,7 @@ void ec_parsed_free(struct ec_parsed *parsed)
 
        ec_parsed_free_children(parsed);
        ec_strvec_free(parsed->strvec);
+       ec_keyval_free(parsed->attrs);
        ec_free(parsed);
 }
 
@@ -200,19 +210,7 @@ static void __ec_parsed_dump(FILE *out,
 
        fprintf(out, "node_type=%s id=%s vec=", typename, id);
        vec = ec_parsed_strvec(parsed);
-       if (vec == NULL) {
-               fprintf(out, "none\n");
-       } else {
-               for (i = 0; i < ec_strvec_len(vec); i++)
-                       fprintf(out, "%s<%s>",
-                               i == 0 ? "" : ",",
-                               ec_strvec_val(vec, i));
-               // XXX
-               if (!strcmp(typename, "int") || !strcmp(typename, "str"))
-                       fprintf(out, "] <<<<<\n");
-               else
-                       fprintf(out, "]\n");
-       }
+       ec_strvec_dump(out, vec);
 
        TAILQ_FOREACH(child, &parsed->children, next)
                __ec_parsed_dump(out, child, indent + 2);
@@ -241,7 +239,7 @@ void ec_parsed_add_child(struct ec_parsed *parsed,
        child->parent = parsed;
 }
 
-void ec_parsed_del_child(struct ec_parsed *parsed,
+void ec_parsed_del_child(struct ec_parsed *parsed, // XXX rename del in unlink?
        struct ec_parsed *child)
 {
        TAILQ_REMOVE(&parsed->children, child, next);
@@ -254,7 +252,7 @@ ec_parsed_get_last_child(struct ec_parsed *parsed)
        return TAILQ_LAST(&parsed->children, ec_parsed_list);
 }
 
-void ec_parsed_del_last_child(struct ec_parsed *parsed)
+void ec_parsed_del_last_child(struct ec_parsed *parsed) // rename in free
 {
        struct ec_parsed *child;
 
@@ -274,6 +272,14 @@ struct ec_parsed *ec_parsed_get_root(struct ec_parsed *parsed)
        return parsed;
 }
 
+struct ec_parsed *ec_parsed_get_parent(struct ec_parsed *parsed)
+{
+       if (parsed == NULL)
+               return NULL;
+
+       return parsed->parent;
+}
+
 struct ec_parsed *ec_parsed_find_first(struct ec_parsed *parsed,
        const char *id)
 {