aboutsummaryrefslogtreecommitdiff
path: root/print.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2021-07-26 20:59:45 -0700
committerBruce Hill <bruce@bruce-hill.com>2021-07-26 20:59:45 -0700
commitf23b9bc6375797d03dee54a31fcaa634f8376975 (patch)
tree624128655eeb20d68098e8c772d9d3ac77f1ee1e /print.c
parentd7030709801cde01739850a85f156d181554f520 (diff)
Introduced cache to greatly speed up many use cases
Diffstat (limited to 'print.c')
-rw-r--r--print.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/print.c b/print.c
index a66893b..b9d1a41 100644
--- a/print.c
+++ b/print.c
@@ -109,7 +109,7 @@ static void _print_match(FILE *out, printer_t *pr, match_t *m)
pr->pos = m->start;
if (m->pat->type == BP_REPLACE) {
if (m->skip_replacement) {
- _print_match(out, pr, m->child);
+ _print_match(out, pr, m->children[0]);
return;
}
size_t line = get_line_number(pr->file, m->start);
@@ -187,7 +187,8 @@ static void _print_match(FILE *out, printer_t *pr, match_t *m)
print_line_number(out, pr, line > line_end ? 0 : line, pr->use_color ? color_normal : NULL);
} else {
const char *prev = m->start;
- for (match_t *child = m->child; child; child = child->nextsibling) {
+ for (int i = 0; m->children && m->children[i]; i++) {
+ match_t *child = m->children[i];
// Skip children from e.g. zero-width matches like >@foo
if (!(prev <= child->start && child->start <= m->end &&
prev <= child->end && child->end <= m->end))
@@ -262,8 +263,8 @@ int print_errors(printer_t *pr, match_t *m)
fprint_line(stderr, pr->file, m->start, m->end, " ");
return 1;
}
- if (m->child) ret += print_errors(pr, m->child);
- if (m->nextsibling) ret += print_errors(pr, m->nextsibling);
+ for (int i = 0; m->children && m->children[i]; i++)
+ ret += print_errors(pr, m->children[i]);
return ret;
}