aboutsummaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-12-14 18:39:31 -0800
committerBruce Hill <bruce@bruce-hill.com>2020-12-14 18:39:31 -0800
commitc9daa5f29f1b23e7ce3180b77029b7f61313df20 (patch)
treee707cbfb41f693f37c0b1f91c5c27eea439da194 /vm.c
parentc43e4781763ee3f3f148e821a88e99c6b80c58db (diff)
Added support for `...%p`
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c26
1 files 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;