/[pcre]/code/trunk/pcre_exec.c
ViewVC logotype

Diff of /code/trunk/pcre_exec.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 426 by ph10, Wed Aug 26 15:38:32 2009 UTC revision 427 by ph10, Fri Aug 28 09:55:54 2009 UTC
# Line 403  same response. */ Line 403  same response. */
403  /* These macros pack up tests that are used for partial matching, and which  /* These macros pack up tests that are used for partial matching, and which
404  appears several times in the code. We set the "hit end" flag if the pointer is  appears several times in the code. We set the "hit end" flag if the pointer is
405  at the end of the subject and also past the start of the subject (i.e.  at the end of the subject and also past the start of the subject (i.e.
406  something has been matched). The second one is used when we already know we are  something has been matched). For hard partial matching, we then return
407  past the end of the subject. */  immediately. The second one is used when we already know we are past the end of
408    the subject. */
409    
410  #define CHECK_PARTIAL()\  #define CHECK_PARTIAL()\
411    if (md->partial && eptr >= md->end_subject && eptr > mstart)\    if (md->partial && eptr >= md->end_subject && eptr > mstart)\
412      md->hitend = TRUE      {\
413        md->hitend = TRUE;\
414        if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\
415        }
416    
417  #define SCHECK_PARTIAL()\  #define SCHECK_PARTIAL()\
418    if (md->partial && eptr > mstart) md->hitend = TRUE    if (md->partial && eptr > mstart)\
419        {\
420        md->hitend = TRUE;\
421        md->hitend = TRUE;\
422        if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\
423        }
424    
425    
426  /* Performance note: It might be tempting to extract commonly used fields from  /* Performance note: It might be tempting to extract commonly used fields from
427  the md structure (e.g. utf8, end_subject) into individual variables to improve  the md structure (e.g. utf8, end_subject) into individual variables to improve
# Line 1868  for (;;) Line 1878  for (;;)
1878    
1879        for (i = 1; i <= min; i++)        for (i = 1; i <= min; i++)
1880          {          {
1881          if (!match_ref(offset, eptr, length, md, ims))          if (!match_ref(offset, eptr, length, md, ims))
1882            {            {
1883            CHECK_PARTIAL();            CHECK_PARTIAL();
1884            RRETURN(MATCH_NOMATCH);            RRETURN(MATCH_NOMATCH);
1885            }            }
1886          eptr += length;          eptr += length;
1887          }          }
1888    
# Line 1891  for (;;) Line 1901  for (;;)
1901            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
1902            if (fi >= max || !match_ref(offset, eptr, length, md, ims))            if (fi >= max || !match_ref(offset, eptr, length, md, ims))
1903              {              {
1904              CHECK_PARTIAL();              CHECK_PARTIAL();
1905              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
1906              }              }
1907            eptr += length;            eptr += length;
1908            }            }
1909          /* Control never gets here */          /* Control never gets here */
# Line 1909  for (;;) Line 1919  for (;;)
1919            if (!match_ref(offset, eptr, length, md, ims)) break;            if (!match_ref(offset, eptr, length, md, ims)) break;
1920            eptr += length;            eptr += length;
1921            }            }
1922          CHECK_PARTIAL();          CHECK_PARTIAL();
1923          while (eptr >= pp)          while (eptr >= pp)
1924            {            {
1925            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);
# Line 1977  for (;;) Line 1987  for (;;)
1987          {          {
1988          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
1989            {            {
1990            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
1991              {              {
1992              CHECK_PARTIAL();              CHECK_PARTIAL();
1993              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
1994              }              }
1995            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
1996            if (c > 255)            if (c > 255)
1997              {              {
# Line 1999  for (;;) Line 2009  for (;;)
2009          {          {
2010          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
2011            {            {
2012            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2013              {              {
2014              CHECK_PARTIAL();              CHECK_PARTIAL();
2015              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2016              }              }
2017            c = *eptr++;            c = *eptr++;
2018            if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);            if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
2019            }            }
# Line 2027  for (;;) Line 2037  for (;;)
2037              {              {
2038              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16);
2039              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2040              if (fi >= max)              if (fi >= max)
2041                {                {
2042                CHECK_PARTIAL();                CHECK_PARTIAL();
2043                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2044                }                }
2045              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2046                {                {
2047                SCHECK_PARTIAL();                SCHECK_PARTIAL();
2048                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2049                }                }
2050              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
2051              if (c > 255)              if (c > 255)
2052                {                {
# Line 2056  for (;;) Line 2066  for (;;)
2066              {              {
2067              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17);
2068              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2069              if (fi >= max)              if (fi >= max)
2070                {                {
2071                CHECK_PARTIAL();                CHECK_PARTIAL();
2072                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2073                }                }
2074              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2075                {                {
2076                SCHECK_PARTIAL();                SCHECK_PARTIAL();
2077                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2078                }                }
2079              c = *eptr++;              c = *eptr++;
2080              if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);              if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
2081              }              }
# Line 2098  for (;;) Line 2108  for (;;)
2108                }                }
2109              eptr += len;              eptr += len;
2110              }              }
2111            CHECK_PARTIAL();            CHECK_PARTIAL();
2112            for (;;)            for (;;)
2113              {              {
2114              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18);
# Line 2118  for (;;) Line 2128  for (;;)
2128              if ((data[c/8] & (1 << (c&7))) == 0) break;              if ((data[c/8] & (1 << (c&7))) == 0) break;
2129              eptr++;              eptr++;
2130              }              }
2131            CHECK_PARTIAL();            CHECK_PARTIAL();
2132            while (eptr >= pp)            while (eptr >= pp)
2133              {              {
2134              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19);
# Line 2176  for (;;) Line 2186  for (;;)
2186    
2187        for (i = 1; i <= min; i++)        for (i = 1; i <= min; i++)
2188          {          {
2189          if (eptr >= md->end_subject)          if (eptr >= md->end_subject)
2190            {            {
2191            SCHECK_PARTIAL();            SCHECK_PARTIAL();
2192            RRETURN(MATCH_NOMATCH);            RRETURN(MATCH_NOMATCH);
2193            }            }
2194          GETCHARINCTEST(c, eptr);          GETCHARINCTEST(c, eptr);
2195          if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);          if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
2196          }          }
# Line 2199  for (;;) Line 2209  for (;;)
2209            {            {
2210            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20);
2211            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2212            if (fi >= max)            if (fi >= max)
2213              {              {
2214              CHECK_PARTIAL();              CHECK_PARTIAL();
2215              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2216              }              }
2217            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2218              {              {
2219              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2220              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2221              }              }
2222            GETCHARINCTEST(c, eptr);            GETCHARINCTEST(c, eptr);
2223            if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);            if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH);
2224            }            }
# Line 2228  for (;;) Line 2238  for (;;)
2238            if (!_pcre_xclass(c, data)) break;            if (!_pcre_xclass(c, data)) break;
2239            eptr += len;            eptr += len;
2240            }            }
2241          CHECK_PARTIAL();          CHECK_PARTIAL();
2242          for(;;)          for(;;)
2243            {            {
2244            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);
# Line 2455  for (;;) Line 2465  for (;;)
2465    
2466            CHECK_PARTIAL();            CHECK_PARTIAL();
2467            if (possessive) continue;            if (possessive) continue;
2468    
2469            for(;;)            for(;;)
2470              {              {
2471              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23);
# Line 2516  for (;;) Line 2526  for (;;)
2526            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2527            if (fi >= max)            if (fi >= max)
2528              {              {
2529              CHECK_PARTIAL();              CHECK_PARTIAL();
2530              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2531              }              }
2532            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2533              {              {
2534              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2535              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2536              }              }
2537            if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);            if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
# Line 2536  for (;;) Line 2546  for (;;)
2546            if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;            if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;
2547            eptr++;            eptr++;
2548            }            }
2549    
2550          CHECK_PARTIAL();          CHECK_PARTIAL();
2551          if (possessive) continue;          if (possessive) continue;
2552    
2553          while (eptr >= pp)          while (eptr >= pp)
2554            {            {
2555            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25);
# Line 2555  for (;;) Line 2565  for (;;)
2565    
2566      else      else
2567        {        {
2568        for (i = 1; i <= min; i++)        for (i = 1; i <= min; i++)
2569          {          {
2570          if (eptr >= md->end_subject)          if (eptr >= md->end_subject)
2571            {            {
# Line 2563  for (;;) Line 2573  for (;;)
2573            RRETURN(MATCH_NOMATCH);            RRETURN(MATCH_NOMATCH);
2574            }            }
2575          if (fc != *eptr++) RRETURN(MATCH_NOMATCH);          if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
2576          }          }
2577        if (min == max) continue;        if (min == max) continue;
2578        if (minimize)        if (minimize)
2579          {          {
# Line 2577  for (;;) Line 2587  for (;;)
2587              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2588              }              }
2589            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2590              {              {
2591              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2592              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2593              }              }
2594            if (fc != *eptr++) RRETURN(MATCH_NOMATCH);            if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
2595            }            }
2596          /* Control never gets here */          /* Control never gets here */
# Line 2593  for (;;) Line 2603  for (;;)
2603            if (eptr >= md->end_subject || fc != *eptr) break;            if (eptr >= md->end_subject || fc != *eptr) break;
2604            eptr++;            eptr++;
2605            }            }
2606          CHECK_PARTIAL();          CHECK_PARTIAL();
2607          if (possessive) continue;          if (possessive) continue;
2608          while (eptr >= pp)          while (eptr >= pp)
2609            {            {
# Line 2717  for (;;) Line 2727  for (;;)
2727            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2728              {              {
2729              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2730              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2731              }              }
2732            GETCHARINC(d, eptr);            GETCHARINC(d, eptr);
2733            if (d < 256) d = md->lcc[d];            if (d < 256) d = md->lcc[d];
2734            if (fc == d) RRETURN(MATCH_NOMATCH);            if (fc == d) RRETURN(MATCH_NOMATCH);
# Line 2734  for (;;) Line 2744  for (;;)
2744            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2745              {              {
2746              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2747              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2748              }              }
2749            if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);            if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
2750            }            }
2751          }          }
2752    
2753        if (min == max) continue;        if (min == max) continue;
# Line 2757  for (;;) Line 2767  for (;;)
2767                {                {
2768                CHECK_PARTIAL();                CHECK_PARTIAL();
2769                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2770                }                }
2771              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2772                {                {
2773                SCHECK_PARTIAL();                SCHECK_PARTIAL();
2774                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2775                }                }
2776              GETCHARINC(d, eptr);              GETCHARINC(d, eptr);
2777              if (d < 256) d = md->lcc[d];              if (d < 256) d = md->lcc[d];
2778              if (fc == d) RRETURN(MATCH_NOMATCH);              if (fc == d) RRETURN(MATCH_NOMATCH);
# Line 2812  for (;;) Line 2822  for (;;)
2822              if (fc == d) break;              if (fc == d) break;
2823              eptr += len;              eptr += len;
2824              }              }
2825          CHECK_PARTIAL();          CHECK_PARTIAL();
2826          if (possessive) continue;          if (possessive) continue;
2827          for(;;)          for(;;)
2828              {              {
# Line 2831  for (;;) Line 2841  for (;;)
2841              if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;              if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;
2842              eptr++;              eptr++;
2843              }              }
2844            CHECK_PARTIAL();            CHECK_PARTIAL();
2845            if (possessive) continue;            if (possessive) continue;
2846            while (eptr >= pp)            while (eptr >= pp)
2847              {              {
# Line 2860  for (;;) Line 2870  for (;;)
2870            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2871              {              {
2872              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2873              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2874              }              }
2875            GETCHARINC(d, eptr);            GETCHARINC(d, eptr);
2876            if (fc == d) RRETURN(MATCH_NOMATCH);            if (fc == d) RRETURN(MATCH_NOMATCH);
2877            }            }
# Line 2875  for (;;) Line 2885  for (;;)
2885            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2886              {              {
2887              SCHECK_PARTIAL();              SCHECK_PARTIAL();
2888              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2889              }              }
2890            if (fc == *eptr++) RRETURN(MATCH_NOMATCH);            if (fc == *eptr++) RRETURN(MATCH_NOMATCH);
2891            }            }
2892          }          }
2893    
2894        if (min == max) continue;        if (min == max) continue;
# Line 2894  for (;;) Line 2904  for (;;)
2904              {              {
2905              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);
2906              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2907              if (fi >= max)              if (fi >= max)
2908                {                {
2909                CHECK_PARTIAL();                CHECK_PARTIAL();
2910                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2911                }                }
2912              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2913                {                {
2914                SCHECK_PARTIAL();                SCHECK_PARTIAL();
2915                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2916                }                }
2917              GETCHARINC(d, eptr);              GETCHARINC(d, eptr);
2918              if (fc == d) RRETURN(MATCH_NOMATCH);              if (fc == d) RRETURN(MATCH_NOMATCH);
2919              }              }
# Line 2925  for (;;) Line 2935  for (;;)
2935                {                {
2936                SCHECK_PARTIAL();                SCHECK_PARTIAL();
2937                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
2938                }                }
2939              if (fc == *eptr++) RRETURN(MATCH_NOMATCH);              if (fc == *eptr++) RRETURN(MATCH_NOMATCH);
2940              }              }
2941            }            }
# Line 2951  for (;;) Line 2961  for (;;)
2961              if (fc == d) break;              if (fc == d) break;
2962              eptr += len;              eptr += len;
2963              }              }
2964            CHECK_PARTIAL();            CHECK_PARTIAL();
2965            if (possessive) continue;            if (possessive) continue;
2966            for(;;)            for(;;)
2967              {              {
# Line 2970  for (;;) Line 2980  for (;;)
2980              if (eptr >= md->end_subject || fc == *eptr) break;              if (eptr >= md->end_subject || fc == *eptr) break;
2981              eptr++;              eptr++;
2982              }              }
2983            CHECK_PARTIAL();            CHECK_PARTIAL();
2984            if (possessive) continue;            if (possessive) continue;
2985            while (eptr >= pp)            while (eptr >= pp)
2986              {              {
# Line 3077  for (;;) Line 3087  for (;;)
3087            if (prop_fail_result) RRETURN(MATCH_NOMATCH);            if (prop_fail_result) RRETURN(MATCH_NOMATCH);
3088            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3089              {              {
3090              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3091                {                {
3092                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3093                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3094                }                }
3095              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3096              }              }
3097            break;            break;
# Line 3089  for (;;) Line 3099  for (;;)
3099            case PT_LAMP:            case PT_LAMP:
3100            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3101              {              {
3102              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3103                {                {
3104                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3105                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3106                }                }
3107              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3108              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
3109              if ((prop_chartype == ucp_Lu ||              if ((prop_chartype == ucp_Lu ||
# Line 3106  for (;;) Line 3116  for (;;)
3116            case PT_GC:            case PT_GC:
3117            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3118              {              {
3119              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3120                {                {
3121                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3122                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3123                }                }
3124              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3125              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3126              if ((prop_category == prop_value) == prop_fail_result)              if ((prop_category == prop_value) == prop_fail_result)
# Line 3121  for (;;) Line 3131  for (;;)
3131            case PT_PC:            case PT_PC:
3132            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3133              {              {
3134              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3135                {                {
3136                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3137                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3138                }                }
3139              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3140              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
3141              if ((prop_chartype == prop_value) == prop_fail_result)              if ((prop_chartype == prop_value) == prop_fail_result)
# Line 3136  for (;;) Line 3146  for (;;)
3146            case PT_SC:            case PT_SC:
3147            for (i = 1; i <= min; i++)            for (i = 1; i <= min; i++)
3148              {              {
3149              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3150                {                {
3151                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3152                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3153                }                }
3154              GETCHARINCTEST(c, eptr);              GETCHARINCTEST(c, eptr);
3155              prop_script = UCD_SCRIPT(c);              prop_script = UCD_SCRIPT(c);
3156              if ((prop_script == prop_value) == prop_fail_result)              if ((prop_script == prop_value) == prop_fail_result)
# Line 3160  for (;;) Line 3170  for (;;)
3170          {          {
3171          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3172            {            {
3173            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3174              {              {
3175              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3176              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3177              }              }
3178            GETCHARINCTEST(c, eptr);            GETCHARINCTEST(c, eptr);
3179            prop_category = UCD_CATEGORY(c);            prop_category = UCD_CATEGORY(c);
3180            if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);            if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
# Line 3193  for (;;) Line 3203  for (;;)
3203            {            {
3204            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3205              {              {
3206              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3207              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3208              }              }
3209            if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);            if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
3210            eptr++;            eptr++;
3211            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
# Line 3205  for (;;) Line 3215  for (;;)
3215          case OP_ALLANY:          case OP_ALLANY:
3216          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3217            {            {
3218            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3219              {              {
3220              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3221              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3222              }              }
3223            eptr++;            eptr++;
3224            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
3225            }            }
3226          break;          break;
3227    
3228          case OP_ANYBYTE:          case OP_ANYBYTE:
3229          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);
3230          eptr += min;          eptr += min;
3231          break;          break;
3232    
3233          case OP_ANYNL:          case OP_ANYNL:
3234          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3235            {            {
3236            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3237              {              {
3238              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3239              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3240              }              }
3241            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3242            switch(c)            switch(c)
3243              {              {
# Line 3253  for (;;) Line 3263  for (;;)
3263          case OP_NOT_HSPACE:          case OP_NOT_HSPACE:
3264          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3265            {            {
3266            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3267              {              {
3268              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3269              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3270              }              }
3271            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3272            switch(c)            switch(c)
3273              {              {
# Line 3289  for (;;) Line 3299  for (;;)
3299          case OP_HSPACE:          case OP_HSPACE:
3300          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3301            {            {
3302            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3303              {              {
3304              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3305              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3306              }              }
3307            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3308            switch(c)            switch(c)
3309              {              {
# Line 3325  for (;;) Line 3335  for (;;)
3335          case OP_NOT_VSPACE:          case OP_NOT_VSPACE:
3336          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3337            {            {
3338            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3339              {              {
3340              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3341              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3342              }              }
3343            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3344            switch(c)            switch(c)
3345              {              {
# Line 3349  for (;;) Line 3359  for (;;)
3359          case OP_VSPACE:          case OP_VSPACE:
3360          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3361            {            {
3362            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3363              {              {
3364              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3365              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3366              }              }
3367            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3368            switch(c)            switch(c)
3369              {              {
# Line 3373  for (;;) Line 3383  for (;;)
3383          case OP_NOT_DIGIT:          case OP_NOT_DIGIT:
3384          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3385            {            {
3386            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3387              {              {
3388              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3389              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3390              }              }
3391            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3392            if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)            if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)
3393              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
# Line 3387  for (;;) Line 3397  for (;;)
3397          case OP_DIGIT:          case OP_DIGIT:
3398          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3399            {            {
3400            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3401              {              {
3402              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3403              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3404              }              }
3405            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)
3406              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3407            /* No need to skip more bytes - we know it's a 1-byte character */            /* No need to skip more bytes - we know it's a 1-byte character */
# Line 3401  for (;;) Line 3411  for (;;)
3411          case OP_NOT_WHITESPACE:          case OP_NOT_WHITESPACE:
3412          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3413            {            {
3414            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3415              {              {
3416              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3417              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3418              }              }
3419            if (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)            if (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)
3420              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3421            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);
# Line 3415  for (;;) Line 3425  for (;;)
3425          case OP_WHITESPACE:          case OP_WHITESPACE:
3426          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3427            {            {
3428            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3429              {              {
3430              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3431              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3432              }              }
3433            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)
3434              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3435            /* No need to skip more bytes - we know it's a 1-byte character */            /* No need to skip more bytes - we know it's a 1-byte character */
# Line 3439  for (;;) Line 3449  for (;;)
3449          case OP_WORDCHAR:          case OP_WORDCHAR:
3450          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3451            {            {
3452            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3453              {              {
3454              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3455              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3456              }              }
3457            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)            if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)
3458              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3459            /* No need to skip more bytes - we know it's a 1-byte character */            /* No need to skip more bytes - we know it's a 1-byte character */
# Line 3465  for (;;) Line 3475  for (;;)
3475          case OP_ANY:          case OP_ANY:
3476          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3477            {            {
3478            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3479              {              {
3480              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3481              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3482              }              }
3483            if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);            if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
3484            eptr++;            eptr++;
3485            }            }
3486          break;          break;
3487    
3488          case OP_ALLANY:          case OP_ALLANY:
3489          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);
3490          eptr += min;          eptr += min;
3491          break;          break;
3492    
3493          case OP_ANYBYTE:          case OP_ANYBYTE:
3494          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);
3495          eptr += min;          eptr += min;
3496          break;          break;
3497    
3498          case OP_ANYNL:          case OP_ANYNL:
3499          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3500            {            {
3501            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3502              {              {
3503              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3504              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3505              }              }
3506            switch(*eptr++)            switch(*eptr++)
3507              {              {
3508              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
# Line 3514  for (;;) Line 3524  for (;;)
3524          case OP_NOT_HSPACE:          case OP_NOT_HSPACE:
3525          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3526            {            {
3527            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3528              {              {
3529              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3530              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3531              }              }
3532            switch(*eptr++)            switch(*eptr++)
3533              {              {
3534              default: break;              default: break;
# Line 3533  for (;;) Line 3543  for (;;)
3543          case OP_HSPACE:          case OP_HSPACE:
3544          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3545            {            {
3546            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3547              {              {
3548              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3549              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3550              }              }
3551            switch(*eptr++)            switch(*eptr++)
3552              {              {
3553              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
# Line 3552  for (;;) Line 3562  for (;;)
3562          case OP_NOT_VSPACE:          case OP_NOT_VSPACE:
3563          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3564            {            {
3565            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3566              {              {
3567              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3568              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3569              }              }
3570            switch(*eptr++)            switch(*eptr++)
3571              {              {
3572              default: break;              default: break;
# Line 3573  for (;;) Line 3583  for (;;)
3583          case OP_VSPACE:          case OP_VSPACE:
3584          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3585            {            {
3586            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3587              {              {
3588              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3589              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3590              }              }
3591            switch(*eptr++)            switch(*eptr++)
3592              {              {
3593              default: RRETURN(MATCH_NOMATCH);              default: RRETURN(MATCH_NOMATCH);
# Line 3593  for (;;) Line 3603  for (;;)
3603    
3604          case OP_NOT_DIGIT:          case OP_NOT_DIGIT:
3605          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3606            {            {
3607            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3608              {              {
3609              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3610              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3611              }              }
3612            if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);            if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
3613            }            }
3614          break;          break;
3615    
3616          case OP_DIGIT:          case OP_DIGIT:
3617          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3618            {            {
3619            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3620              {              {
3621              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3622              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3623              }              }
3624            if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);            if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
3625            }            }
3626          break;          break;
3627    
3628          case OP_NOT_WHITESPACE:          case OP_NOT_WHITESPACE:
3629          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3630            {            {
3631            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3632              {              {
3633              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3634              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3635              }              }
3636            if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);            if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
3637            }            }
3638          break;          break;
3639    
3640          case OP_WHITESPACE:          case OP_WHITESPACE:
3641          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3642            {            {
3643            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3644              {              {
3645              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3646              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3647              }              }
3648            if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);            if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
3649            }            }
3650          break;          break;
3651    
3652          case OP_NOT_WORDCHAR:          case OP_NOT_WORDCHAR:
3653          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3654            {            {
3655            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3656              {              {
3657              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3658              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3659              }              }
3660            if ((md->ctypes[*eptr++] & ctype_word) != 0)            if ((md->ctypes[*eptr++] & ctype_word) != 0)
3661              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3662            }            }
3663          break;          break;
3664    
3665          case OP_WORDCHAR:          case OP_WORDCHAR:
3666          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3667            {            {
3668            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3669              {              {
3670              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3671              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3672              }              }
3673            if ((md->ctypes[*eptr++] & ctype_word) == 0)            if ((md->ctypes[*eptr++] & ctype_word) == 0)
3674              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3675            }            }
3676          break;          break;
3677    
3678          default:          default:
# Line 3690  for (;;) Line 3700  for (;;)
3700              {              {
3701              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36);
3702              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3703              if (fi >= max)              if (fi >= max)
3704                {                {
3705                CHECK_PARTIAL();                CHECK_PARTIAL();
3706                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3707                }                }
3708              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3709                {                {
3710                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3711                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3712                }                }
3713              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
3714              if (prop_fail_result) RRETURN(MATCH_NOMATCH);              if (prop_fail_result) RRETURN(MATCH_NOMATCH);
3715              }              }
# Line 3710  for (;;) Line 3720  for (;;)
3720              {              {
3721              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37);
3722              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3723              if (fi >= max)              if (fi >= max)
3724                {                {
3725                CHECK_PARTIAL();                CHECK_PARTIAL();
3726                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3727                }                }
3728              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3729                {                {
3730                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3731                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3732                }                }
3733              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
3734              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
3735              if ((prop_chartype == ucp_Lu ||              if ((prop_chartype == ucp_Lu ||
# Line 3734  for (;;) Line 3744  for (;;)
3744              {              {
3745              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38);
3746              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3747              if (fi >= max)              if (fi >= max)
3748                {                {
3749                CHECK_PARTIAL();                CHECK_PARTIAL();
3750                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3751                }                }
3752              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3753                {                {
3754                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3755                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3756                }                }
3757              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
3758              prop_category = UCD_CATEGORY(c);              prop_category = UCD_CATEGORY(c);
3759              if ((prop_category == prop_value) == prop_fail_result)              if ((prop_category == prop_value) == prop_fail_result)
# Line 3756  for (;;) Line 3766  for (;;)
3766              {              {
3767              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);
3768              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3769              if (fi >= max)              if (fi >= max)
3770                {                {
3771                CHECK_PARTIAL();                CHECK_PARTIAL();
3772                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3773                }                }
3774              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3775                {                {
3776                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3777                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3778                }                }
3779              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
3780              prop_chartype = UCD_CHARTYPE(c);              prop_chartype = UCD_CHARTYPE(c);
3781              if ((prop_chartype == prop_value) == prop_fail_result)              if ((prop_chartype == prop_value) == prop_fail_result)
# Line 3778  for (;;) Line 3788  for (;;)
3788              {              {
3789              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40);
3790              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3791              if (fi >= max)              if (fi >= max)
3792                {                {
3793                CHECK_PARTIAL();                CHECK_PARTIAL();
3794                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3795                }                }
3796              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3797                {                {
3798                SCHECK_PARTIAL();                SCHECK_PARTIAL();
3799                RRETURN(MATCH_NOMATCH);                RRETURN(MATCH_NOMATCH);
3800                }                }
3801              GETCHARINC(c, eptr);              GETCHARINC(c, eptr);
3802              prop_script = UCD_SCRIPT(c);              prop_script = UCD_SCRIPT(c);
3803              if ((prop_script == prop_value) == prop_fail_result)              if ((prop_script == prop_value) == prop_fail_result)
# Line 3809  for (;;) Line 3819  for (;;)
3819            {            {
3820            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41);
3821            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3822            if (fi >= max)            if (fi >= max)
3823              {              {
3824              CHECK_PARTIAL();              CHECK_PARTIAL();
3825              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3826              }              }
3827            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3828              {              {
3829              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3830              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3831              }              }
3832            GETCHARINCTEST(c, eptr);            GETCHARINCTEST(c, eptr);
3833            prop_category = UCD_CATEGORY(c);            prop_category = UCD_CATEGORY(c);
3834            if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);            if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
# Line 3845  for (;;) Line 3855  for (;;)
3855            {            {
3856            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);
3857            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3858            if (fi >= max)            if (fi >= max)
3859              {              {
3860              CHECK_PARTIAL();              CHECK_PARTIAL();
3861              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3862              }              }
3863            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3864              {              {
3865              SCHECK_PARTIAL();              SCHECK_PARTIAL();
3866              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3867              }              }
3868            if (ctype == OP_ANY && IS_NEWLINE(eptr))            if (ctype == OP_ANY && IS_NEWLINE(eptr))
3869              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3870            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
# Line 4012  for (;;) Line 4022  for (;;)
4022            {            {
4023            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);
4024            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4025            if (fi >= max)            if (fi >= max)
4026              {              {
4027              CHECK_PARTIAL();              CHECK_PARTIAL();
4028              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4029              }              }
4030            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4031              {              {
4032              SCHECK_PARTIAL();              SCHECK_PARTIAL();
4033              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4034              }              }
4035            if (ctype == OP_ANY && IS_NEWLINE(eptr))            if (ctype == OP_ANY && IS_NEWLINE(eptr))
4036              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
4037            c = *eptr++;            c = *eptr++;
# Line 4894  md->jscript_compat = (re->options & PCRE Line 4904  md->jscript_compat = (re->options & PCRE
4904  md->notbol = (options & PCRE_NOTBOL) != 0;  md->notbol = (options & PCRE_NOTBOL) != 0;
4905  md->noteol = (options & PCRE_NOTEOL) != 0;  md->noteol = (options & PCRE_NOTEOL) != 0;
4906  md->notempty = (options & PCRE_NOTEMPTY) != 0;  md->notempty = (options & PCRE_NOTEMPTY) != 0;
4907  md->partial = (options & PCRE_PARTIAL) != 0;  md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 :
4908                  ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0;
4909  md->hitend = FALSE;  md->hitend = FALSE;
4910    
4911  md->recursive = NULL;                   /* No recursion at top level */  md->recursive = NULL;                   /* No recursion at top level */
# Line 5252  for(;;) Line 5263  for(;;)
5263        }        }
5264      }      }
5265    
5266    /* OK, we can now run the match. If "hitend" is set afterwards, remember the    /* OK, we can now run the match. If "hitend" is set afterwards, remember the
5267    first starting point for which a partial match was found. */    first starting point for which a partial match was found. */
5268    
5269    md->start_match_ptr = start_match;    md->start_match_ptr = start_match;
# Line 5394  if (using_temporary_offsets) Line 5405  if (using_temporary_offsets)
5405    (pcre_free)(md->offset_vector);    (pcre_free)(md->offset_vector);
5406    }    }
5407    
5408  if (rc != MATCH_NOMATCH)  if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL)
5409    {    {
5410    DPRINTF((">>>> error: returning %d\n", rc));    DPRINTF((">>>> error: returning %d\n", rc));
5411    return rc;    return rc;
5412    }    }
5413  else if (md->partial && start_partial != NULL)  else if (start_partial != NULL)
5414    {    {
5415    DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));    DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
5416    if (offsetcount > 1)    if (offsetcount > 1)
5417      {      {
5418      offsets[0] = start_partial - (USPTR)subject;      offsets[0] = start_partial - (USPTR)subject;
5419      offsets[1] = end_subject - (USPTR)subject;      offsets[1] = end_subject - (USPTR)subject;
5420      }      }
5421    return PCRE_ERROR_PARTIAL;    return PCRE_ERROR_PARTIAL;
5422    }    }
5423  else  else

Legend:
Removed from v.426  
changed lines
  Added in v.427

  ViewVC Help
Powered by ViewVC 1.1.5