This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: regpiece(): Convert to a switch() stmt
authorKarl Williamson <khw@cpan.org>
Sun, 4 Oct 2020 22:15:53 +0000 (16:15 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 12 Oct 2020 15:45:47 +0000 (09:45 -0600)
This makes the code easier to understand, I think.

regcomp.c

index bb4bbd0..f4765d8 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -12624,33 +12624,31 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
         FAIL2("panic: regatom returned failure, flags=%#" UVxf, (UV) flags);
     }
 
-    if (! ISMULT2(RExC_parse)) {
-        *flagp = flags;
-        return(ret);
-    }
-
-    /* Here we know the input is a legal quantifier, including {m,n} */
-
-    op = *RExC_parse;
-
 #ifdef RE_TRACK_PATTERN_OFFSETS
     parse_start = RExC_parse;
 #endif
 
-    if (op != '{') {
-        nextchar(pRExC_state);
+    op = *RExC_parse;
+    switch (op) {
 
-        if (op == '*') {
+      case '*':
+        nextchar(pRExC_state);
             min = 0;
-        }
-        else if (op == '+') {
+        break;
+
+      case '+':
+        nextchar(pRExC_state);
             min = 1;
-        }
-        else if (op == '?') {
+        break;
+
+      case '?':
+        nextchar(pRExC_state);
             min = 0; max = 1;
-        }
-    }
-    else {  /* is '{' */
+        break;
+
+      case '{':  /* A '{' may or may not indicate a quantifier; call regcurly()
+                    to determine which */
+        if (regcurly(RExC_parse)) {
         const char* endptr;
 
             /* Here is a quantifier, parse for min and max values */
@@ -12711,6 +12709,17 @@ S_regpiece(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth)
                        "Useless use of greediness modifier '%c'",
                        *RExC_parse);
         }
+
+            break;
+        } /* End of is regcurly() */
+
+        /* Here was a '{', but what followed it didn't form a quantifier. */
+        /* FALLTHROUGH */
+
+      default:
+        *flagp = flags;
+        return(ret);
+        NOT_REACHED; /*NOTREACHED*/
     }
 
     /* Here we have a quantifier, and have calculated 'min' and 'max'.