From 8ef507792b14fa8042942d1336367a22336e5ada Mon Sep 17 00:00:00 2001 From: CismonX Date: Fri, 25 Dec 2020 19:17:33 +0800 Subject: [PATCH] Improve `ctlseqs_match()`. --- src/ctlseqs.c | 21 +++++++++++++++------ src/ctlseqs.h | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/ctlseqs.c b/src/ctlseqs.c index d12b715..cbfc47c 100644 --- a/src/ctlseqs.c +++ b/src/ctlseqs.c @@ -492,16 +492,25 @@ ctlseqs_matcher_config(struct ctlseqs_matcher *matcher, struct ctlseqs_matcher_o } CTLSEQS_HOT ssize_t -ctlseqs_match(struct ctlseqs_matcher const *matcher, char const **seq_ptr, size_t seq_len, union ctlseqs_value *result) +ctlseqs_match(struct ctlseqs_matcher const *matcher, char const *str, size_t str_len, union ctlseqs_value *result) { struct ctlseqs_match_args args = { - .seq = *seq_ptr, - .seq_len = seq_len, + .seq = str, + .seq_len = str_len, .result = result, - .save_seq = false, + .save_seq = true, }; - ssize_t retval = ctlseqs_do_match(matcher, &args); - *seq_ptr += args.result_idx; + ssize_t retval; + try_match: + retval = ctlseqs_do_match(matcher, &args); + if (retval == CTLSEQS_NOSEQ) { + size_t result_len = args.result[0].len; + if (result_len < str_len) { + args.seq += result_len; + args.seq_len -= result_len; + goto try_match; + } + } return retval; } diff --git a/src/ctlseqs.h b/src/ctlseqs.h index cab2cc9..0976f18 100644 --- a/src/ctlseqs.h +++ b/src/ctlseqs.h @@ -407,7 +407,7 @@ void ctlseqs_matcher_free(struct ctlseqs_matcher *matcher); ssize_t -ctlseqs_match(struct ctlseqs_matcher const *matcher, char const **seq_ptr, size_t seq_len, union ctlseqs_value *result); +ctlseqs_match(struct ctlseqs_matcher const *matcher, char const *str, size_t str_len, union ctlseqs_value *result); struct ctlseqs_reader * ctlseqs_reader_init();