comparison th_regex.c @ 641:9a1ed82abefd

Fix parsing of +? and *?.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 24 Jan 2020 09:36:43 +0200
parents 9e1f9e1d1487
children 3a35db5c1873
comparison
equal deleted inserted replaced
640:9e1f9e1d1487 641:9a1ed82abefd
421 if ((res = th_regex_parse_ctx_get_prev_node(&ctx, &pnode)) != THERR_OK) 421 if ((res = th_regex_parse_ctx_get_prev_node(&ctx, &pnode)) != THERR_OK)
422 goto exit; 422 goto exit;
423 423
424 if (cch == '?') 424 if (cch == '?')
425 { 425 {
426 // Check if previous was a count 426 // Check if previous was a count ("*?" or "+?")
427 pnode->mode = (pnode->mode == TH_RE_MATCH_COUNT_GREEDY) ? 427 if (pnode->mode == TH_RE_MATCH_COUNT_GREEDY)
428 TH_RE_MATCH_COUNT_NONGREEDY : TH_RE_MATCH_COUNT_GREEDY; 428 pnode->mode = TH_RE_MATCH_COUNT_NONGREEDY;
429 429 else
430 // Previous token is optional (repeat 0-1 times) 430 if (pnode->mode == TH_RE_MATCH_COUNT_NONGREEDY)
431 pnode->repeatMin = 0; 431 {
432 pnode->repeatMax = 1; 432 res = THERR_INVALID_DATA;
433 goto exit;
434 }
435 else
436 {
437 // Previous token is optional (repeat 0-1 times)
438 pnode->mode = TH_RE_MATCH_COUNT_NONGREEDY;
439 pnode->repeatMin = 0;
440 pnode->repeatMax = 1;
441 }
433 } 442 }
434 else 443 else
435 { 444 {
436 // Check if previous was a count 445 // Check if previous was a count ("**", "*+", etc.)
437 if (pnode->mode == TH_RE_MATCH_COUNT_GREEDY || 446 if (pnode->mode == TH_RE_MATCH_COUNT_GREEDY ||
438 pnode->mode == TH_RE_MATCH_COUNT_NONGREEDY) 447 pnode->mode == TH_RE_MATCH_COUNT_NONGREEDY)
439 { 448 {
440 res = THERR_INVALID_DATA; 449 res = THERR_INVALID_DATA;
441 goto exit; 450 goto exit;