From 8ff80b09ccd7e680829d0911d965ad4b0d6f7939 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 15 Jan 2021 01:19:10 -0800 Subject: Major overhaul of how different modes of behavior work. Approximately 2x speedup and 2x memory footprint reduction. Also removed --mode and VM_HIDE (~ operator), and added --context. Printing works better now. --- vm.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'vm.c') diff --git a/vm.c b/vm.c index b0bc267..346a61a 100644 --- a/vm.c +++ b/vm.c @@ -121,6 +121,25 @@ static const char *match_backref(const char *str, vm_op_t *op, match_t *cap, uns } +// +// Find the next match after prev (or the first match if prev is NULL) +// +match_t *next_match(def_t *defs, file_t *f, match_t *prev, vm_op_t *op, unsigned int flags) +{ + const char *str; + if (prev) { + str = prev->end > prev->start ? prev->end : prev->end + 1; + recycle_if_unused(&prev); + } else { + str = f->contents; + } + for (; str < f->end; ++str) { + match_t *m = match(defs, f, str, op, flags); + if (m) return m; + } + return NULL; +} + // // Run virtual machine operation against a string and return // a match struct, or NULL if no match is found. @@ -316,16 +335,6 @@ match_t *match(def_t *defs, file_t *f, const char *str, vm_op_t *op, unsigned in ADD_OWNER(m->child, p); return m; } - case VM_HIDE: { - match_t *p = match(defs, f, str, op->args.pat, flags); - if (p == NULL) return NULL; - match_t *m = new_match(); - m->start = str; - m->end = p->end; - m->op = op; - ADD_OWNER(m->child, p); - return m; - } case VM_OTHERWISE: { match_t *m = match(defs, f, str, op->args.multiple.first, flags); if (m == NULL) m = match(defs, f, str, op->args.multiple.second, flags); -- cgit v1.2.3