remove node build
authorOlivier Matz <zer0@droids-corp.org>
Thu, 1 Mar 2018 20:16:30 +0000 (21:16 +0100)
committerOlivier Matz <zer0@droids-corp.org>
Thu, 1 Mar 2018 20:16:30 +0000 (21:16 +0100)
14 files changed:
lib/ecoli_completed.c
lib/ecoli_node.h
lib/ecoli_node_cmd.c
lib/ecoli_node_expr.c
lib/ecoli_node_expr_test.c
lib/ecoli_node_int.c
lib/ecoli_node_once.c
lib/ecoli_node_or.c
lib/ecoli_node_seq.c
lib/ecoli_node_sh_lex.c
lib/ecoli_node_subset.c
lib/ecoli_node_weakref.c
lib/ecoli_parsed.c
lib/ecoli_test.c

index 944c566..089a2c7 100644 (file)
@@ -84,23 +84,14 @@ struct ec_parsed *ec_completed_get_state(struct ec_completed *completed)
 }
 
 int
-ec_node_complete_child(struct ec_node *node, struct ec_completed *completed,
-                       const struct ec_strvec *strvec)
+ec_node_complete_child(/* XXX const */struct ec_node *node,
+               struct ec_completed *completed,
+               const struct ec_strvec *strvec)
 {
        struct ec_parsed *child_state, *cur_state;
        struct ec_completed_group *cur_group;
        int ret;
 
-       /* build the node if required */
-       if (node->type->build != NULL) {
-               if ((node->flags & EC_NODE_F_BUILT) == 0) {
-                       ret = node->type->build(node);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-       node->flags |= EC_NODE_F_BUILT;
-
        if (node->type->complete == NULL)
                return -ENOTSUP;
 
@@ -131,13 +122,6 @@ ec_node_complete_child(struct ec_node *node, struct ec_completed *completed,
        if (ret < 0)
                return ret;
 
-#if 0 // XXX dump
-       printf("----------------------------------------------------------\n");
-       ec_node_dump(stdout, node);
-       ec_strvec_dump(stdout, strvec);
-       ec_completed_dump(stdout, completed);
-#endif
-
        return 0;
 }
 
index d4f65f3..5a25a1f 100644 (file)
@@ -156,8 +156,6 @@ struct ec_node {
        /* XXX ensure parent and child are properly set in all nodes */
        struct ec_node *parent;
        unsigned int refcnt;
-#define EC_NODE_F_BUILT 0x0001 /** set if configuration is built */
-       unsigned int flags;
 
        TAILQ_ENTRY(ec_node) next;
        struct ec_node_list children;
index dcaaa93..85b97b2 100644 (file)
@@ -247,48 +247,19 @@ static const struct ec_node_expr_eval_ops test_ops = {
        .eval_free = ec_node_cmd_eval_free,
 };
 
-static int
-ec_node_cmd_parse(const struct ec_node *gen_node, struct ec_parsed *state,
-               const struct ec_strvec *strvec)
-{
-       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
-
-       return ec_node_parse_child(node->cmd, state, strvec);
-}
-
-static int
-ec_node_cmd_complete(const struct ec_node *gen_node,
-               struct ec_completed *completed,
-               const struct ec_strvec *strvec)
-{
-       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
-
-       return ec_node_complete_child(node->cmd, completed, strvec);
-}
-
-static void ec_node_cmd_free_priv(struct ec_node *gen_node)
-{
-       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
-       unsigned int i;
-
-       ec_free(node->cmd_str);
-       ec_node_free(node->cmd);
-       ec_node_free(node->expr);
-       ec_node_free(node->lex);
-       for (i = 0; i < node->len; i++)
-               ec_node_free(node->table[i]);
-       ec_free(node->table);
-}
-
-static int ec_node_cmd_build(struct ec_node *gen_node)
+static int ec_node_cmd_build(struct ec_node_cmd *node)
 {
        struct ec_node *expr = NULL, *lex = NULL, *cmd = NULL;
        struct ec_parsed *p, *child;
-       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
        void *result;
        int ret;
 
-       /* XXX the expr parser can be moved in the node init */
+       ec_node_free(node->expr);
+       node->expr = NULL;
+       ec_node_free(node->lex);
+       node->lex = NULL;
+       ec_node_free(node->cmd);
+       node->cmd = NULL;
 
        /* build the expression parser */
        ret = -ENOMEM;
@@ -373,11 +344,8 @@ static int ec_node_cmd_build(struct ec_node *gen_node)
        ec_parsed_free(p);
        p = NULL;
 
-       ec_node_free(node->expr);
        node->expr = expr;
-       ec_node_free(node->lex);
        node->lex = lex;
-       ec_node_free(node->cmd);
        node->cmd = cmd;
 
        return 0;
@@ -390,9 +358,46 @@ fail:
        return ret;
 }
 
+static int
+ec_node_cmd_parse(const struct ec_node *gen_node, struct ec_parsed *state,
+               const struct ec_strvec *strvec)
+{
+       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
+
+       if (node->cmd == NULL)
+               return -ENOENT;
+       return ec_node_parse_child(node->cmd, state, strvec);
+}
+
+static int
+ec_node_cmd_complete(const struct ec_node *gen_node,
+               struct ec_completed *completed,
+               const struct ec_strvec *strvec)
+{
+       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
+
+       if (node->cmd == NULL)
+               return -ENOENT;
+       return ec_node_complete_child(node->cmd, completed, strvec);
+}
+
+static void ec_node_cmd_free_priv(struct ec_node *gen_node)
+{
+       struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
+       unsigned int i;
+
+       ec_free(node->cmd_str);
+       ec_node_free(node->cmd);
+       ec_node_free(node->expr);
+       ec_node_free(node->lex);
+       for (i = 0; i < node->len; i++)
+               ec_node_free(node->table[i]);
+       ec_free(node->table);
+}
+
+
 static struct ec_node_type ec_node_cmd_type = {
        .name = "cmd",
-       .build = ec_node_cmd_build,
        .parse = ec_node_cmd_parse,
        .complete = ec_node_cmd_complete,
        .size = sizeof(struct ec_node_cmd),
@@ -405,6 +410,7 @@ int ec_node_cmd_add_child(struct ec_node *gen_node, struct ec_node *child)
 {
        struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node;
        struct ec_node **table;
+       int ret;
 
        // XXX check node type
 
@@ -413,7 +419,11 @@ int ec_node_cmd_add_child(struct ec_node *gen_node, struct ec_node *child)
        if (child == NULL)
                return -EINVAL;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       if (node->cmd == NULL) {
+               ret = ec_node_cmd_build(node);
+               if (ret < 0)
+                       return ret;
+       }
 
        table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
        if (table == NULL) {
@@ -431,42 +441,25 @@ int ec_node_cmd_add_child(struct ec_node *gen_node, struct ec_node *child)
        return 0;
 }
 
-struct ec_node *ec_node_cmd(const char *id, const char *cmd_str)
+struct ec_node *__ec_node_cmd(const char *id, const char *cmd, ...)
 {
        struct ec_node *gen_node = NULL;
        struct ec_node_cmd *node = NULL;
+       struct ec_node *child;
+       va_list ap;
+       int fail = 0;
 
        gen_node = __ec_node(&ec_node_cmd_type, id);
        if (gen_node == NULL)
                goto fail;
 
        node = (struct ec_node_cmd *)gen_node;
-       node->cmd_str = ec_strdup(cmd_str);
+       node->cmd_str = ec_strdup(cmd);
        if (node->cmd_str == NULL)
                goto fail;
 
-       return gen_node;
-
-fail:
-       ec_node_free(gen_node);
-       return NULL;
-}
-
-struct ec_node *__ec_node_cmd(const char *id, const char *cmd, ...)
-{
-       struct ec_node *gen_node = NULL;
-       struct ec_node_cmd *node = NULL;
-       struct ec_node *child;
-       va_list ap;
-       int fail = 0;
-
        va_start(ap, cmd);
 
-       gen_node = ec_node_cmd(id, cmd);
-       node = (struct ec_node_cmd *)gen_node;
-       if (node == NULL)
-               fail = 1;;
-
        for (child = va_arg(ap, struct ec_node *);
             child != EC_NODE_ENDLIST;
             child = va_arg(ap, struct ec_node *)) {
@@ -483,6 +476,10 @@ struct ec_node *__ec_node_cmd(const char *id, const char *cmd, ...)
                goto fail;
 
        va_end(ap);
+
+       if (ec_node_cmd_build(node) < 0)
+               goto fail;
+
        return gen_node;
 
 fail:
@@ -491,6 +488,11 @@ fail:
        return NULL;
 }
 
+struct ec_node *ec_node_cmd(const char *id, const char *cmd_str)
+{
+       return __ec_node_cmd(id, cmd_str, EC_NODE_ENDLIST);
+}
+
 /* LCOV_EXCL_START */
 static int ec_node_cmd_testcase(void)
 {
index 39f3b70..9fb48a7 100644 (file)
@@ -74,6 +74,8 @@ static int ec_node_expr_parse(const struct ec_node *gen_node,
 {
        struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
 
+       if (node->child == NULL)
+               return -ENOENT;
        return ec_node_parse_child(node->child, state, strvec);
 }
 
@@ -84,6 +86,8 @@ ec_node_expr_complete(const struct ec_node *gen_node,
 {
        struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
 
+       if (node->child == NULL)
+               return -ENOENT;
        return ec_node_complete_child(node->child, completed, strvec);
 }
 
@@ -114,15 +118,17 @@ static void ec_node_expr_free_priv(struct ec_node *gen_node)
        ec_node_free(node->child);
 }
 
-static int ec_node_expr_build(struct ec_node *gen_node)
+static int ec_node_expr_build(struct ec_node_expr *node)
 {
-       struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
        struct ec_node *term = NULL, *expr = NULL, *next = NULL,
                *pre_op = NULL, *post_op = NULL,
                *post = NULL, *weak = NULL;
        unsigned int i;
        int ret;
 
+       ec_node_free(node->child);
+       node->child = NULL;
+
        if (node->val_node == NULL)
                return -EINVAL;
        if (node->bin_ops_len == 0 && node->pre_ops_len == 0 &&
@@ -212,7 +218,6 @@ static int ec_node_expr_build(struct ec_node *gen_node)
        weak = NULL;
 
        node->child = expr;
-       //ec_node_dump(stdout, node->child); //XXX
 
        return 0;
 
@@ -229,7 +234,6 @@ fail:
 
 static struct ec_node_type ec_node_expr_type = {
        .name = "expr",
-       .build = ec_node_expr_build,
        .parse = ec_node_expr_parse,
        .complete = ec_node_expr_complete,
        .size = sizeof(struct ec_node_expr),
@@ -250,15 +254,10 @@ int ec_node_expr_set_val_node(struct ec_node *gen_node, struct ec_node *val_node
        ret = -EINVAL;
        if (val_node == NULL)
                goto fail;
-       ret = -EPERM;
-       if (gen_node->flags & EC_NODE_F_BUILT)
-               goto fail;
-       ret = -EEXIST;
-       if (node->val_node != NULL)
-               goto fail;
 
+       ec_node_free(node->val_node);
        node->val_node = val_node;
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       ec_node_expr_build(node);
 
        return 0;
 
@@ -281,9 +280,6 @@ int ec_node_expr_add_bin_op(struct ec_node *gen_node, struct ec_node *op)
        ret = -EINVAL;
        if (node == NULL || op == NULL)
                goto fail;
-       ret = -EPERM;
-       if (gen_node->flags & EC_NODE_F_BUILT)
-               goto fail;
 
        ret = -ENOMEM;
        bin_ops = ec_realloc(node->bin_ops,
@@ -294,7 +290,7 @@ int ec_node_expr_add_bin_op(struct ec_node *gen_node, struct ec_node *op)
        node->bin_ops = bin_ops;
        bin_ops[node->bin_ops_len] = op;
        node->bin_ops_len++;
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       ec_node_expr_build(node);
 
        return 0;
 
@@ -317,9 +313,6 @@ int ec_node_expr_add_pre_op(struct ec_node *gen_node, struct ec_node *op)
        ret = -EINVAL;
        if (node == NULL || op == NULL)
                goto fail;
-       ret = -EPERM;
-       if (gen_node->flags & EC_NODE_F_BUILT)
-               goto fail;
 
        ret = -ENOMEM;
        pre_ops = ec_realloc(node->pre_ops,
@@ -330,7 +323,7 @@ int ec_node_expr_add_pre_op(struct ec_node *gen_node, struct ec_node *op)
        node->pre_ops = pre_ops;
        pre_ops[node->pre_ops_len] = op;
        node->pre_ops_len++;
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       ec_node_expr_build(node);
 
        return 0;
 
@@ -353,9 +346,6 @@ int ec_node_expr_add_post_op(struct ec_node *gen_node, struct ec_node *op)
        ret = -EINVAL;
        if (node == NULL || op == NULL)
                goto fail;
-       ret = -EPERM;
-       if (gen_node->flags & EC_NODE_F_BUILT)
-               goto fail;
 
        ret = -ENOMEM;
        post_ops = ec_realloc(node->post_ops,
@@ -366,7 +356,7 @@ int ec_node_expr_add_post_op(struct ec_node *gen_node, struct ec_node *op)
        node->post_ops = post_ops;
        post_ops[node->post_ops_len] = op;
        node->post_ops_len++;
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       ec_node_expr_build(node);
 
        return 0;
 
@@ -390,9 +380,6 @@ int ec_node_expr_add_parenthesis(struct ec_node *gen_node,
        ret = -EINVAL;
        if (node == NULL || open == NULL || close == NULL)
                goto fail;
-       ret = -EPERM;
-       if (gen_node->flags & EC_NODE_F_BUILT)
-               goto fail;;
 
        ret = -ENOMEM;
        open_ops = ec_realloc(node->open_ops,
@@ -409,7 +396,7 @@ int ec_node_expr_add_parenthesis(struct ec_node *gen_node,
        open_ops[node->paren_len] = open;
        close_ops[node->paren_len] = close;
        node->paren_len++;
-       gen_node->flags &= ~EC_NODE_F_BUILT;
+       ec_node_expr_build(node);
 
        return 0;
 
index ee67cbf..45c169e 100644 (file)
@@ -71,7 +71,7 @@ ec_node_expr_test_eval_var(void **result, void *userctx,
                return -ENOMEM;
 
        eval->val = val;
-       printf("eval var %d\n", eval->val);
+       EC_LOG(EC_LOG_DEBUG, "eval var %d\n", eval->val);
        *result = eval;
 
        return 0;
@@ -96,7 +96,7 @@ ec_node_expr_test_eval_pre_op(void **result, void *userctx, void *operand,
        else
                return -EINVAL;
 
-       printf("eval pre_op %d\n", eval->val);
+       EC_LOG(EC_LOG_DEBUG, "eval pre_op %d\n", eval->val);
        *result = eval;
 
        return 0;
@@ -121,7 +121,7 @@ ec_node_expr_test_eval_post_op(void **result, void *userctx, void *operand,
        else
                return -EINVAL;
 
-       printf("eval post_op %d\n", eval->val);
+       EC_LOG(EC_LOG_DEBUG, "eval post_op %d\n", eval->val);
        *result = eval;
 
        return 0;
@@ -150,7 +150,7 @@ ec_node_expr_test_eval_bin_op(void **result, void *userctx, void *operand1,
        else
                return -EINVAL;
 
-       printf("eval bin_op %d\n", eval1->val);
+       EC_LOG(EC_LOG_DEBUG, "eval bin_op %d\n", eval1->val);
        ec_free(eval2);
        *result = eval1;
 
@@ -167,7 +167,7 @@ ec_node_expr_test_eval_parenthesis(void **result, void *userctx,
        (void)open_paren;
        (void)close_paren;
 
-       printf("eval paren\n");
+       EC_LOG(EC_LOG_DEBUG, "eval paren\n");
        *result = value;
 
        return 0;
@@ -211,7 +211,7 @@ static int ec_node_expr_test_eval(struct ec_node *lex_node,
        eval = result;
        assert(eval != NULL);
 
-       printf("result: %d (expected %d)\n", eval->val, val);
+       EC_LOG(EC_LOG_DEBUG, "result: %d (expected %d)\n", eval->val, val);
        if (eval->val == val)
                ret = 0;
        else
index 45786fa..9dae63a 100644 (file)
@@ -379,16 +379,16 @@ static int ec_node_int_testcase(void)
 
        p = ec_node_parse(node, "0");
        s = ec_strvec_val(ec_parsed_strvec(p), 0);
-       EC_TEST_ASSERT(s != NULL &&
-               ec_node_int_getval(node, s, &i64) == 0 &&
-               i64 == 0);
+       EC_TEST_ASSERT(s != NULL);
+       EC_TEST_ASSERT(ec_node_uint_getval(node, s, &u64) == 0);
+       EC_TEST_ASSERT (u64 == 0);
        ec_parsed_free(p);
 
        p = ec_node_parse(node, "10");
        s = ec_strvec_val(ec_parsed_strvec(p), 0);
-       EC_TEST_ASSERT(s != NULL &&
-               ec_node_uint_getval(node, s, &u64) == 0 &&
-               u64 == 10);
+       EC_TEST_ASSERT(s != NULL);
+       EC_TEST_ASSERT(ec_node_uint_getval(node, s, &u64) == 0);
+       EC_TEST_ASSERT(u64 == 10);
        ec_parsed_free(p);
        ec_node_free(node);
 
@@ -405,9 +405,9 @@ static int ec_node_int_testcase(void)
 
        p = ec_node_parse(node, "10");
        s = ec_strvec_val(ec_parsed_strvec(p), 0);
-       EC_TEST_ASSERT(s != NULL &&
-               ec_node_int_getval(node, s, &i64) == 0 &&
-               i64 == 16);
+       EC_TEST_ASSERT(s != NULL);
+       EC_TEST_ASSERT(ec_node_int_getval(node, s, &i64) == 0);
+       EC_TEST_ASSERT(i64 == 16);
        ec_parsed_free(p);
        ec_node_free(node);
 
index 9ecfa98..086f185 100644 (file)
@@ -140,8 +140,6 @@ int ec_node_once_set(struct ec_node *gen_node, struct ec_node *child)
        if (ret < 0)
                return ret;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
-
        node->child = child;
 
        child->parent = gen_node;
index 20999c6..ddf8281 100644 (file)
@@ -122,8 +122,6 @@ int ec_node_or_add(struct ec_node *gen_node, struct ec_node *child)
        if (child == NULL)
                return -EINVAL;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
-
        table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
        if (table == NULL) {
                ec_node_free(child);
index 0fc8eec..e239bcf 100644 (file)
@@ -228,8 +228,6 @@ int ec_node_seq_add(struct ec_node *gen_node, struct ec_node *child)
        if (child == NULL)
                return -EINVAL;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
-
        table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
        if (table == NULL) {
                ec_node_free(child);
index b51069a..7f532fe 100644 (file)
@@ -253,7 +253,10 @@ ec_node_sh_lex_parse(const struct ec_node *gen_node,
                new_vec = tokenize(str, 0, 0, NULL);
        }
        if (new_vec == NULL) {
-               ret = -ENOMEM;
+               if (errno == EINVAL)
+                       ret = EC_PARSED_NOMATCH;
+               else
+                       ret = -ENOMEM;
                goto fail;
        }
 
index 53b1a89..5d8ca0a 100644 (file)
@@ -278,8 +278,6 @@ int ec_node_subset_add(struct ec_node *gen_node, struct ec_node *child)
        if (child == NULL)
                return -EINVAL;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
-
        table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
        if (table == NULL) {
                ec_node_free(child);
index 516b0bb..c598195 100644 (file)
@@ -90,8 +90,6 @@ int ec_node_weakref_set(struct ec_node *gen_node, struct ec_node *child)
        if (child == NULL)
                return -EINVAL;
 
-       gen_node->flags &= ~EC_NODE_F_BUILT;
-
        node->child = child;
 
        child->parent = gen_node;
index 103b3b0..7423be5 100644 (file)
@@ -65,16 +65,6 @@ static int __ec_node_parse_child(struct ec_node *node, struct ec_parsed *state,
        struct ec_parsed *child;
        int ret;
 
-       /* build the node if required */
-       if (node->type->build != NULL) {
-               if ((node->flags & EC_NODE_F_BUILT) == 0) {
-                       ret = node->type->build(node);
-                       if (ret < 0)
-                               return ret;
-               }
-       }
-       node->flags |= EC_NODE_F_BUILT;
-
        if (node->type->parse == NULL)
                return -ENOTSUP;
 
index b9b515b..6b168d6 100644 (file)
@@ -76,7 +76,6 @@ int ec_test_check_parse(struct ec_node *tk, int expected, ...)
        }
 
        p = ec_node_parse_strvec(tk, vec);
-       ec_parsed_dump(stdout, p); /* XXX only for debug */
        if (p == NULL) {
                EC_LOG(EC_LOG_ERR, "parsed is NULL\n");
        }
@@ -169,8 +168,7 @@ int ec_test_check_complete(struct ec_node *tk, ...)
                        count, ec_completed_count(c, EC_COMP_FULL));
                ec_completed_dump(stdout, c);
                ret = -1;
-       } else
-               ec_completed_dump(stdout, c); //XXX
+       }
 
 out:
        ec_strvec_free(vec);