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();