use default complete for re_lex
[protos/libecoli.git] / lib / ecoli_node_re_lex.c
index 669c9fb..252ebfd 100644 (file)
@@ -1,3 +1,7 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2016, Olivier MATZ <zer0@droids-corp.org>
+ */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>
@@ -10,6 +14,7 @@
 #include <ecoli_test.h>
 #include <ecoli_strvec.h>
 #include <ecoli_node.h>
+#include <ecoli_completed.h>
 #include <ecoli_parsed.h>
 #include <ecoli_node_many.h>
 #include <ecoli_node_or.h>
@@ -113,15 +118,16 @@ ec_node_re_lex_parse(const struct ec_node *gen_node,
        }
 
        ret = ec_node_parse_child(node->child, state, new_vec);
-       if (ret >= 0) {
-               if ((unsigned)ret == ec_strvec_len(new_vec)) {
-                       ret = 1;
-               } else {
-                       child_parsed = ec_parsed_get_last_child(state);
-                       ec_parsed_del_child(state, child_parsed);
-                       ec_parsed_free(child_parsed);
-                       ret = EC_PARSED_NOMATCH;
-               }
+       if (ret < 0)
+               goto fail;
+
+       if ((unsigned)ret == ec_strvec_len(new_vec)) {
+               ret = 1;
+       } else if (ret != EC_PARSED_NOMATCH) {
+               child_parsed = ec_parsed_get_last_child(state);
+               ec_parsed_del_child(state, child_parsed);
+               ec_parsed_free(child_parsed);
+               ret = EC_PARSED_NOMATCH;
        }
 
        ec_strvec_free(new_vec);
@@ -151,7 +157,7 @@ static void ec_node_re_lex_free_priv(struct ec_node *gen_node)
 static struct ec_node_type ec_node_re_lex_type = {
        .name = "re_lex",
        .parse = ec_node_re_lex_parse,
-       //.complete = ec_node_re_lex_complete, //XXX
+       .complete = ec_node_default_complete,
        .size = sizeof(struct ec_node_re_lex),
        .free_priv = ec_node_re_lex_free_priv,
 };
@@ -222,14 +228,14 @@ struct ec_node *ec_node_re_lex(const char *id, struct ec_node *child)
 static int ec_node_re_lex_testcase(void)
 {
        struct ec_node *node;
-       int ret = 0;
-
-       node = ec_node_re_lex(NULL,
-               ec_node_many(NULL,
-                       EC_NODE_OR(NULL,
-                               ec_node_str(NULL, "foo"),
-                               ec_node_str(NULL, "bar"),
-                               ec_node_int(NULL, 0, 1000, 0)
+       int ret, testres = 0;
+
+       node = ec_node_re_lex(EC_NO_ID,
+               ec_node_many(EC_NO_ID,
+                       EC_NODE_OR(EC_NO_ID,
+                               ec_node_str(EC_NO_ID, "foo"),
+                               ec_node_str(EC_NO_ID, "bar"),
+                               ec_node_int(EC_NO_ID, 0, 1000, 0)
                        ), 0, 0
                )
        );
@@ -238,27 +244,37 @@ static int ec_node_re_lex_testcase(void)
                return -1;
        }
 
-       /* XXX add ^ automatically ? */
-       ret |= ec_node_re_lex_add(node, "[a-zA-Z]+", 1);
-       ret |= ec_node_re_lex_add(node, "[0-9]+", 1);
-       ret |= ec_node_re_lex_add(node, "=", 1);
-       ret |= ec_node_re_lex_add(node, "-", 1);
-       ret |= ec_node_re_lex_add(node, "\\+", 1);
-       ret |= ec_node_re_lex_add(node, "[      ]+", 0);
+       ret = ec_node_re_lex_add(node, "[a-zA-Z]+", 1);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
+       ret = ec_node_re_lex_add(node, "[0-9]+", 1);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
+       ret = ec_node_re_lex_add(node, "=", 1);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
+       ret = ec_node_re_lex_add(node, "-", 1);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
+       ret = ec_node_re_lex_add(node, "\\+", 1);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
+       ret = ec_node_re_lex_add(node, "[       ]+", 0);
+       testres |= EC_TEST_CHECK(ret == 0, "cannot add regexp");
        if (ret != 0) {
                EC_LOG(EC_LOG_ERR, "cannot add regexp to node\n");
                ec_node_free(node);
                return -1;
        }
 
-       ret |= EC_TEST_CHECK_PARSE(node, 1, "  foo bar  324 bar234");
-       ret |= EC_TEST_CHECK_PARSE(node, 1, "foo bar324");
-       ret |= EC_TEST_CHECK_PARSE(node, 1, "");
-       ret |= EC_TEST_CHECK_PARSE(node, -1, "foobar");
+       testres |= EC_TEST_CHECK_PARSE(node, 1, "  foo bar  324 bar234");
+       testres |= EC_TEST_CHECK_PARSE(node, 1, "foo bar324");
+       testres |= EC_TEST_CHECK_PARSE(node, 1, "");
+       testres |= EC_TEST_CHECK_PARSE(node, -1, "foobar");
+
+       /* no completion */
+       testres |= EC_TEST_CHECK_COMPLETE(node,
+               "", EC_NODE_ENDLIST,
+               EC_NODE_ENDLIST);
 
        ec_node_free(node);
 
-       return ret;
+       return testres;
 }
 /* LCOV_EXCL_STOP */