From 99ec00b0eb3d7a1250398821680709c4f44fa530 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 9 Dec 2014 14:38:18 +0100 Subject: mds-kbdc: bug fixes and test cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/mds-kbdc/compile-layout.c | 26 +++++++++++++------------- src/mds-kbdc/make-tree.c | 18 ++++++++++++++---- src/mds-kbdc/raw-data.c | 2 +- 3 files changed, 28 insertions(+), 18 deletions(-) (limited to 'src/mds-kbdc') diff --git a/src/mds-kbdc/compile-layout.c b/src/mds-kbdc/compile-layout.c index 1d05d83..fbf7119 100644 --- a/src/mds-kbdc/compile-layout.c +++ b/src/mds-kbdc/compile-layout.c @@ -700,11 +700,11 @@ static char32_t* parse_escape(mds_kbdc_tree_t* restrict tree, const char* restri { /* Variable dereference. */ if (value = variables_get((size_t)numbuf), value == NULL) - RETURN_ERROR(tree, ERROR, "variable ‘%.*s’ is not defined", VARIABLE);/* TODO test */ + RETURN_ERROR(tree, ERROR, "variable ‘%.*s’ is not defined", VARIABLE); if (value->type == C(ARRAY)) - RETURN_ERROR(tree, ERROR, "variable ‘%.*s’ is an array", VARIABLE);/* TODO test */ + RETURN_ERROR(tree, ERROR, "variable ‘%.*s’ is an array", VARIABLE); if (value->type != C(COMPILED_STRING)) - NEW_ERROR(tree, INTERNAL_ERROR, "variable ‘%.*s’ is of impossible type", VARIABLE);/* TODO test */ + NEW_ERROR(tree, INTERNAL_ERROR, "variable ‘%.*s’ is of impossible type", VARIABLE); fail_if (rc = string_dup(value->compiled_string.string), rc == NULL); } else @@ -1621,14 +1621,14 @@ static int compile_have_range(mds_kbdc_tree_assumption_have_range_t* restrict tr /* Check that the primary bound is single-character. */ if ((first[0] == -1) || (first[1] != -1)) { - NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string");/* TODO test */ + NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string"); error->start = lineoff_first, lineoff_first = 0; error->end = error->start + strlen(tree->first); } /* Check that the secondary bound is single-character. */ if ((last[0] == -1) || (last[1] != -1)) { - NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string");/* TODO test */ + NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string"); error->start = lineoff_last, lineoff_last = 0; error->end = error->start + strlen(tree->last); } @@ -2080,14 +2080,14 @@ static int compile_for(mds_kbdc_tree_for_t* restrict tree) /* Check that the primary bound is single-character. */ if ((first[0] == -1) || (first[1] != -1)) { - NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string");/* TODO test */ + NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string"); error->start = lineoff_first, lineoff_first = 0; error->end = error->start + strlen(tree->first); } /* Check that the secondary bound is single-character. */ if ((last[0] == -1) || (last[1] != -1)) { - NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string");/* TODO test */ + NEW_ERROR(tree, ERROR, "iteration boundary must be a single character string"); error->start = lineoff_last, lineoff_last = 0; error->end = error->start + strlen(tree->last); } @@ -2253,7 +2253,7 @@ static int evaluate_element(mds_kbdc_tree_t* restrict node) */ static int compile_keys(mds_kbdc_tree_keys_t* restrict tree) { - fail_if (evaluate_element((mds_kbdc_tree_t*)tree)); + fail_if (evaluate_element((mds_kbdc_tree_t*)tree) < 0); return 0; fail: return -1; @@ -2268,7 +2268,7 @@ static int compile_keys(mds_kbdc_tree_keys_t* restrict tree) */ static int compile_string(mds_kbdc_tree_string_t* restrict tree) { - fail_if (evaluate_element((mds_kbdc_tree_t*)tree)); + fail_if (evaluate_element((mds_kbdc_tree_t*)tree) < 0); return 0; fail: return -1; @@ -2549,10 +2549,10 @@ static int compile_subtree(mds_kbdc_tree_t* restrict tree) case C(ASSUMPTION_HAVE_RANGE): c (have_range); break; case C(FOR): c_ (for); break; case C(IF): c_ (if); break; - case C(LET): c (let); break;/* TODO test */ - case C(KEYS): c (keys); break;/* TODO test */ - case C(STRING): c (string); break;/* TODO test */ - case C(ARRAY): c (array); break;/* TODO test */ + case C(LET): c (let); break; + case C(KEYS): c (keys); break; + case C(STRING): c (string); break; + case C(ARRAY): c (array); break; case C(MAP): c (map); break; case C(MACRO_CALL): c (macro_call); break;/* TODO test */ case C(RETURN): break_level = 3; break;/* TODO test */ diff --git a/src/mds-kbdc/make-tree.c b/src/mds-kbdc/make-tree.c index 77155b2..7534a40 100644 --- a/src/mds-kbdc/make-tree.c +++ b/src/mds-kbdc/make-tree.c @@ -1311,14 +1311,18 @@ static int parse_array_elements(void) end = line + strlen(line); END; line = end, prev_end_char = '\0'; - in_array = 0; - stack_ptr -= 2; - NEXT; - return 0; + goto done; } else { NEW_NODE(string, STRING); + if (strchr("[]()<>{}", *line)) + { + mds_kbdc_tree_free((mds_kbdc_tree_t*)node); + NEW_ERROR(1, ERROR, "x-stray ‘%c’", *line); + error->end = error->start + 1; + goto done; + } NO_JUMP; CHARS(string); LEAF; @@ -1330,6 +1334,12 @@ static int parse_array_elements(void) fail: return -1; + + done: + in_array = 0; + stack_ptr -= 2; + NEXT; + return 0; } diff --git a/src/mds-kbdc/raw-data.c b/src/mds-kbdc/raw-data.c index 83e8b48..52bec82 100644 --- a/src/mds-kbdc/raw-data.c +++ b/src/mds-kbdc/raw-data.c @@ -264,7 +264,7 @@ static size_t remove_comments(char* restrict content, size_t size) else if (quote) { t; - if (c == '"') quote = 0; + if (strchr("\"\n", c)) quote = 0; } /* # is the comment symbol. */ else if (c == '#') comment = 1; -- cgit v1.2.3-70-g09d2