/[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 1284 by ph10, Fri Mar 15 11:54:58 2013 UTC revision 1296 by ph10, Tue Mar 19 16:29:12 2013 UTC
# Line 1603  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);
# Line 1613  for (;;) Line 1615  for (;;)
1615          }          }
1616        md->mark = save_mark;        md->mark = save_mark;
1617    
1618        /* A COMMIT failure must fail the entire assertion, without trying any        /* See comment in the code for capturing groups above about handling
1619        subsequent branches. */        THEN. */
1620    
1621        if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_THEN)
1622            {
1623        /* PCRE does not allow THEN to escape beyond an assertion; it          next = ecode + GET(ecode,1);
1624        is treated as NOMATCH. */          if (md->start_match_ptr < next &&
1625                (*ecode == OP_ALT || *next == OP_ALT))
1626              rrc = MATCH_NOMATCH;
1627            }
1628    
1629          /* Anything other than NOMATCH causes the assertion to fail. This
1630          includes COMMIT, SKIP, and PRUNE. However, this consistent approach does
1631          not always have exactly the same effect as in Perl. */
1632    
1633        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
1634        ecode += GET(ecode, 1);        ecode += GET(ecode, 1);
1635        }        }
1636      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);
1637    
1638        /* If we have tried all the alternative branches, the assertion has
1639        failed. */
1640    
1641      if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);      if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);
1642    
# Line 1632  for (;;) Line 1644  for (;;)
1644    
1645      if (condassert) RRETURN(MATCH_MATCH);      if (condassert) RRETURN(MATCH_MATCH);
1646    
1647      /* Continue from after the assertion, updating the offsets high water      /* Continue from after a successful assertion, updating the offsets high
1648      mark, since extracts may have been taken during the assertion. */      water mark, since extracts may have been taken during the assertion. */
1649    
1650      do ecode += GET(ecode,1); while (*ecode == OP_ALT);      do ecode += GET(ecode,1); while (*ecode == OP_ALT);
1651      ecode += 1 + LINK_SIZE;      ecode += 1 + LINK_SIZE;
1652      offset_top = md->end_offset_top;      offset_top = md->end_offset_top;
1653      continue;      continue;
1654    
1655      /* Negative assertion: all branches must fail to match. Encountering SKIP,      /* Negative assertion: all branches must fail to match for the assertion to
1656      PRUNE, or COMMIT means we must assume failure without checking subsequent      succeed. */
     branches. */  
1657    
1658      case OP_ASSERT_NOT:      case OP_ASSERT_NOT:
1659      case OP_ASSERTBACK_NOT:      case OP_ASSERTBACK_NOT:
# Line 1654  for (;;) Line 1665  for (;;)
1665        }        }
1666      else condassert = FALSE;      else condassert = FALSE;
1667    
1668        /* Loop for each alternative branch. */
1669    
1670      do      do
1671        {        {
1672        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);
1673        md->mark = save_mark;        md->mark = save_mark;
1674    
1675          /* A successful match means the assertion has failed. */
1676    
1677        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH);
1678        if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)  
1679          /* See comment in the code for capturing groups above about handling
1680          THEN. */
1681    
1682          if (rrc == MATCH_THEN)
1683          {          {
1684          do ecode += GET(ecode,1); while (*ecode == OP_ALT);          next = ecode + GET(ecode,1);
1685          break;          if (md->start_match_ptr < next &&
1686                (*ecode == OP_ALT || *next == OP_ALT))
1687              rrc = MATCH_NOMATCH;
1688          }          }
1689    
1690          /* No match on a branch means we must carry on and try the next branch.
1691          Anything else, in particular, SKIP, PRUNE, etc. causes a failure in the
1692          enclosing branch. This is a consistent approach, but does not always have
1693          the same effect as in Perl. */
1694    
1695        /* PCRE does not allow THEN to escape beyond an assertion; it is treated        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
       as NOMATCH. */  
   
       if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);  
1696        ecode += GET(ecode,1);        ecode += GET(ecode,1);
1697        }        }
1698      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);
1699    
1700        /* All branches in the assertion failed to match. */
1701    
1702      if (condassert) RRETURN(MATCH_MATCH);  /* Condition assertion */      if (condassert) RRETURN(MATCH_MATCH);  /* Condition assertion */
1703        ecode += 1 + LINK_SIZE;                /* Continue with current branch */
     ecode += 1 + LINK_SIZE;  
1704      continue;      continue;
1705    
1706      /* Move the subject pointer back. This occurs only at the start of      /* Move the subject pointer back. This occurs only at the start of

Legend:
Removed from v.1284  
changed lines
  Added in v.1296

  ViewVC Help
Powered by ViewVC 1.1.5