# HG changeset patch # User Matti Hamalainen # Date 1579851403 -7200 # Node ID 9a1ed82abefd552ae6cbfe43d2eefe51fe46bb54 # Parent 9e1f9e1d14875dc6dac4f3fbabb6d2803563ca02 Fix parsing of +? and *?. diff -r 9e1f9e1d1487 -r 9a1ed82abefd th_regex.c --- a/th_regex.c Fri Jan 24 09:13:24 2020 +0200 +++ b/th_regex.c Fri Jan 24 09:36:43 2020 +0200 @@ -423,17 +423,26 @@ if (cch == '?') { - // Check if previous was a count - pnode->mode = (pnode->mode == TH_RE_MATCH_COUNT_GREEDY) ? - TH_RE_MATCH_COUNT_NONGREEDY : TH_RE_MATCH_COUNT_GREEDY; - - // Previous token is optional (repeat 0-1 times) - pnode->repeatMin = 0; - pnode->repeatMax = 1; + // Check if previous was a count ("*?" or "+?") + if (pnode->mode == TH_RE_MATCH_COUNT_GREEDY) + pnode->mode = TH_RE_MATCH_COUNT_NONGREEDY; + else + if (pnode->mode == TH_RE_MATCH_COUNT_NONGREEDY) + { + res = THERR_INVALID_DATA; + goto exit; + } + else + { + // Previous token is optional (repeat 0-1 times) + pnode->mode = TH_RE_MATCH_COUNT_NONGREEDY; + pnode->repeatMin = 0; + pnode->repeatMax = 1; + } } else { - // Check if previous was a count + // Check if previous was a count ("**", "*+", etc.) if (pnode->mode == TH_RE_MATCH_COUNT_GREEDY || pnode->mode == TH_RE_MATCH_COUNT_NONGREEDY) {