/[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 427 by ph10, Fri Aug 28 09:55:54 2009 UTC revision 428 by ph10, Mon Aug 31 17:10:26 2009 UTC
# Line 418  the subject. */ Line 418  the subject. */
418    if (md->partial && eptr > mstart)\    if (md->partial && eptr > mstart)\
419      {\      {\
420      md->hitend = TRUE;\      md->hitend = TRUE;\
     md->hitend = TRUE;\  
421      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\      if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL);\
422      }      }
423    
# Line 664  for (;;) Line 663  for (;;)
663    {    {
664    minimize = possessive = FALSE;    minimize = possessive = FALSE;
665    op = *ecode;    op = *ecode;
666    
   /* For partial matching, remember if we ever hit the end of the subject after  
   matching at least one subject character. This code is now wrapped in a macro  
   because it appears several times below. */  
   
   CHECK_PARTIAL();  
   
667    switch(op)    switch(op)
668      {      {
669      case OP_FAIL:      case OP_FAIL:
# Line 1487  for (;;) Line 1480  for (;;)
1480            GETCHAR(c, lastptr);            GETCHAR(c, lastptr);
1481            prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;            prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
1482            }            }
1483          if (eptr >= md->end_subject) cur_is_word = FALSE; else          if (eptr >= md->end_subject)
1484              {
1485              SCHECK_PARTIAL();
1486              cur_is_word = FALSE;
1487              }
1488            else
1489            {            {
1490            GETCHAR(c, eptr);            GETCHAR(c, eptr);
1491            cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;            cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
# Line 1496  for (;;) Line 1494  for (;;)
1494        else        else
1495  #endif  #endif
1496    
1497        /* More streamlined when not in UTF-8 mode */        /* Not in UTF-8 mode */
1498    
1499          {          {
1500          prev_is_word = (eptr != md->start_subject) &&          prev_is_word = (eptr != md->start_subject) &&
1501            ((md->ctypes[eptr[-1]] & ctype_word) != 0);            ((md->ctypes[eptr[-1]] & ctype_word) != 0);
1502          cur_is_word = (eptr < md->end_subject) &&          if (eptr >= md->end_subject)
1503            ((md->ctypes[*eptr] & ctype_word) != 0);            {
1504              SCHECK_PARTIAL();
1505              cur_is_word = FALSE;
1506              }
1507            else cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0);
1508          }          }
1509    
1510        /* Now see if the situation is what we want */        /* Now see if the situation is what we want */
# Line 1520  for (;;) Line 1522  for (;;)
1522      /* Fall through */      /* Fall through */
1523    
1524      case OP_ALLANY:      case OP_ALLANY:
1525      if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr++ >= md->end_subject)
1526          {
1527          SCHECK_PARTIAL();
1528          RRETURN(MATCH_NOMATCH);
1529          }
1530      if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;      if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
1531      ecode++;      ecode++;
1532      break;      break;
# Line 1529  for (;;) Line 1535  for (;;)
1535      any byte, even newline, independent of the setting of PCRE_DOTALL. */      any byte, even newline, independent of the setting of PCRE_DOTALL. */
1536    
1537      case OP_ANYBYTE:      case OP_ANYBYTE:
1538      if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr++ >= md->end_subject)
1539          {
1540          SCHECK_PARTIAL();
1541          RRETURN(MATCH_NOMATCH);
1542          }
1543      ecode++;      ecode++;
1544      break;      break;
1545    
1546      case OP_NOT_DIGIT:      case OP_NOT_DIGIT:
1547      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1548          {
1549          SCHECK_PARTIAL();
1550          RRETURN(MATCH_NOMATCH);
1551          }
1552      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1553      if (      if (
1554  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1547  for (;;) Line 1561  for (;;)
1561      break;      break;
1562    
1563      case OP_DIGIT:      case OP_DIGIT:
1564      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1565          {
1566          SCHECK_PARTIAL();
1567          RRETURN(MATCH_NOMATCH);
1568          }
1569      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1570      if (      if (
1571  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1560  for (;;) Line 1578  for (;;)
1578      break;      break;
1579    
1580      case OP_NOT_WHITESPACE:      case OP_NOT_WHITESPACE:
1581      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1582          {
1583          SCHECK_PARTIAL();
1584          RRETURN(MATCH_NOMATCH);
1585          }
1586      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1587      if (      if (
1588  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1573  for (;;) Line 1595  for (;;)
1595      break;      break;
1596    
1597      case OP_WHITESPACE:      case OP_WHITESPACE:
1598      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1599          {
1600          SCHECK_PARTIAL();
1601          RRETURN(MATCH_NOMATCH);
1602          }
1603      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1604      if (      if (
1605  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1586  for (;;) Line 1612  for (;;)
1612      break;      break;
1613    
1614      case OP_NOT_WORDCHAR:      case OP_NOT_WORDCHAR:
1615      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1616          {
1617          SCHECK_PARTIAL();
1618          RRETURN(MATCH_NOMATCH);
1619          }
1620      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1621      if (      if (
1622  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1599  for (;;) Line 1629  for (;;)
1629      break;      break;
1630    
1631      case OP_WORDCHAR:      case OP_WORDCHAR:
1632      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1633          {
1634          SCHECK_PARTIAL();
1635          RRETURN(MATCH_NOMATCH);
1636          }
1637      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1638      if (      if (
1639  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
# Line 1612  for (;;) Line 1646  for (;;)
1646      break;      break;
1647    
1648      case OP_ANYNL:      case OP_ANYNL:
1649      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1650          {
1651          SCHECK_PARTIAL();
1652          RRETURN(MATCH_NOMATCH);
1653          }
1654      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1655      switch(c)      switch(c)
1656        {        {
# Line 1636  for (;;) Line 1674  for (;;)
1674      break;      break;
1675    
1676      case OP_NOT_HSPACE:      case OP_NOT_HSPACE:
1677      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1678          {
1679          SCHECK_PARTIAL();
1680          RRETURN(MATCH_NOMATCH);
1681          }
1682      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1683      switch(c)      switch(c)
1684        {        {
# Line 1666  for (;;) Line 1708  for (;;)
1708      break;      break;
1709    
1710      case OP_HSPACE:      case OP_HSPACE:
1711      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1712          {
1713          SCHECK_PARTIAL();
1714          RRETURN(MATCH_NOMATCH);
1715          }
1716      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1717      switch(c)      switch(c)
1718        {        {
# Line 1696  for (;;) Line 1742  for (;;)
1742      break;      break;
1743    
1744      case OP_NOT_VSPACE:      case OP_NOT_VSPACE:
1745      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1746          {
1747          SCHECK_PARTIAL();
1748          RRETURN(MATCH_NOMATCH);
1749          }
1750      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1751      switch(c)      switch(c)
1752        {        {
# Line 1714  for (;;) Line 1764  for (;;)
1764      break;      break;
1765    
1766      case OP_VSPACE:      case OP_VSPACE:
1767      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1768          {
1769          SCHECK_PARTIAL();
1770          RRETURN(MATCH_NOMATCH);
1771          }
1772      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1773      switch(c)      switch(c)
1774        {        {
# Line 1737  for (;;) Line 1791  for (;;)
1791    
1792      case OP_PROP:      case OP_PROP:
1793      case OP_NOTPROP:      case OP_NOTPROP:
1794      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1795          {
1796          SCHECK_PARTIAL();
1797          RRETURN(MATCH_NOMATCH);
1798          }
1799      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1800        {        {
1801        const ucd_record *prop = GET_UCD(c);        const ucd_record *prop = GET_UCD(c);
# Line 1782  for (;;) Line 1840  for (;;)
1840      is in the binary; otherwise a compile-time error occurs. */      is in the binary; otherwise a compile-time error occurs. */
1841    
1842      case OP_EXTUNI:      case OP_EXTUNI:
1843      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
1844          {
1845          SCHECK_PARTIAL();
1846          RRETURN(MATCH_NOMATCH);
1847          }
1848      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
1849        {        {
1850        int category = UCD_CATEGORY(c);        int category = UCD_CATEGORY(c);
# Line 1862  for (;;) Line 1924  for (;;)
1924          break;          break;
1925    
1926          default:               /* No repeat follows */          default:               /* No repeat follows */
1927          if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);          if (!match_ref(offset, eptr, length, md, ims))
1928              {
1929              CHECK_PARTIAL();
1930              RRETURN(MATCH_NOMATCH);
1931              }
1932          eptr += length;          eptr += length;
1933          continue;              /* With the main loop */          continue;              /* With the main loop */
1934          }          }
1935    
1936        /* If the length of the reference is zero, just continue with the        /* If the length of the reference is zero, just continue with the
1937        main loop. */        main loop. */
1938    
1939        if (length == 0) continue;        if (length == 0) continue;
1940    
1941        /* First, ensure the minimum number of matches are present. We get back        /* First, ensure the minimum number of matches are present. We get back
# Line 1899  for (;;) Line 1965  for (;;)
1965            {            {
1966            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14);
1967            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
1968            if (fi >= max || !match_ref(offset, eptr, length, md, ims))            if (fi >= max) RRETURN(MATCH_NOMATCH);
1969              if (!match_ref(offset, eptr, length, md, ims))
1970              {              {
1971              CHECK_PARTIAL();              CHECK_PARTIAL();
1972              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
# Line 1919  for (;;) Line 1986  for (;;)
1986            if (!match_ref(offset, eptr, length, md, ims)) break;            if (!match_ref(offset, eptr, length, md, ims)) break;
1987            eptr += length;            eptr += length;
1988            }            }
         CHECK_PARTIAL();  
1989          while (eptr >= pp)          while (eptr >= pp)
1990            {            {
1991            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15);
# Line 1931  for (;;) Line 1997  for (;;)
1997        }        }
1998      /* Control never gets here */      /* Control never gets here */
1999    
   
   
2000      /* Match a bit-mapped character class, possibly repeatedly. This op code is      /* Match a bit-mapped character class, possibly repeatedly. This op code is
2001      used when all the characters in the class have values in the range 0-255,      used when all the characters in the class have values in the range 0-255,
2002      and either the matching is caseful, or the characters are in the range      and either the matching is caseful, or the characters are in the range
# Line 1989  for (;;) Line 2053  for (;;)
2053            {            {
2054            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2055              {              {
2056              CHECK_PARTIAL();              SCHECK_PARTIAL();
2057              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2058              }              }
2059            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
# Line 2011  for (;;) Line 2075  for (;;)
2075            {            {
2076            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2077              {              {
2078              CHECK_PARTIAL();              SCHECK_PARTIAL();
2079              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2080              }              }
2081            c = *eptr++;            c = *eptr++;
# Line 2037  for (;;) Line 2101  for (;;)
2101              {              {
2102              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16);
2103              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2104              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2105              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2106                {                {
2107                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2066  for (;;) Line 2126  for (;;)
2126              {              {
2127              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17);
2128              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2129              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2130              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2131                {                {
2132                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2108  for (;;) Line 2164  for (;;)
2164                }                }
2165              eptr += len;              eptr += len;
2166              }              }
           CHECK_PARTIAL();  
2167            for (;;)            for (;;)
2168              {              {
2169              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18);
# Line 2128  for (;;) Line 2183  for (;;)
2183              if ((data[c/8] & (1 << (c&7))) == 0) break;              if ((data[c/8] & (1 << (c&7))) == 0) break;
2184              eptr++;              eptr++;
2185              }              }
           CHECK_PARTIAL();  
2186            while (eptr >= pp)            while (eptr >= pp)
2187              {              {
2188              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19);
# Line 2209  for (;;) Line 2263  for (;;)
2263            {            {
2264            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20);
2265            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2266            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
2267            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2268              {              {
2269              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 2238  for (;;) Line 2288  for (;;)
2288            if (!_pcre_xclass(c, data)) break;            if (!_pcre_xclass(c, data)) break;
2289            eptr += len;            eptr += len;
2290            }            }
         CHECK_PARTIAL();  
2291          for(;;)          for(;;)
2292            {            {
2293            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);
# Line 2262  for (;;) Line 2311  for (;;)
2311        length = 1;        length = 1;
2312        ecode++;        ecode++;
2313        GETCHARLEN(fc, ecode, length);        GETCHARLEN(fc, ecode, length);
2314        if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);        if (length > md->end_subject - eptr)
2315            {
2316            CHECK_PARTIAL();             /* Not SCHECK_PARTIAL() */
2317            RRETURN(MATCH_NOMATCH);
2318            }
2319        while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH);        while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH);
2320        }        }
2321      else      else
# Line 2270  for (;;) Line 2323  for (;;)
2323    
2324      /* Non-UTF-8 mode */      /* Non-UTF-8 mode */
2325        {        {
2326        if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);        if (md->end_subject - eptr < 1)
2327            {
2328            SCHECK_PARTIAL();            /* This one can use SCHECK_PARTIAL() */
2329            RRETURN(MATCH_NOMATCH);
2330            }
2331        if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);        if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);
2332        ecode += 2;        ecode += 2;
2333        }        }
# Line 2286  for (;;) Line 2343  for (;;)
2343        ecode++;        ecode++;
2344        GETCHARLEN(fc, ecode, length);        GETCHARLEN(fc, ecode, length);
2345    
2346        if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);        if (length > md->end_subject - eptr)
2347            {
2348            CHECK_PARTIAL();             /* Not SCHECK_PARTIAL() */
2349            RRETURN(MATCH_NOMATCH);
2350            }
2351    
2352        /* If the pattern character's value is < 128, we have only one byte, and        /* If the pattern character's value is < 128, we have only one byte, and
2353        can use the fast lookup table. */        can use the fast lookup table. */
# Line 2321  for (;;) Line 2382  for (;;)
2382    
2383      /* Non-UTF-8 mode */      /* Non-UTF-8 mode */
2384        {        {
2385        if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);        if (md->end_subject - eptr < 1)
2386            {
2387            SCHECK_PARTIAL();            /* This one can use SCHECK_PARTIAL() */
2388            RRETURN(MATCH_NOMATCH);
2389            }
2390        if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);        if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
2391        ecode += 2;        ecode += 2;
2392        }        }
# Line 2375  for (;;) Line 2440  for (;;)
2440      case OP_MINQUERY:      case OP_MINQUERY:
2441      c = *ecode++ - OP_STAR;      c = *ecode++ - OP_STAR;
2442      minimize = (c & 1) != 0;      minimize = (c & 1) != 0;
2443    
2444      min = rep_min[c];                 /* Pick up values from tables; */      min = rep_min[c];                 /* Pick up values from tables; */
2445      max = rep_max[c];                 /* zero for max => infinity */      max = rep_max[c];                 /* zero for max => infinity */
2446      if (max == 0) max = INT_MAX;      if (max == 0) max = INT_MAX;
# Line 2427  for (;;) Line 2493  for (;;)
2493              {              {
2494              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22);
2495              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2496              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2497              if (eptr <= md->end_subject - length &&              if (eptr <= md->end_subject - length &&
2498                memcmp(eptr, charptr, length) == 0) eptr += length;                memcmp(eptr, charptr, length) == 0) eptr += length;
2499  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
# Line 2463  for (;;) Line 2525  for (;;)
2525              else break;              else break;
2526              }              }
2527    
           CHECK_PARTIAL();  
2528            if (possessive) continue;            if (possessive) continue;
2529    
2530            for(;;)            for(;;)
# Line 2492  for (;;) Line 2553  for (;;)
2553      /* When not in UTF-8 mode, load a single-byte character. */      /* When not in UTF-8 mode, load a single-byte character. */
2554    
2555      fc = *ecode++;      fc = *ecode++;
2556    
2557      /* The value of fc at this point is always less than 256, though we may or      /* The value of fc at this point is always less than 256, though we may or
2558      may not be in UTF-8 mode. The code is duplicated for the caseless and      may not be in UTF-8 mode. The code is duplicated for the caseless and
2559      caseful cases, for speed, since matching characters is likely to be quite      caseful cases, for speed, since matching characters is likely to be quite
# Line 2524  for (;;) Line 2585  for (;;)
2585            {            {
2586            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24);
2587            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2588            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
2589            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2590              {              {
2591              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 2547  for (;;) Line 2604  for (;;)
2604            eptr++;            eptr++;
2605            }            }
2606    
         CHECK_PARTIAL();  
2607          if (possessive) continue;          if (possessive) continue;
2608    
2609          while (eptr >= pp)          while (eptr >= pp)
# Line 2574  for (;;) Line 2630  for (;;)
2630            }            }
2631          if (fc != *eptr++) RRETURN(MATCH_NOMATCH);          if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
2632          }          }
2633    
2634        if (min == max) continue;        if (min == max) continue;
2635    
2636        if (minimize)        if (minimize)
2637          {          {
2638          for (fi = min;; fi++)          for (fi = min;; fi++)
2639            {            {
2640            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26);
2641            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2642            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
2643            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
2644              {              {
2645              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 2603  for (;;) Line 2657  for (;;)
2657            if (eptr >= md->end_subject || fc != *eptr) break;            if (eptr >= md->end_subject || fc != *eptr) break;
2658            eptr++;            eptr++;
2659            }            }
         CHECK_PARTIAL();  
2660          if (possessive) continue;          if (possessive) continue;
2661    
2662          while (eptr >= pp)          while (eptr >= pp)
2663            {            {
2664            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27);
# Line 2620  for (;;) Line 2674  for (;;)
2674      checking can be multibyte. */      checking can be multibyte. */
2675    
2676      case OP_NOT:      case OP_NOT:
2677      if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr >= md->end_subject)
2678          {
2679          SCHECK_PARTIAL();
2680          RRETURN(MATCH_NOMATCH);
2681          }
2682      ecode++;      ecode++;
2683      GETCHARINCTEST(c, eptr);      GETCHARINCTEST(c, eptr);
2684      if ((ims & PCRE_CASELESS) != 0)      if ((ims & PCRE_CASELESS) != 0)
# Line 2763  for (;;) Line 2821  for (;;)
2821              {              {
2822              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28);
2823              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2824              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2825              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2826                {                {
2827                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2786  for (;;) Line 2840  for (;;)
2840              {              {
2841              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29);
2842              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2843              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2844              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2845                {                {
2846                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2822  for (;;) Line 2872  for (;;)
2872              if (fc == d) break;              if (fc == d) break;
2873              eptr += len;              eptr += len;
2874              }              }
         CHECK_PARTIAL();  
2875          if (possessive) continue;          if (possessive) continue;
2876          for(;;)          for(;;)
2877              {              {
# Line 2841  for (;;) Line 2890  for (;;)
2890              if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;              if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;
2891              eptr++;              eptr++;
2892              }              }
           CHECK_PARTIAL();  
2893            if (possessive) continue;            if (possessive) continue;
2894            while (eptr >= pp)            while (eptr >= pp)
2895              {              {
# Line 2904  for (;;) Line 2952  for (;;)
2952              {              {
2953              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);
2954              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2955              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2956              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2957                {                {
2958                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2926  for (;;) Line 2970  for (;;)
2970              {              {
2971              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33);
2972              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2973              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
2974              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
2975                {                {
2976                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 2961  for (;;) Line 3001  for (;;)
3001              if (fc == d) break;              if (fc == d) break;
3002              eptr += len;              eptr += len;
3003              }              }
           CHECK_PARTIAL();  
3004            if (possessive) continue;            if (possessive) continue;
3005            for(;;)            for(;;)
3006              {              {
# Line 2980  for (;;) Line 3019  for (;;)
3019              if (eptr >= md->end_subject || fc == *eptr) break;              if (eptr >= md->end_subject || fc == *eptr) break;
3020              eptr++;              eptr++;
3021              }              }
           CHECK_PARTIAL();  
3022            if (possessive) continue;            if (possessive) continue;
3023            while (eptr >= pp)            while (eptr >= pp)
3024              {              {
# Line 3486  for (;;) Line 3524  for (;;)
3524          break;          break;
3525    
3526          case OP_ALLANY:          case OP_ALLANY:
3527          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);          if (eptr > md->end_subject - min)
3528              {
3529              SCHECK_PARTIAL();
3530              RRETURN(MATCH_NOMATCH);
3531              }
3532          eptr += min;          eptr += min;
3533          break;          break;
3534    
3535          case OP_ANYBYTE:          case OP_ANYBYTE:
3536          if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH);          if (eptr > md->end_subject - min)
3537              {
3538              SCHECK_PARTIAL();
3539              RRETURN(MATCH_NOMATCH);
3540              }
3541          eptr += min;          eptr += min;
3542          break;          break;
3543    
# Line 3700  for (;;) Line 3746  for (;;)
3746              {              {
3747              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36);
3748              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3749              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
3750              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3751                {                {
3752                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 3720  for (;;) Line 3762  for (;;)
3762              {              {
3763              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37);
3764              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3765              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
3766              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3767                {                {
3768                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 3744  for (;;) Line 3782  for (;;)
3782              {              {
3783              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38);
3784              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3785              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
3786              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3787                {                {
3788                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 3766  for (;;) Line 3800  for (;;)
3800              {              {
3801              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39);
3802              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3803              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
3804              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3805                {                {
3806                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 3788  for (;;) Line 3818  for (;;)
3818              {              {
3819              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40);
3820              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3821              if (fi >= max)              if (fi >= max) RRETURN(MATCH_NOMATCH);
               {  
               CHECK_PARTIAL();  
               RRETURN(MATCH_NOMATCH);  
               }  
3822              if (eptr >= md->end_subject)              if (eptr >= md->end_subject)
3823                {                {
3824                SCHECK_PARTIAL();                SCHECK_PARTIAL();
# Line 3819  for (;;) Line 3845  for (;;)
3845            {            {
3846            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41);
3847            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3848            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
3849            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3850              {              {
3851              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 3855  for (;;) Line 3877  for (;;)
3877            {            {
3878            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);
3879            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3880            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
3881            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
3882              {              {
3883              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4022  for (;;) Line 4040  for (;;)
4040            {            {
4041            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);
4042            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4043            if (fi >= max)            if (fi >= max) RRETURN(MATCH_NOMATCH);
             {  
             CHECK_PARTIAL();  
             RRETURN(MATCH_NOMATCH);  
             }  
4044            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4045              {              {
4046              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4222  for (;;) Line 4236  for (;;)
4236    
4237          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
4238    
         CHECK_PARTIAL();  
4239          if (possessive) continue;          if (possessive) continue;
4240          for(;;)          for(;;)
4241            {            {
# Line 4259  for (;;) Line 4272  for (;;)
4272    
4273          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
4274    
         CHECK_PARTIAL();  
4275          if (possessive) continue;          if (possessive) continue;
4276          for(;;)          for(;;)
4277            {            {
# Line 4496  for (;;) Line 4508  for (;;)
4508    
4509          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
4510    
         CHECK_PARTIAL();  
4511          if (possessive) continue;          if (possessive) continue;
4512          for(;;)          for(;;)
4513            {            {
# Line 4652  for (;;) Line 4663  for (;;)
4663    
4664          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
4665    
         CHECK_PARTIAL();  
4666          if (possessive) continue;          if (possessive) continue;
4667          while (eptr >= pp)          while (eptr >= pp)
4668            {            {

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

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12