From c9daa5f29f1b23e7ce3180b77029b7f61313df20 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Mon, 14 Dec 2020 18:39:31 -0800 Subject: Added support for `...%p` --- vm.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/vm.c b/vm.c index ed151bf..1bef834 100644 --- a/vm.c +++ b/vm.c @@ -144,18 +144,26 @@ static match_t *_match(grammar_t *g, file_t *f, const char *str, vm_op_t *op, un match_t *m = calloc(sizeof(match_t), 1); m->start = str; m->op = op; - if (op->args.multiple.first) { + if (!op->args.multiple.first && !op->args.multiple.second) { + if (op->multiline) { + str = f->end; + } else { + while (str < f->end && *str != '\n') ++str; + } + } else { match_t **dest = &m->child; for (const char *prev = NULL; prev < str; ) { prev = str; - match_t *p = _match(g, f, str, op->args.multiple.first, flags, rec); - if (p) { - *dest = p; - m->end = p->end; - return m; + if (op->args.multiple.first) { + match_t *p = _match(g, f, str, op->args.multiple.first, flags, rec); + if (p) { + *dest = p; + m->end = p->end; + return m; + } } if (op->args.multiple.second) { - p = _match(g, f, str, op->args.multiple.second, flags, rec); + match_t *p = _match(g, f, str, op->args.multiple.second, flags, rec); if (p) { *dest = p; dest = &p->nextsibling; @@ -171,10 +179,6 @@ static match_t *_match(grammar_t *g, file_t *f, const char *str, vm_op_t *op, un } destroy_match(&m); return NULL; - } else if (op->multiline) { - str = f->end; - } else { - while (str < f->end && *str != '\n') ++str; } m->end = str; return m; -- cgit v1.2.3