An inconvenient hang would happen if the stdio _ptr wasn't
[p5sagit/p5-mst-13.2.git] / regcomp.c
index 989ca24..3b4f481 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -2912,7 +2912,7 @@ tryagain:
                                RExC_parse = p + 1;
                                vFAIL("Missing right brace on \\x{}");
                            }
-                           else if (UTF) {
+                           else {
                                numlen = 1;     /* allow underscores */
                                ender = (UV)scan_hex(p + 1, e - p - 1, &numlen);
                                /* numlen is generous */
@@ -2922,12 +2922,6 @@ tryagain:
                                }
                                p = e + 1;
                            }
-                           else
-                           {
-                               RExC_parse = e + 1;
-                               vFAIL("Can't use \\x{} without 'use utf8' declaration");
-                           }
-
                        }
                        else {
                            numlen = 0;         /* disallow underscores */
@@ -3711,7 +3705,7 @@ S_regclassutf8(pTHX_ RExC_state_t *pRExC_state)
            flags |= ANYOF_FOLD;
        if (LOC)
            flags |= ANYOF_LOCALE;
-       listsv = newSVpvn("# comment\n",10);
+       listsv = newSVpvn("# comment\n", 10);
     }
 
     if (!SIZE_ONLY && ckWARN(WARN_REGEXP))
@@ -3874,12 +3868,16 @@ S_regclassutf8(pTHX_ RExC_state_t *pRExC_state)
                case ANYOF_NPUNCT:
                    Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsPunct\n");   break;
                case ANYOF_SPACE:
-               case ANYOF_PSXSPC:
+                   Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsSpacePerl\n");break;
+               case ANYOF_NSPACE:
+                   Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsSpacePerl\n");break;
                case ANYOF_BLANK:
+                   Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsBlank\n");   break;
+               case ANYOF_NBLANK:
+                   Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsBlank\n");   break;
+               case ANYOF_PSXSPC:
                    Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsSpace\n");   break;
-               case ANYOF_NSPACE:
                case ANYOF_NPSXSPC:
-               case ANYOF_NBLANK:
                    Perl_sv_catpvf(aTHX_ listsv, "!utf8::IsSpace\n");   break;
                case ANYOF_UPPER:
                    Perl_sv_catpvf(aTHX_ listsv, "+utf8::IsUpper\n");   break;
@@ -4374,26 +4372,31 @@ Perl_regprop(pTHX_ SV *sv, regnode *o)
        Perl_sv_catpvf(aTHX_ sv, "[%s", PL_colors[0]);
        if (o->flags & ANYOF_INVERT)
            sv_catpv(sv, "^");
-       for (i = 0; i <= 256; i++) {
-           if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
-               if (rangestart == -1)
-                   rangestart = i;
-           } else if (rangestart != -1) {
-               if (i <= rangestart + 3)
-                   for (; rangestart < i; rangestart++)
+       if (OP(o) == ANYOF) {
+           for (i = 0; i <= 256; i++) {
+               if (i < 256 && ANYOF_BITMAP_TEST(o,i)) {
+                   if (rangestart == -1)
+                       rangestart = i;
+               } else if (rangestart != -1) {
+                   if (i <= rangestart + 3)
+                       for (; rangestart < i; rangestart++)
+                           put_byte(sv, rangestart);
+                   else {
                        put_byte(sv, rangestart);
-               else {
-                   put_byte(sv, rangestart);
-                   sv_catpv(sv, "-");
-                   put_byte(sv, i - 1);
+                       sv_catpv(sv, "-");
+                       put_byte(sv, i - 1);
+                   }
+                   rangestart = -1;
                }
-               rangestart = -1;
            }
+           if (o->flags & ANYOF_CLASS)
+               for (i = 0; i < sizeof(out)/sizeof(char*); i++)
+                   if (ANYOF_CLASS_TEST(o,i))
+                       sv_catpv(sv, out[i]);
+       }
+       else {
+           sv_catpv(sv, "{ANYOFUTF8}"); /* TODO: full decode */
        }
-       if (o->flags & ANYOF_CLASS)
-           for (i = 0; i < sizeof(out)/sizeof(char*); i++)
-               if (ANYOF_CLASS_TEST(o,i))
-                   sv_catpv(sv, out[i]);
        Perl_sv_catpvf(aTHX_ sv, "%s]", PL_colors[1]);
     }
     else if (k == BRANCHJ && (OP(o) == UNLESSM || OP(o) == IFMATCH))
@@ -4602,6 +4605,7 @@ Perl_save_re_context(pTHX)
     SAVEI32(PL_reg_oldpos);                    /* from regexec.c */
     SAVEVPTR(PL_reg_oldcurpm);         /* from regexec.c */
     SAVEVPTR(PL_reg_curpm);            /* from regexec.c */
+    SAVEI32(PL_regnpar);               /* () count. */
 #ifdef DEBUGGING
     SAVEPPTR(PL_reg_starttry);         /* from regexec.c */    
 #endif