Improve `ctlseqs_match()`.

This commit is contained in:
CismonX 2020-12-25 19:17:33 +08:00
parent aa3cef3bc7
commit 8ef507792b
Signed by: cismonx
GPG Key ID: 3094873E29A482FB
2 changed files with 16 additions and 7 deletions

View File

@ -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;
}

View File

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