5% speedup in an empty loop
[p5sagit/p5-mst-13.2.git] / regcomp.c
index 9039797..a42c4db 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -750,7 +750,7 @@ pregcomp(char *exp, char *xend, PMOP *pm)
     DEBUG_r(
        if (!colorset) {
            int i = 0;
-           char *s = getenv("TERMCAP_COLORS");
+           char *s = PerlEnv_getenv("TERMCAP_COLORS");
            
            colorset = 1;
            if (s) {
@@ -1065,11 +1065,12 @@ reg(I32 paren, I32 *flagp)
                    rx->data->data[n+1] = (void*)av;
                    rx->data->data[n+2] = (void*)sop;
                    SvREFCNT_dec(sv);
+               } else {                /* First pass */
+                   if (tainted)
+                       FAIL("Eval-group in insecure regular expression");
                }
                
                nextchar();
-               if (tainted)
-                   FAIL("Eval-group in insecure regular expression");
                return reganode(EVAL, n);
            }
            case '(':
@@ -1865,6 +1866,30 @@ regclass(void)
     while (regparse < regxend && *regparse != ']') {
        skipcond:
        Class = UCHARAT(regparse++);
+       if (Class == '[' && regparse + 1 < regxend &&
+           /* I smell either [: or [= or [. -- POSIX has been here, right? */
+           (*regparse == ':' || *regparse == '=' || *regparse == '.')) {
+           char  posixccc = *regparse;
+           char* posixccs = regparse++;
+           
+           while (regparse < regxend && *regparse != posixccc)
+               regparse++;
+           if (regparse == regxend)
+               /* Grandfather lone [:, [=, [. */
+               regparse = posixccs;
+           else {
+               regparse++; /* skip over the posixccc */
+               if (*regparse == ']') {
+                   /* Not Implemented Yet.
+                    * (POSIX Extended Character Classes, that is)
+                    * The text between e.g. [: and :] would start
+                    * at posixccs + 1 and stop at regparse - 2. */
+                   if (dowarn && !SIZE_ONLY)
+                       warn("Character class syntax [%c %c] is reserved for future extensions", posixccc, posixccc);
+                   regparse++; /* skip over the ending ] */
+               }
+           }
+       }
        if (Class == '\\') {
            Class = UCHARAT(regparse++);
            switch (Class) {
@@ -2661,6 +2686,3 @@ re_croak2(const char* pat1,const char* pat2, va_alist)
     buf[l1] = '\0';                    /* Overwrite \n */
     croak("%s", buf);
 }
-
-
-