]> git.droids-corp.org - protos/libecoli.git/commitdiff
save
authorOlivier Matz <zer0@droids-corp.org>
Thu, 15 Jun 2017 17:34:20 +0000 (19:34 +0200)
committerOlivier Matz <zer0@droids-corp.org>
Thu, 15 Jun 2017 17:34:20 +0000 (19:34 +0200)
lib/ecoli_tk.h
lib/ecoli_tk_cmd.c
lib/ecoli_tk_empty.c
lib/ecoli_tk_empty.h
lib/ecoli_tk_subset.c
lib/todo.txt

index f420a5263779505ac3a15d5035a6bef073f7fbb6..6aa1c77a36cbb661bb0a96d0f10edc222e08a113 100644 (file)
@@ -118,6 +118,7 @@ struct ec_tk {
 
 struct ec_tk *ec_tk_new(const char *id, const struct ec_tk_type *type,
        size_t priv_size);
+
 void ec_tk_free(struct ec_tk *tk);
 
 /* XXX add more accessors */
index f5f1575270886776742d2775d20f9a59ecbeb614..2f702ee7322eddc0b1613a9c0243d37e9fb1cea1 100644 (file)
@@ -41,6 +41,7 @@
 #include <ecoli_tk_expr.h>
 #include <ecoli_tk_str.h>
 #include <ecoli_tk_or.h>
+#include <ecoli_tk_subset.h>
 #include <ecoli_tk_int.h>
 #include <ecoli_tk_many.h>
 #include <ecoli_tk_seq.h>
@@ -168,9 +169,12 @@ ec_tk_cmd_eval_bin_op(void **result, void *userctx, void *operand1,
                ec_tk_free(in2);
                *result = out;
        } else if (!strcmp(ec_strvec_val(vec, 0), ",")) {
+               out = EC_TK_SUBSET(NULL, ec_tk_clone(in1), ec_tk_clone(in2));
+               if (out == NULL)
+                       return -EINVAL;
                ec_tk_free(in1);
                ec_tk_free(in2);
-               *result = NULL; //XXX
+               *result = out;
        } else {
                return -EINVAL;
        }
@@ -201,6 +205,8 @@ ec_tk_cmd_eval_parenthesis(void **result, void *userctx,
                if (out == NULL)
                        return -EINVAL;
                ec_tk_free(in);
+       } else if (!strcmp(ec_strvec_val(vec, 0), "(")) {
+               out = in;
        } else {
                return -EINVAL;
        }
@@ -471,7 +477,7 @@ static int ec_tk_cmd_testcase(void)
        int ret = 0;
 
        tk = EC_TK_CMD(NULL,
-               "add [toto] x | y",
+               "command [option] (subset1, subset2) x | y",
                ec_tk_int("x", 0, 10, 10),
                ec_tk_int("y", 20, 30, 10)
        );
@@ -479,10 +485,10 @@ static int ec_tk_cmd_testcase(void)
                ec_log(EC_LOG_ERR, "cannot create tk\n");
                return -1;
        }
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "add", "1");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "add", "23");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, 3, "add", "toto", "23");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "add", "15");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "command", "1");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "command", "23");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 3, "command", "option", "23");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "command", "15");
        ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "foo");
        ec_tk_free(tk);
 
index 9077c4409a95fc24054d29e414bc0d1405341496..be487d048320860b2f0f798f65f11169b1ea221a 100644 (file)
@@ -73,7 +73,7 @@ static struct ec_tk_type ec_tk_empty_type = {
 
 EC_TK_TYPE_REGISTER(ec_tk_empty_type);
 
-struct ec_tk *ec_tk_empty_new(const char *id)
+struct ec_tk *ec_tk_empty(const char *id)
 {
        return ec_tk_new(id, &ec_tk_empty_type,
                sizeof(struct ec_tk_empty));
@@ -84,7 +84,7 @@ static int ec_tk_empty_testcase(void)
        struct ec_tk *tk;
        int ret = 0;
 
-       tk = ec_tk_empty_new(NULL);
+       tk = ec_tk_empty(NULL);
        if (tk == NULL) {
                ec_log(EC_LOG_ERR, "cannot create tk\n");
                return -1;
@@ -95,7 +95,7 @@ static int ec_tk_empty_testcase(void)
        ec_tk_free(tk);
 
        /* never completes */
-       tk = ec_tk_empty_new(NULL);
+       tk = ec_tk_empty(NULL);
        if (tk == NULL) {
                ec_log(EC_LOG_ERR, "cannot create tk\n");
                return -1;
index 37c0eef05a819f1e849e1563e8a733966b1a69ed..6482c4b91af444d8e95c65db7f5fc6e357475ea1 100644 (file)
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+/**
+ * This token always matches an empty string vector
+ */
+
 #ifndef ECOLI_TK_EMPTY_
 #define ECOLI_TK_EMPTY_
 
-struct ec_tk *ec_tk_empty_new(const char *id);
+struct ec_tk *ec_tk_empty(const char *id);
 
 #endif
index b6773d2a3e722d31c740f64119eb6fbbee13a054..b73eb04451abae2e99b1a45378be4c256436d8d0 100644 (file)
@@ -173,8 +173,13 @@ static struct ec_parsed_tk *ec_tk_subset_parse(const struct ec_tk *gen_tk,
        if (ret < 0)
                goto fail;
 
+       /* if no child tk matches, return a matching empty strvec */
        if (result.parsed_table_len == 0) {
                ec_free(result.parsed_table);
+               match_strvec = ec_strvec_new();
+               if (match_strvec == NULL)
+                       goto fail;
+               ec_parsed_tk_set_match(parsed_tk, gen_tk, match_strvec);
                return parsed_tk;
        }
 
@@ -416,6 +421,7 @@ static int ec_tk_subset_testcase(void)
                ec_log(EC_LOG_ERR, "cannot create tk\n");
                return -1;
        }
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 0);
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 1, "foo");
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 1, "bar");
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "foo", "bar", "titi");
@@ -423,10 +429,8 @@ static int ec_tk_subset_testcase(void)
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 1, "foo", "foo");
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "bar", "bar");
        ret |= EC_TEST_CHECK_TK_PARSE(tk, 2, "bar", "foo");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, " ");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "foox");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "titi");
-       ret |= EC_TEST_CHECK_TK_PARSE(tk, -1, "");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 0, " ");
+       ret |= EC_TEST_CHECK_TK_PARSE(tk, 0, "foox");
        ec_tk_free(tk);
 
        /* test completion */
index a82ba6c7f99549b44c76d5023eb1ff773d7d95d8..f90f008036bc545ccd9d1c1a0e9074196fe1092a 100644 (file)
@@ -4,7 +4,7 @@ tk_cmd
 X evaluate expression tree in ec_tk_expr
 - cmd token
 - example
-- tk_re
+X tk_re
 
 cleanup
 =======