changeset 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
files th_regex.c
diffstat 1 files changed, 17 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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)
                     {