/[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 1251 by ph10, Wed Feb 20 17:42:03 2013 UTC revision 1346 by ph10, Tue Jul 2 18:37:36 2013 UTC
# Line 56  possible. There are also some static sup Line 56  possible. There are also some static sup
56  #undef min  #undef min
57  #undef max  #undef max
58    
59  /* The md->capture_last field uses the lower 16 bits for the last captured  /* The md->capture_last field uses the lower 16 bits for the last captured
60  substring (which can never be greater than 65535) and a bit in the top half  substring (which can never be greater than 65535) and a bit in the top half
61  to mean "capture vector overflowed". This odd way of doing things was  to mean "capture vector overflowed". This odd way of doing things was
62  implemented when it was realized that preserving and restoring the overflow bit  implemented when it was realized that preserving and restoring the overflow bit
63  whenever the last capture number was saved/restored made for a neater  whenever the last capture number was saved/restored made for a neater
64  interface, and doing it this way saved on (a) another variable, which would  interface, and doing it this way saved on (a) another variable, which would
65  have increased the stack frame size (a big NO-NO in PCRE) and (b) another  have increased the stack frame size (a big NO-NO in PCRE) and (b) another
66  separate set of save/restore instructions. The following defines are used in  separate set of save/restore instructions. The following defines are used in
67  implementing this. */  implementing this. */
68    
69  #define CAPLMASK    0x0000ffff    /* The bits used for last_capture */  #define CAPLMASK    0x0000ffff    /* The bits used for last_capture */
# Line 87  defined PCRE_ERROR_xxx codes, which are Line 87  defined PCRE_ERROR_xxx codes, which are
87  negative to avoid the external error codes. */  negative to avoid the external error codes. */
88    
89  #define MATCH_ACCEPT       (-999)  #define MATCH_ACCEPT       (-999)
90  #define MATCH_COMMIT       (-998)  #define MATCH_KETRPOS      (-998)
91  #define MATCH_KETRPOS      (-997)  #define MATCH_ONCE         (-997)
92  #define MATCH_ONCE         (-996)  /* The next 5 must be kept together and in sequence so that a test that checks
93    for any one of them can use a range. */
94    #define MATCH_COMMIT       (-996)
95  #define MATCH_PRUNE        (-995)  #define MATCH_PRUNE        (-995)
96  #define MATCH_SKIP         (-994)  #define MATCH_SKIP         (-994)
97  #define MATCH_SKIP_ARG     (-993)  #define MATCH_SKIP_ARG     (-993)
98  #define MATCH_THEN         (-992)  #define MATCH_THEN         (-992)
99    #define MATCH_BACKTRACK_MAX MATCH_THEN
100    #define MATCH_BACKTRACK_MIN MATCH_COMMIT
101    
102  /* Maximum number of ints of offset to save on the stack for recursive calls.  /* Maximum number of ints of offset to save on the stack for recursive calls.
103  If the offset vector is bigger, malloc is used. This should be a multiple of 3,  If the offset vector is bigger, malloc is used. This should be a multiple of 3,
# Line 233  if (caseless) Line 237  if (caseless)
237      {      {
238      while (length-- > 0)      while (length-- > 0)
239        {        {
240        pcre_uchar cc, cp;        pcre_uint32 cc, cp;
241        if (eptr >= md->end_subject) return -2;   /* Partial match */        if (eptr >= md->end_subject) return -2;   /* Partial match */
242        cc = RAWUCHARTEST(eptr);        cc = RAWUCHARTEST(eptr);
243        cp = RAWUCHARTEST(p);        cp = RAWUCHARTEST(p);
# Line 308  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM Line 312  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM
312         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,
313         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,
314         RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60,         RM51,  RM52, RM53, RM54, RM55, RM56, RM57, RM58, RM59, RM60,
315         RM61,  RM62, RM63, RM64, RM65, RM66, RM67 };         RM61,  RM62, RM63, RM64, RM65, RM66, RM67, RM68 };
316    
317  /* These versions of the macros use the stack, as normal. There are debugging  /* These versions of the macros use the stack, as normal. There are debugging
318  versions and production versions. Note that the "rw" argument of RMATCH isn't  versions and production versions. Note that the "rw" argument of RMATCH isn't
# Line 777  for (;;) Line 781  for (;;)
781      case OP_FAIL:      case OP_FAIL:
782      RRETURN(MATCH_NOMATCH);      RRETURN(MATCH_NOMATCH);
783    
     /* COMMIT overrides PRUNE, SKIP, and THEN */  
   
784      case OP_COMMIT:      case OP_COMMIT:
785      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
786        eptrb, RM52);        eptrb, RM52);
787      if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE &&      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
         rrc != MATCH_SKIP && rrc != MATCH_SKIP_ARG &&  
         rrc != MATCH_THEN)  
       RRETURN(rrc);  
788      RRETURN(MATCH_COMMIT);      RRETURN(MATCH_COMMIT);
789    
     /* PRUNE overrides THEN */  
   
790      case OP_PRUNE:      case OP_PRUNE:
791      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
792        eptrb, RM51);        eptrb, RM51);
793      if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
794      RRETURN(MATCH_PRUNE);      RRETURN(MATCH_PRUNE);
795    
796      case OP_PRUNE_ARG:      case OP_PRUNE_ARG:
# Line 803  for (;;) Line 800  for (;;)
800        eptrb, RM56);        eptrb, RM56);
801      if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&      if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&
802           md->mark == NULL) md->mark = ecode + 2;           md->mark == NULL) md->mark = ecode + 2;
803      if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
804      RRETURN(MATCH_PRUNE);      RRETURN(MATCH_PRUNE);
805    
     /* SKIP overrides PRUNE and THEN */  
   
806      case OP_SKIP:      case OP_SKIP:
807      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md,
808        eptrb, RM53);        eptrb, RM53);
809      if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN)      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       RRETURN(rrc);  
810      md->start_match_ptr = eptr;   /* Pass back current position */      md->start_match_ptr = eptr;   /* Pass back current position */
811      RRETURN(MATCH_SKIP);      RRETURN(MATCH_SKIP);
812    
813      /* Note that, for Perl compatibility, SKIP with an argument does NOT set      /* Note that, for Perl compatibility, SKIP with an argument does NOT set
814      nomatch_mark. There is a flag that disables this opcode when re-matching a      nomatch_mark. When a pattern match ends with a SKIP_ARG for which there was
815      pattern that ended with a SKIP for which there was not a matching MARK. */      not a matching mark, we have to re-run the match, ignoring the SKIP_ARG
816        that failed and any that precede it (either they also failed, or were not
817        triggered). To do this, we maintain a count of executed SKIP_ARGs. If a
818        SKIP_ARG gets to top level, the match is re-run with md->ignore_skip_arg
819        set to the count of the one that failed. */
820    
821      case OP_SKIP_ARG:      case OP_SKIP_ARG:
822      if (md->ignore_skip_arg)      md->skip_arg_count++;
823        if (md->skip_arg_count <= md->ignore_skip_arg)
824        {        {
825        ecode += PRIV(OP_lengths)[*ecode] + ecode[1];        ecode += PRIV(OP_lengths)[*ecode] + ecode[1];
826        break;        break;
827        }        }
828      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,      RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,
829        eptrb, RM57);        eptrb, RM57);
830      if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN)      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       RRETURN(rrc);  
831    
832      /* Pass back the current skip name by overloading md->start_match_ptr and      /* Pass back the current skip name by overloading md->start_match_ptr and
833      returning the special MATCH_SKIP_ARG return code. This will either be      returning the special MATCH_SKIP_ARG return code. This will either be
834      caught by a matching MARK, or get to the top, where it causes a rematch      caught by a matching MARK, or get to the top, where it causes a rematch
835      with the md->ignore_skip_arg flag set. */      with md->ignore_skip_arg set to the value of md->skip_arg_count. */
836    
837      md->start_match_ptr = ecode + 2;      md->start_match_ptr = ecode + 2;
838      RRETURN(MATCH_SKIP_ARG);      RRETURN(MATCH_SKIP_ARG);
# Line 1310  for (;;) Line 1308  for (;;)
1308          cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE);          cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE);
1309          cb.capture_top      = offset_top/2;          cb.capture_top      = offset_top/2;
1310          cb.capture_last     = md->capture_last & CAPLMASK;          cb.capture_last     = md->capture_last & CAPLMASK;
1311          /* Internal change requires this for API compatibility. */          /* Internal change requires this for API compatibility. */
1312          if (cb.capture_last == 0) cb.capture_last = -1;          if (cb.capture_last == 0) cb.capture_last = -1;
1313          cb.callout_data     = md->callout_data;          cb.callout_data     = md->callout_data;
1314          cb.mark             = md->nomatch_mark;          cb.mark             = md->nomatch_mark;
1315          if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);          if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);
1316          if (rrc < 0) RRETURN(rrc);          if (rrc < 0) RRETURN(rrc);
1317          }          }
1318        ecode += PRIV(OP_lengths)[OP_CALLOUT];        ecode += PRIV(OP_lengths)[OP_CALLOUT];
1319          codelink -= PRIV(OP_lengths)[OP_CALLOUT];
1320        }        }
1321    
1322      condcode = ecode[LINK_SIZE+1];      condcode = ecode[LINK_SIZE+1];
# Line 1604  for (;;) Line 1603  for (;;)
1603        }        }
1604      else condassert = FALSE;      else condassert = FALSE;
1605    
1606        /* Loop for each branch */
1607    
1608      do      do
1609        {        {
1610        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4);        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4);
1611    
1612          /* A match means that the assertion is true; break out of the loop
1613          that matches its alternatives. */
1614    
1615        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)
1616          {          {
1617          mstart = md->start_match_ptr;   /* In case \K reset it */          mstart = md->start_match_ptr;   /* In case \K reset it */
1618          break;          break;
1619          }          }
1620    
1621          /* If not matched, restore the previous mark setting. */
1622    
1623        md->mark = save_mark;        md->mark = save_mark;
1624    
1625        /* A COMMIT failure must fail the entire assertion, without trying any        /* See comment in the code for capturing groups above about handling
1626        subsequent branches. */        THEN. */
1627    
1628        if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_THEN)
1629            {
1630            next = ecode + GET(ecode,1);
1631            if (md->start_match_ptr < next &&
1632                (*ecode == OP_ALT || *next == OP_ALT))
1633              rrc = MATCH_NOMATCH;
1634            }
1635    
1636        /* PCRE does not allow THEN to escape beyond an assertion; it        /* Anything other than NOMATCH causes the entire assertion to fail,
1637        is treated as NOMATCH. */        passing back the return code. This includes COMMIT, SKIP, PRUNE and an
1638          uncaptured THEN, which means they take their normal effect. This
1639          consistent approach does not always have exactly the same effect as in
1640          Perl. */
1641    
1642        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
1643        ecode += GET(ecode, 1);        ecode += GET(ecode, 1);
1644        }        }
1645      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);   /* Continue for next alternative */
1646    
1647        /* If we have tried all the alternative branches, the assertion has
1648        failed. If not, we broke out after a match. */
1649    
1650      if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);      if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);
1651    
# Line 1633  for (;;) Line 1653  for (;;)
1653    
1654      if (condassert) RRETURN(MATCH_MATCH);      if (condassert) RRETURN(MATCH_MATCH);
1655    
1656      /* Continue from after the assertion, updating the offsets high water      /* Continue from after a successful assertion, updating the offsets high
1657      mark, since extracts may have been taken during the assertion. */      water mark, since extracts may have been taken during the assertion. */
1658    
1659      do ecode += GET(ecode,1); while (*ecode == OP_ALT);      do ecode += GET(ecode,1); while (*ecode == OP_ALT);
1660      ecode += 1 + LINK_SIZE;      ecode += 1 + LINK_SIZE;
1661      offset_top = md->end_offset_top;      offset_top = md->end_offset_top;
1662      continue;      continue;
1663    
1664      /* Negative assertion: all branches must fail to match. Encountering SKIP,      /* Negative assertion: all branches must fail to match for the assertion to
1665      PRUNE, or COMMIT means we must assume failure without checking subsequent      succeed. */
     branches. */  
1666    
1667      case OP_ASSERT_NOT:      case OP_ASSERT_NOT:
1668      case OP_ASSERTBACK_NOT:      case OP_ASSERTBACK_NOT:
# Line 1655  for (;;) Line 1674  for (;;)
1674        }        }
1675      else condassert = FALSE;      else condassert = FALSE;
1676    
1677        /* Loop for each alternative branch. */
1678    
1679      do      do
1680        {        {
1681        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);
1682        md->mark = save_mark;        md->mark = save_mark;   /* Always restore the mark setting */
1683        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH);  
1684        if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)        switch(rrc)
1685          {          {
1686          do ecode += GET(ecode,1); while (*ecode == OP_ALT);          case MATCH_MATCH:            /* A successful match means */
1687            case MATCH_ACCEPT:           /* the assertion has failed. */
1688            RRETURN(MATCH_NOMATCH);
1689    
1690            case MATCH_NOMATCH:          /* Carry on with next branch */
1691          break;          break;
1692    
1693            /* See comment in the code for capturing groups above about handling
1694            THEN. */
1695    
1696            case MATCH_THEN:
1697            next = ecode + GET(ecode,1);
1698            if (md->start_match_ptr < next &&
1699                (*ecode == OP_ALT || *next == OP_ALT))
1700              {
1701              rrc = MATCH_NOMATCH;
1702              break;
1703              }
1704            /* Otherwise fall through. */
1705    
1706            /* COMMIT, SKIP, PRUNE, and an uncaptured THEN cause the whole
1707            assertion to fail to match, without considering any more alternatives.
1708            Failing to match means the assertion is true. This is a consistent
1709            approach, but does not always have the same effect as in Perl. */
1710    
1711            case MATCH_COMMIT:
1712            case MATCH_SKIP:
1713            case MATCH_SKIP_ARG:
1714            case MATCH_PRUNE:
1715            do ecode += GET(ecode,1); while (*ecode == OP_ALT);
1716            goto NEG_ASSERT_TRUE;   /* Break out of alternation loop */
1717    
1718            /* Anything else is an error */
1719    
1720            default:
1721            RRETURN(rrc);
1722          }          }
1723    
1724        /* PCRE does not allow THEN to escape beyond an assertion; it is treated        /* Continue with next branch */
       as NOMATCH. */  
1725    
       if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);  
1726        ecode += GET(ecode,1);        ecode += GET(ecode,1);
1727        }        }
1728      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);
1729    
1730      if (condassert) RRETURN(MATCH_MATCH);  /* Condition assertion */      /* All branches in the assertion failed to match. */
1731    
1732      ecode += 1 + LINK_SIZE;      NEG_ASSERT_TRUE:
1733        if (condassert) RRETURN(MATCH_MATCH);  /* Condition assertion */
1734        ecode += 1 + LINK_SIZE;                /* Continue with current branch */
1735      continue;      continue;
1736    
1737      /* Move the subject pointer back. This occurs only at the start of      /* Move the subject pointer back. This occurs only at the start of
# Line 1737  for (;;) Line 1792  for (;;)
1792        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);        cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
1793        cb.capture_top      = offset_top/2;        cb.capture_top      = offset_top/2;
1794        cb.capture_last     = md->capture_last & CAPLMASK;        cb.capture_last     = md->capture_last & CAPLMASK;
1795        /* Internal change requires this for API compatibility. */        /* Internal change requires this for API compatibility. */
1796        if (cb.capture_last == 0) cb.capture_last = -1;        if (cb.capture_last == 0) cb.capture_last = -1;
1797        cb.callout_data     = md->callout_data;        cb.callout_data     = md->callout_data;
1798        cb.mark             = md->nomatch_mark;        cb.mark             = md->nomatch_mark;
1799        if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);        if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH);
# Line 1784  for (;;) Line 1839  for (;;)
1839        /* Add to "recursing stack" */        /* Add to "recursing stack" */
1840    
1841        new_recursive.group_num = recno;        new_recursive.group_num = recno;
1842        new_recursive.saved_capture_last = md->capture_last;        new_recursive.saved_capture_last = md->capture_last;
1843        new_recursive.subject_position = eptr;        new_recursive.subject_position = eptr;
1844        new_recursive.prevrec = md->recursive;        new_recursive.prevrec = md->recursive;
1845        md->recursive = &new_recursive;        md->recursive = &new_recursive;
# Line 1821  for (;;) Line 1876  for (;;)
1876            md, eptrb, RM6);            md, eptrb, RM6);
1877          memcpy(md->offset_vector, new_recursive.offset_save,          memcpy(md->offset_vector, new_recursive.offset_save,
1878              new_recursive.saved_max * sizeof(int));              new_recursive.saved_max * sizeof(int));
1879          md->capture_last = new_recursive.saved_capture_last;          md->capture_last = new_recursive.saved_capture_last;
1880          md->recursive = new_recursive.prevrec;          md->recursive = new_recursive.prevrec;
1881          if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)          if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)
1882            {            {
# Line 1838  for (;;) Line 1893  for (;;)
1893            goto RECURSION_MATCHED;        /* Exit loop; end processing */            goto RECURSION_MATCHED;        /* Exit loop; end processing */
1894            }            }
1895    
1896          /* PCRE does not allow THEN or COMMIT to escape beyond a recursion; it          /* PCRE does not allow THEN, SKIP, PRUNE or COMMIT to escape beyond a
1897          is treated as NOMATCH. */          recursion; they cause a NOMATCH for the entire recursion. These codes
1898            are defined in a range that can be tested for. */
1899    
1900            if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)
1901              RRETURN(MATCH_NOMATCH);
1902    
1903            /* Any return code other than NOMATCH is an error. */
1904    
1905          else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN &&          if (rrc != MATCH_NOMATCH)
                  rrc != MATCH_COMMIT)  
1906            {            {
1907            DPRINTF(("Recursion gave error %d\n", rrc));            DPRINTF(("Recursion gave error %d\n", rrc));
1908            if (new_recursive.offset_save != stacksave)            if (new_recursive.offset_save != stacksave)
# Line 2629  for (;;) Line 2689  for (;;)
2689            }            }
2690          break;          break;
2691    
2692            case PT_UCNC:
2693            if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
2694                 c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
2695                 c >= 0xe000) == (op == OP_NOTPROP))
2696              RRETURN(MATCH_NOMATCH);
2697            break;
2698    
2699          /* This should never occur */          /* This should never occur */
2700    
2701          default:          default:
# Line 3215  for (;;) Line 3282  for (;;)
3282    
3283        if (fc < 128)        if (fc < 128)
3284          {          {
3285          pcre_uchar cc = RAWUCHAR(eptr);          pcre_uint32 cc = RAWUCHAR(eptr);
3286          if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH);          if (md->lcc[fc] != TABLE_GET(cc, md->lcc, cc)) RRETURN(MATCH_NOMATCH);
3287          ecode++;          ecode++;
3288          eptr++;          eptr++;
# Line 3320  for (;;) Line 3387  for (;;)
3387      max = rep_max[c];                 /* zero for max => infinity */      max = rep_max[c];                 /* zero for max => infinity */
3388      if (max == 0) max = INT_MAX;      if (max == 0) max = INT_MAX;
3389    
3390      /* Common code for all repeated single-character matches. */      /* Common code for all repeated single-character matches. We first check
3391        for the minimum number of characters. If the minimum equals the maximum, we
3392        are done. Otherwise, if minimizing, check the rest of the pattern for a
3393        match; if there isn't one, advance up to the maximum, one character at a
3394        time.
3395    
3396        If maximizing, advance up to the maximum number of matching characters,
3397        until eptr is past the end of the maximum run. If possessive, we are
3398        then done (no backing up). Otherwise, match at this position; anything
3399        other than no match is immediately returned. For nomatch, back up one
3400        character, unless we are matching \R and the last thing matched was
3401        \r\n, in which case, back up two bytes. When we reach the first optional
3402        character position, we can save stack by doing a tail recurse.
3403    
3404        The various UTF/non-UTF and caseful/caseless cases are handled separately,
3405        for speed. */
3406    
3407      REPEATCHAR:      REPEATCHAR:
3408  #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
# Line 3404  for (;;) Line 3486  for (;;)
3486                }                }
3487              }              }
3488    
3489            if (possessive) continue;            if (possessive) continue;    /* No backtracking */
   
3490            for(;;)            for(;;)
3491              {              {
3492                if (eptr == pp) goto TAIL_RECURSE;
3493              RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);              RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);
3494              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
             if (eptr == pp) { RRETURN(MATCH_NOMATCH); }  
3495  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
3496              eptr--;              eptr--;
3497              BACKCHAR(eptr);              BACKCHAR(eptr);
# Line 3509  for (;;) Line 3590  for (;;)
3590            if (fc != cc && foc != cc) break;            if (fc != cc && foc != cc) break;
3591            eptr++;            eptr++;
3592            }            }
3593            if (possessive) continue;       /* No backtracking */
3594          if (possessive) continue;          for (;;)
   
         while (eptr >= pp)  
3595            {            {
3596              if (eptr == pp) goto TAIL_RECURSE;
3597            RMATCH(eptr, ecode, offset_top, md, eptrb, RM25);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM25);
3598            eptr--;            eptr--;
3599            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3600            }            }
3601          RRETURN(MATCH_NOMATCH);          /* Control never gets here */
3602          }          }
       /* Control never gets here */  
3603        }        }
3604    
3605      /* Caseful comparisons (includes all multi-byte characters) */      /* Caseful comparisons (includes all multi-byte characters) */
# Line 3568  for (;;) Line 3647  for (;;)
3647            if (fc != RAWUCHARTEST(eptr)) break;            if (fc != RAWUCHARTEST(eptr)) break;
3648            eptr++;            eptr++;
3649            }            }
3650          if (possessive) continue;          if (possessive) continue;    /* No backtracking */
3651            for (;;)
         while (eptr >= pp)  
3652            {            {
3653              if (eptr == pp) goto TAIL_RECURSE;
3654            RMATCH(eptr, ecode, offset_top, md, eptrb, RM27);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM27);
3655            eptr--;            eptr--;
3656            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3657            }            }
3658          RRETURN(MATCH_NOMATCH);          /* Control never gets here */
3659          }          }
3660        }        }
3661      /* Control never gets here */      /* Control never gets here */
# Line 3748  for (;;) Line 3827  for (;;)
3827            }            }
3828          }          }
3829        else        else
3830  #endif  #endif  /* SUPPORT_UTF */
3831        /* Not UTF mode */        /* Not UTF mode */
3832          {          {
3833          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
# Line 3786  for (;;) Line 3865  for (;;)
3865              }              }
3866            }            }
3867          else          else
3868  #endif  #endif  /*SUPPORT_UTF */
3869          /* Not UTF mode */          /* Not UTF mode */
3870            {            {
3871            for (fi = min;; fi++)            for (fi = min;; fi++)
# Line 3828  for (;;) Line 3907  for (;;)
3907              if (fc == d || (unsigned int)foc == d) break;              if (fc == d || (unsigned int)foc == d) break;
3908              eptr += len;              eptr += len;
3909              }              }
3910            if (possessive) continue;            if (possessive) continue;    /* No backtracking */
3911            for(;;)            for(;;)
3912              {              {
3913                if (eptr == pp) goto TAIL_RECURSE;
3914              RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);              RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);
3915              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3916              if (eptr-- == pp) break;        /* Stop if tried at original pos */              eptr--;
3917              BACKCHAR(eptr);              BACKCHAR(eptr);
3918              }              }
3919            }            }
3920          else          else
3921  #endif  #endif  /* SUPPORT_UTF */
3922          /* Not UTF mode */          /* Not UTF mode */
3923            {            {
3924            for (i = min; i < max; i++)            for (i = min; i < max; i++)
# Line 3851  for (;;) Line 3931  for (;;)
3931              if (fc == *eptr || foc == *eptr) break;              if (fc == *eptr || foc == *eptr) break;
3932              eptr++;              eptr++;
3933              }              }
3934            if (possessive) continue;            if (possessive) continue;    /* No backtracking */
3935            while (eptr >= pp)            for (;;)
3936              {              {
3937                if (eptr == pp) goto TAIL_RECURSE;
3938              RMATCH(eptr, ecode, offset_top, md, eptrb, RM31);              RMATCH(eptr, ecode, offset_top, md, eptrb, RM31);
3939              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3940              eptr--;              eptr--;
3941              }              }
3942            }            }
3943            /* Control never gets here */
         RRETURN(MATCH_NOMATCH);  
3944          }          }
       /* Control never gets here */  
3945        }        }
3946    
3947      /* Caseful comparisons */      /* Caseful comparisons */
# Line 3963  for (;;) Line 4042  for (;;)
4042              if (fc == d) break;              if (fc == d) break;
4043              eptr += len;              eptr += len;
4044              }              }
4045            if (possessive) continue;            if (possessive) continue;    /* No backtracking */
4046            for(;;)            for(;;)
4047              {              {
4048                if (eptr == pp) goto TAIL_RECURSE;
4049              RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);              RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);
4050              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4051              if (eptr-- == pp) break;        /* Stop if tried at original pos */              eptr--;
4052              BACKCHAR(eptr);              BACKCHAR(eptr);
4053              }              }
4054            }            }
# Line 3986  for (;;) Line 4066  for (;;)
4066              if (fc == *eptr) break;              if (fc == *eptr) break;
4067              eptr++;              eptr++;
4068              }              }
4069            if (possessive) continue;            if (possessive) continue;    /* No backtracking */
4070            while (eptr >= pp)            for (;;)
4071              {              {
4072                if (eptr == pp) goto TAIL_RECURSE;
4073              RMATCH(eptr, ecode, offset_top, md, eptrb, RM35);              RMATCH(eptr, ecode, offset_top, md, eptrb, RM35);
4074              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
4075              eptr--;              eptr--;
4076              }              }
4077            }            }
4078            /* Control never gets here */
         RRETURN(MATCH_NOMATCH);  
4079          }          }
4080        }        }
4081      /* Control never gets here */      /* Control never gets here */
# Line 4247  for (;;) Line 4327  for (;;)
4327              }              }
4328            break;            break;
4329    
4330              case PT_UCNC:
4331              for (i = 1; i <= min; i++)
4332                {
4333                if (eptr >= md->end_subject)
4334                  {
4335                  SCHECK_PARTIAL();
4336                  RRETURN(MATCH_NOMATCH);
4337                  }
4338                GETCHARINCTEST(c, eptr);
4339                if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
4340                     c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
4341                     c >= 0xe000) == prop_fail_result)
4342                  RRETURN(MATCH_NOMATCH);
4343                }
4344              break;
4345    
4346            /* This should not occur */            /* This should not occur */
4347    
4348            default:            default:
# Line 4452  for (;;) Line 4548  for (;;)
4548          case OP_DIGIT:          case OP_DIGIT:
4549          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
4550            {            {
4551            pcre_uchar cc;            pcre_uint32 cc;
   
4552            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4553              {              {
4554              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4470  for (;;) Line 4565  for (;;)
4565          case OP_NOT_WHITESPACE:          case OP_NOT_WHITESPACE:
4566          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
4567            {            {
4568            pcre_uchar cc;            pcre_uint32 cc;
   
4569            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4570              {              {
4571              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4488  for (;;) Line 4582  for (;;)
4582          case OP_WHITESPACE:          case OP_WHITESPACE:
4583          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
4584            {            {
4585            pcre_uchar cc;            pcre_uint32 cc;
   
4586            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4587              {              {
4588              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4506  for (;;) Line 4599  for (;;)
4599          case OP_NOT_WORDCHAR:          case OP_NOT_WORDCHAR:
4600          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
4601            {            {
4602            pcre_uchar cc;            pcre_uint32 cc;
   
4603            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4604              {              {
4605              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4524  for (;;) Line 4616  for (;;)
4616          case OP_WORDCHAR:          case OP_WORDCHAR:
4617          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
4618            {            {
4619            pcre_uchar cc;            pcre_uint32 cc;
   
4620            if (eptr >= md->end_subject)            if (eptr >= md->end_subject)
4621              {              {
4622              SCHECK_PARTIAL();              SCHECK_PARTIAL();
# Line 4998  for (;;) Line 5089  for (;;)
5089              }              }
5090            /* Control never gets here */            /* Control never gets here */
5091    
5092              case PT_UCNC:
5093              for (fi = min;; fi++)
5094                {
5095                RMATCH(eptr, ecode, offset_top, md, eptrb, RM68);
5096                if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5097                if (fi >= max) RRETURN(MATCH_NOMATCH);
5098                if (eptr >= md->end_subject)
5099                  {
5100                  SCHECK_PARTIAL();
5101                  RRETURN(MATCH_NOMATCH);
5102                  }
5103                GETCHARINCTEST(c, eptr);
5104                if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
5105                     c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
5106                     c >= 0xe000) == prop_fail_result)
5107                  RRETURN(MATCH_NOMATCH);
5108                }
5109              /* Control never gets here */
5110    
5111            /* This should never occur */            /* This should never occur */
5112            default:            default:
5113            RRETURN(PCRE_ERROR_INTERNAL);            RRETURN(PCRE_ERROR_INTERNAL);
# Line 5492  for (;;) Line 5602  for (;;)
5602            GOT_MAX:            GOT_MAX:
5603            break;            break;
5604    
5605              case PT_UCNC:
5606              for (i = min; i < max; i++)
5607                {
5608                int len = 1;
5609                if (eptr >= md->end_subject)
5610                  {
5611                  SCHECK_PARTIAL();
5612                  break;
5613                  }
5614                GETCHARLENTEST(c, eptr, len);
5615                if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT ||
5616                     c == CHAR_GRAVE_ACCENT || (c >= 0xa0 && c <= 0xd7ff) ||
5617                     c >= 0xe000) == prop_fail_result)
5618                  break;
5619                eptr += len;
5620                }
5621              break;
5622    
5623            default:            default:
5624            RRETURN(PCRE_ERROR_INTERNAL);            RRETURN(PCRE_ERROR_INTERNAL);
5625            }            }
5626    
5627          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
5628    
5629          if (possessive) continue;          if (possessive) continue;    /* No backtracking */
5630          for(;;)          for(;;)
5631            {            {
5632              if (eptr == pp) goto TAIL_RECURSE;
5633            RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);
5634            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5635            if (eptr-- == pp) break;        /* Stop if tried at original pos */            eptr--;
5636            if (utf) BACKCHAR(eptr);            if (utf) BACKCHAR(eptr);
5637            }            }
5638          }          }
# Line 5540  for (;;) Line 5669  for (;;)
5669    
5670          /* eptr is now past the end of the maximum run */          /* eptr is now past the end of the maximum run */
5671    
5672          if (possessive) continue;          if (possessive) continue;    /* No backtracking */
   
5673          for(;;)          for(;;)
5674            {            {
5675              if (eptr == pp) goto TAIL_RECURSE;
5676            RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);
5677            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5678            if (eptr-- == pp) break;        /* Stop if tried at original pos */            eptr--;
5679            for (;;)                        /* Move back over one extended */            for (;;)                        /* Move back over one extended */
5680              {              {
5681              if (!utf) c = *eptr; else              if (!utf) c = *eptr; else
# Line 5821  for (;;) Line 5950  for (;;)
5950            RRETURN(PCRE_ERROR_INTERNAL);            RRETURN(PCRE_ERROR_INTERNAL);
5951            }            }
5952    
5953          /* eptr is now past the end of the maximum run. If possessive, we are          if (possessive) continue;    /* No backtracking */
         done (no backing up). Otherwise, match at this position; anything other  
         than no match is immediately returned. For nomatch, back up one  
         character, unless we are matching \R and the last thing matched was  
         \r\n, in which case, back up two bytes. */  
   
         if (possessive) continue;  
5954          for(;;)          for(;;)
5955            {            {
5956              if (eptr == pp) goto TAIL_RECURSE;
5957            RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);
5958            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
5959            if (eptr-- == pp) break;        /* Stop if tried at original pos */            eptr--;
5960            BACKCHAR(eptr);            BACKCHAR(eptr);
5961            if (ctype == OP_ANYNL && eptr > pp  && RAWUCHAR(eptr) == CHAR_NL &&            if (ctype == OP_ANYNL && eptr > pp  && RAWUCHAR(eptr) == CHAR_NL &&
5962                RAWUCHAR(eptr - 1) == CHAR_CR) eptr--;                RAWUCHAR(eptr - 1) == CHAR_CR) eptr--;
# Line 6070  for (;;) Line 6194  for (;;)
6194            RRETURN(PCRE_ERROR_INTERNAL);            RRETURN(PCRE_ERROR_INTERNAL);
6195            }            }
6196    
6197          /* eptr is now past the end of the maximum run. If possessive, we are          if (possessive) continue;    /* No backtracking */
6198          done (no backing up). Otherwise, match at this position; anything other          for (;;)
         than no match is immediately returned. For nomatch, back up one  
         character (byte), unless we are matching \R and the last thing matched  
         was \r\n, in which case, back up two bytes. */  
   
         if (possessive) continue;  
         while (eptr >= pp)  
6199            {            {
6200              if (eptr == pp) goto TAIL_RECURSE;
6201            RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);            RMATCH(eptr, ecode, offset_top, md, eptrb, RM47);
6202            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
6203            eptr--;            eptr--;
# Line 6086  for (;;) Line 6205  for (;;)
6205                eptr[-1] == CHAR_CR) eptr--;                eptr[-1] == CHAR_CR) eptr--;
6206            }            }
6207          }          }
6208    
6209        /* Get here if we can't make it match with any permitted repetitions */        /* Control never gets here */
   
       RRETURN(MATCH_NOMATCH);  
6210        }        }
     /* Control never gets here */  
6211    
6212      /* There's been some horrible disaster. Arrival here can only mean there is      /* There's been some horrible disaster. Arrival here can only mean there is
6213      something seriously wrong in the code above or the OP_xxx definitions. */      something seriously wrong in the code above or the OP_xxx definitions. */
# Line 6133  switch (frame->Xwhere) Line 6249  switch (frame->Xwhere)
6249    LBL(32) LBL(34) LBL(42) LBL(46)    LBL(32) LBL(34) LBL(42) LBL(46)
6250  #ifdef SUPPORT_UCP  #ifdef SUPPORT_UCP
6251    LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)    LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(44) LBL(45)
6252    LBL(59) LBL(60) LBL(61) LBL(62) LBL(67)    LBL(59) LBL(60) LBL(61) LBL(62) LBL(67) LBL(68)
6253  #endif  /* SUPPORT_UCP */  #endif  /* SUPPORT_UCP */
6254  #endif  /* SUPPORT_UTF */  #endif  /* SUPPORT_UTF */
6255    default:    default:
# Line 6286  const pcre_uint8 *start_bits = NULL; Line 6402  const pcre_uint8 *start_bits = NULL;
6402  PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset;  PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset;
6403  PCRE_PUCHAR end_subject;  PCRE_PUCHAR end_subject;
6404  PCRE_PUCHAR start_partial = NULL;  PCRE_PUCHAR start_partial = NULL;
6405  PCRE_PUCHAR match_partial;  PCRE_PUCHAR match_partial = NULL;
6406  PCRE_PUCHAR req_char_ptr = start_match - 1;  PCRE_PUCHAR req_char_ptr = start_match - 1;
6407    
6408  const pcre_study_data *study;  const pcre_study_data *study;
# Line 6416  md->callout_data = NULL; Line 6532  md->callout_data = NULL;
6532    
6533  tables = re->tables;  tables = re->tables;
6534    
6535    /* The two limit values override the defaults, whatever their value. */
6536    
6537  if (extra_data != NULL)  if (extra_data != NULL)
6538    {    {
6539    register unsigned int flags = extra_data->flags;    register unsigned int flags = extra_data->flags;
# Line 6430  if (extra_data != NULL) Line 6548  if (extra_data != NULL)
6548    if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;    if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;
6549    }    }
6550    
6551    /* Limits in the regex override only if they are smaller. */
6552    
6553    if ((re->flags & PCRE_MLSET) != 0 && re->limit_match < md->match_limit)
6554      md->match_limit = re->limit_match;
6555    
6556    if ((re->flags & PCRE_RLSET) != 0 &&
6557        re->limit_recursion < md->match_limit_recursion)
6558      md->match_limit_recursion = re->limit_recursion;
6559    
6560  /* If the exec call supplied NULL for tables, use the inbuilt ones. This  /* If the exec call supplied NULL for tables, use the inbuilt ones. This
6561  is a feature that makes it possible to save compiled regex and re-use them  is a feature that makes it possible to save compiled regex and re-use them
6562  in other programs later. */  in other programs later. */
# Line 6455  end_subject = md->end_subject; Line 6582  end_subject = md->end_subject;
6582  md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;  md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
6583  md->use_ucp = (re->options & PCRE_UCP) != 0;  md->use_ucp = (re->options & PCRE_UCP) != 0;
6584  md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;  md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;
6585  md->ignore_skip_arg = FALSE;  md->ignore_skip_arg = 0;
6586    
6587  /* Some options are unpacked into BOOL variables in the hope that testing  /* Some options are unpacked into BOOL variables in the hope that testing
6588  them will be faster than individual option bits. */  them will be faster than individual option bits. */
# Line 6837  for(;;) Line 6964  for(;;)
6964    md->match_call_count = 0;    md->match_call_count = 0;
6965    md->match_function_type = 0;    md->match_function_type = 0;
6966    md->end_offset_top = 0;    md->end_offset_top = 0;
6967      md->skip_arg_count = 0;
6968    rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0);    rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0);
6969    if (md->hitend && start_partial == NULL)    if (md->hitend && start_partial == NULL)
6970      {      {
6971      start_partial = md->start_used_ptr;      start_partial = md->start_used_ptr;
6972      match_partial = start_match;      match_partial = start_match;
6973      }      }
6974    
6975    switch(rc)    switch(rc)
6976      {      {
# Line 6855  for(;;) Line 6983  for(;;)
6983    
6984      case MATCH_SKIP_ARG:      case MATCH_SKIP_ARG:
6985      new_start_match = start_match;      new_start_match = start_match;
6986      md->ignore_skip_arg = TRUE;      md->ignore_skip_arg = md->skip_arg_count;
6987      break;      break;
6988    
6989      /* SKIP passes back the next starting point explicitly, but if it is the      /* SKIP passes back the next starting point explicitly, but if it is no
6990      same as the match we have just done, treat it as NOMATCH. */      greater than the match we have just done, treat it as NOMATCH. */
6991    
6992      case MATCH_SKIP:      case MATCH_SKIP:
6993      if (md->start_match_ptr != start_match)      if (md->start_match_ptr > start_match)
6994        {        {
6995        new_start_match = md->start_match_ptr;        new_start_match = md->start_match_ptr;
6996        break;        break;
# Line 6870  for(;;) Line 6998  for(;;)
6998      /* Fall through */      /* Fall through */
6999    
7000      /* NOMATCH and PRUNE advance by one character. THEN at this level acts      /* NOMATCH and PRUNE advance by one character. THEN at this level acts
7001      exactly like PRUNE. Unset the ignore SKIP-with-argument flag. */      exactly like PRUNE. Unset ignore SKIP-with-argument. */
7002    
7003      case MATCH_NOMATCH:      case MATCH_NOMATCH:
7004      case MATCH_PRUNE:      case MATCH_PRUNE:
7005      case MATCH_THEN:      case MATCH_THEN:
7006      md->ignore_skip_arg = FALSE;      md->ignore_skip_arg = 0;
7007      new_start_match = start_match + 1;      new_start_match = start_match + 1;
7008  #ifdef SUPPORT_UTF  #ifdef SUPPORT_UTF
7009      if (utf)      if (utf)
# Line 6976  if (rc == MATCH_MATCH || rc == MATCH_ACC Line 7104  if (rc == MATCH_MATCH || rc == MATCH_ACC
7104    /* Set the return code to the number of captured strings, or 0 if there were    /* Set the return code to the number of captured strings, or 0 if there were
7105    too many to fit into the vector. */    too many to fit into the vector. */
7106    
7107    rc = ((md->capture_last & OVFLBIT) != 0 &&    rc = ((md->capture_last & OVFLBIT) != 0 &&
7108           md->end_offset_top >= arg_offset_max)?           md->end_offset_top >= arg_offset_max)?
7109      0 : md->end_offset_top/2;      0 : md->end_offset_top/2;
7110    
# Line 7042  if (rc != MATCH_NOMATCH && rc != PCRE_ER Line 7170  if (rc != MATCH_NOMATCH && rc != PCRE_ER
7170    
7171  /* Handle partial matches - disable any mark data */  /* Handle partial matches - disable any mark data */
7172    
7173  if (start_partial != NULL)  if (match_partial != NULL)
7174    {    {
7175    DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));    DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
7176    md->mark = NULL;    md->mark = NULL;
# Line 7050  if (start_partial != NULL) Line 7178  if (start_partial != NULL)
7178      {      {
7179      offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject);      offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject);
7180      offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);      offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject);
7181      if (offsetcount > 2)      if (offsetcount > 2)
7182        offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject);        offsets[2] = (int)(match_partial - (PCRE_PUCHAR)subject);
7183      }      }
7184    rc = PCRE_ERROR_PARTIAL;    rc = PCRE_ERROR_PARTIAL;

Legend:
Removed from v.1251  
changed lines
  Added in v.1346

  ViewVC Help
Powered by ViewVC 1.1.5