From aaf881d67295af1276abfd6669cb99732e83d7fb Mon Sep 17 00:00:00 2001 From: CismonX Date: Thu, 4 Mar 2021 18:30:43 +0800 Subject: [PATCH] Move match stack to automatic storage duration. --- src/ctlseqs.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/ctlseqs.c b/src/ctlseqs.c index c97ce53..0fd4b10 100644 --- a/src/ctlseqs.c +++ b/src/ctlseqs.c @@ -143,7 +143,7 @@ struct ctlseqs_matcher { struct ctlseqs_trie_node *node_pools[CTLSEQS_TRIE_NODE_POOL_MAX_NUM]; size_t pool_idx; size_t pool_size; - struct ctlseqs_match_ctx *match_stack; + size_t match_stack_size; }; struct ctlseqs_reader { @@ -295,7 +295,7 @@ CTLSEQS_HOT static ssize_t ctlseqs_match_pattern(struct ctlseqs_matcher const *matcher, struct ctlseqs_match_args const *args) { struct ctlseqs_trie_node const *old_node, empty_node = { 0 }; - struct ctlseqs_match_ctx match_ctx = { + struct ctlseqs_match_ctx match_stack[matcher->match_stack_size], match_ctx = { .node = matcher == NULL ? &empty_node : &matcher->root, .seq = args->seq + 1, .result = args->result + (args->save_seq ? 2 : 0), @@ -314,7 +314,7 @@ ctlseqs_match_pattern(struct ctlseqs_matcher const *matcher, struct ctlseqs_matc old_node = match_ctx.node; match_ctx.node = match_ctx.node->children[-match_ctx.value]; struct ctlseqs_trie_node *next_node = match_ctx.node->next; - matcher->match_stack[++match_stack_top] = (struct ctlseqs_match_ctx) { + match_stack[++match_stack_top] = (struct ctlseqs_match_ctx) { .value = next_node == NULL ? 0 : -next_node->placeholder, .node = old_node, .seq = match_ctx.seq, @@ -330,7 +330,7 @@ ctlseqs_match_pattern(struct ctlseqs_matcher const *matcher, struct ctlseqs_matc } } if (match_stack_top >= 0) { - match_ctx = matcher->match_stack[match_stack_top--]; + match_ctx = match_stack[match_stack_top--]; if (match_ctx.value == 0) { goto match_character; } else { @@ -483,12 +483,7 @@ ctlseqs_matcher_config(struct ctlseqs_matcher *matcher, struct ctlseqs_matcher_o old_node->value = -ch; } } - size_t stack_size = sizeof(struct ctlseqs_match_ctx) * max_format_size; - struct ctlseqs_match_ctx *new_stack = realloc(matcher->match_stack, stack_size); - if (CTLSEQS_UNLIKELY(new_stack == NULL)) { - return CTLSEQS_NOMEM; - } - matcher->match_stack = new_stack; + matcher->match_stack_size = max_format_size; return CTLSEQS_OK; } @@ -522,7 +517,6 @@ ctlseqs_matcher_free(struct ctlseqs_matcher *matcher) for (size_t idx = 0; idx <= matcher->pool_idx; ++idx) { free(matcher->node_pools[idx]); } - free(matcher->match_stack); free(matcher); } }