diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-11-17 05:47:51 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-11-17 05:47:51 +0100 |
commit | 631d03f8474f9853bfb14a806cfb07438378853b (patch) | |
tree | d15fe985e2b2664a9d89a84d92b1f19883c739f6 /src | |
parent | mds-kbdc: fix treeisation of let-statements (diff) | |
download | mds-631d03f8474f9853bfb14a806cfb07438378853b.tar.gz mds-631d03f8474f9853bfb14a806cfb07438378853b.tar.bz2 mds-631d03f8474f9853bfb14a806cfb07438378853b.tar.xz |
mds-kbdc: fix treeisation of map statements
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/mds-kbdc/make-tree.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/mds-kbdc/make-tree.c b/src/mds-kbdc/make-tree.c index 533b028..883d1a8 100644 --- a/src/mds-kbdc/make-tree.c +++ b/src/mds-kbdc/make-tree.c @@ -261,6 +261,15 @@ /** + * Check whether a character ends a strings, whilst not being being a quote + * + * @param c:char The character + */ +#define IS_END(c) \ + strchr("([{< >}])", c) + + +/** * Take next parameter, which should be a string or numeral, * and store it in the current node * @@ -298,7 +307,7 @@ call_end = arg_end + get_end_of_call(arg_end, 0, strlen(arg_end)); \ } \ else if (quote) quote = (c != '"'); \ - else if (c == ' ') { arg_end--; break; } \ + else if (IS_END(c)) { arg_end--; break; } \ else quote = (c == '"'); \ } \ prev_end_char = *arg_end, *arg_end = '\0', end = arg_end; \ @@ -444,7 +453,7 @@ else if (quote) quote = (c != '"'); \ else if (c == '\"') quote = 1; \ else if (c == '>') triangle = 0; \ - else if ((c == ' ') && !triangle) { arg_end--; break; } \ + else if (IS_END(c) && !triangle) { arg_end--; break; } \ } \ prev_end_char = *arg_end, *arg_end = '\0', end = arg_end; \ if (*line == '<') \ @@ -521,6 +530,7 @@ #define SEQUENCE \ do /* for(;;) */ \ { \ + *end = prev_end_char; \ while (*line && (*line == ' ')) \ line++; \ if ((*line == '\0') || (*line == ':')) \ @@ -972,21 +982,24 @@ int parse_to_tree(const char* restrict filename, mds_kbdc_tree_t** restrict resu size_t stack_orig = stack_ptr + 1; #define node supernode #define inner sequence - NEW_NODE(map, MAP); /* FIXME memory leak */ + NEW_NODE(map, MAP); node->loc_end = node->loc_start; BRANCH(":"); #undef inner #undef node SEQUENCE; SEQUENCE_FULLY_POPPED(stack_orig); +#define node supernode +#define inner result stack_ptr--; *end = prev_end_char; while (*line && (*line == ' ')) line++; if (*line++ != ':') - continue; /* Not an error in macros. */ -#define node supernode -#define inner result + { + LEAF; + continue; /* Not an error in macros. */ + } BRANCH(":"); #undef inner #undef node @@ -996,6 +1009,9 @@ int parse_to_tree(const char* restrict filename, mds_kbdc_tree_t** restrict resu *end = prev_end_char; while (*line && (*line == ' ')) line++; +#define node supernode + LEAF; +#undef node if (*line == '\0') continue; end = line + strlen(line), prev_end_char = *end; @@ -1072,6 +1088,8 @@ int parse_to_tree(const char* restrict filename, mds_kbdc_tree_t** restrict resu #undef QUOTES #undef END #undef CHARS +#undef IS_END +#undef NO_JUMP #undef NAMES_1 #undef NO_PARAMETERS #undef LEAF |