aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-17 05:47:51 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-17 05:47:51 +0100
commit631d03f8474f9853bfb14a806cfb07438378853b (patch)
treed15fe985e2b2664a9d89a84d92b1f19883c739f6 /src/mds-kbdc
parentmds-kbdc: fix treeisation of let-statements (diff)
downloadmds-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/mds-kbdc')
-rw-r--r--src/mds-kbdc/make-tree.c30
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