"All tests successful" VC6.0 Win32
[p5sagit/p5-mst-13.2.git] / regexec.c
index df4a31b..6512986 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -67,7 +67,7 @@
  *
  ****    Alterations to Henry's code are...
  ****
- ****    Copyright (c) 1991-2001, Larry Wall
+ ****    Copyright (c) 1991-2002, Larry Wall
  ****
  ****    You may distribute under the terms of either the GNU General Public
  ****    License or the Artistic License, as specified in the README file.
     PL_regkind[(U8)OP(rn)] == EXACT || PL_regkind[(U8)OP(rn)] == REF \
 )
 
+/*
+  Search for mandatory following text node; for lookahead, the text must
+  follow but for lookbehind (rn->flags != 0) we skip to the next step.
+*/
 #define FIND_NEXT_IMPT(rn) STMT_START { \
     while (JUMPABLE(rn)) \
-       if (OP(rn) == SUSPEND || OP(rn) == IFMATCH || \
-           PL_regkind[(U8)OP(rn)] == CURLY) \
+       if (OP(rn) == SUSPEND || PL_regkind[(U8)OP(rn)] == CURLY) \
            rn = NEXTOPER(NEXTOPER(rn)); \
        else if (OP(rn) == PLUS) \
            rn = NEXTOPER(rn); \
+       else if (OP(rn) == IFMATCH) \
+           rn = (rn->flags == 0) ? NEXTOPER(NEXTOPER(rn)) : rn + ARG(rn); \
        else rn += NEXT_OFF(rn); \
 } STMT_END 
 
@@ -1016,12 +1021,12 @@ S_find_byclass(pTHX_ regexp * prog, regnode *c, char *s, char *strend, char *sta
                        c = utf8_to_uvchr((U8*)s, &len);
 
                        /* Handle some of the three Greek sigmas cases.
-                         * Note that not all the possible combinations
-                         * are handled here: some of them are handled
-                         * handled by the standard folding rules, and
-                         * some of them (the character class or ANYOF
-                         * cases) are handled during compiletime in
-                         * regexec.c:S_regclass(). */
+                        * Note that not all the possible combinations
+                        * are handled here: some of them are handled
+                        * by the standard folding rules, and some of
+                        * them (the character class or ANYOF cases)
+                        * are handled during compiletime in
+                        * regexec.c:S_regclass(). */
                        if (c == (UV)UNICODE_GREEK_CAPITAL_LETTER_SIGMA ||
                            c == (UV)UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA)
                            c = (UV)UNICODE_GREEK_SMALL_LETTER_SIGMA;
@@ -2373,8 +2378,20 @@ S_regmatch(pTHX_ regnode *prog)
                char *e = PL_regeol;
 
                if (ibcmp_utf8(s, 0,  ln, do_utf8,
-                              l, &e, 0,  UTF))
-                    sayNO;
+                              l, &e, 0,  UTF)) {
+                    /* One more case for the sharp s:
+                     * pack("U0U*", 0xDF) =~ /ss/i,
+                     * the 0xC3 0x9F are the UTF-8
+                     * byte sequence for the U+00DF. */
+                    if (!(do_utf8 &&
+                          toLOWER(s[0]) == 's' &&
+                          ln >= 2 &&
+                          toLOWER(s[1]) == 's' &&
+                          (U8)l[0] == 0xC3 &&
+                          e - l >= 2 &&
+                          (U8)l[1] == 0x9F))
+                         sayNO;
+               }
                locinput = e;
                nextchr = UCHARAT(locinput);
                break;