/[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 625 by ph10, Wed Jul 20 16:46:19 2011 UTC revision 648 by ph10, Mon Aug 1 11:02:08 2011 UTC
# Line 1070  for (;;) Line 1070  for (;;)
1070        if (pcre_callout != NULL)        if (pcre_callout != NULL)
1071          {          {
1072          pcre_callout_block cb;          pcre_callout_block cb;
1073          cb.version          = 1;   /* Version 1 of the callout block */          cb.version          = 2;   /* Version 1 of the callout block */
1074          cb.callout_number   = ecode[LINK_SIZE+2];          cb.callout_number   = ecode[LINK_SIZE+2];
1075          cb.offset_vector    = md->offset_vector;          cb.offset_vector    = md->offset_vector;
1076          cb.subject          = (PCRE_SPTR)md->start_subject;          cb.subject          = (PCRE_SPTR)md->start_subject;
# Line 1082  for (;;) Line 1082  for (;;)
1082          cb.capture_top      = offset_top/2;          cb.capture_top      = offset_top/2;
1083          cb.capture_last     = md->capture_last;          cb.capture_last     = md->capture_last;
1084          cb.callout_data     = md->callout_data;          cb.callout_data     = md->callout_data;
1085            cb.mark             = markptr;
1086          if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH);          if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH);
1087          if (rrc < 0) RRETURN(rrc);          if (rrc < 0) RRETURN(rrc);
1088          }          }
# Line 1365  for (;;) Line 1366  for (;;)
1366        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT)
1367          {          {
1368          mstart = md->start_match_ptr;   /* In case \K reset it */          mstart = md->start_match_ptr;   /* In case \K reset it */
1369            markptr = md->mark;
1370          break;          break;
1371          }          }
1372        if (rrc != MATCH_NOMATCH &&        if (rrc != MATCH_NOMATCH &&
# Line 1463  for (;;) Line 1465  for (;;)
1465      if (pcre_callout != NULL)      if (pcre_callout != NULL)
1466        {        {
1467        pcre_callout_block cb;        pcre_callout_block cb;
1468        cb.version          = 1;   /* Version 1 of the callout block */        cb.version          = 2;   /* Version 1 of the callout block */
1469        cb.callout_number   = ecode[1];        cb.callout_number   = ecode[1];
1470        cb.offset_vector    = md->offset_vector;        cb.offset_vector    = md->offset_vector;
1471        cb.subject          = (PCRE_SPTR)md->start_subject;        cb.subject          = (PCRE_SPTR)md->start_subject;
# Line 1475  for (;;) Line 1477  for (;;)
1477        cb.capture_top      = offset_top/2;        cb.capture_top      = offset_top/2;
1478        cb.capture_last     = md->capture_last;        cb.capture_last     = md->capture_last;
1479        cb.callout_data     = md->callout_data;        cb.callout_data     = md->callout_data;
1480          cb.mark             = markptr;
1481        if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH);        if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH);
1482        if (rrc < 0) RRETURN(rrc);        if (rrc < 0) RRETURN(rrc);
1483        }        }
# Line 1500  for (;;) Line 1503  for (;;)
1503    
1504      case OP_RECURSE:      case OP_RECURSE:
1505        {        {
1506          recursion_info *ri;
1507          int recno;
1508    
1509        callpat = md->start_code + GET(ecode, 1);        callpat = md->start_code + GET(ecode, 1);
1510        new_recursive.group_num = (callpat == md->start_code)? 0 :        recno = (callpat == md->start_code)? 0 :
1511          GET2(callpat, 1 + LINK_SIZE);          GET2(callpat, 1 + LINK_SIZE);
1512    
1513          /* Check for repeating a recursion without advancing the subject pointer.
1514          This should catch convoluted mutual recursions. (Some simple cases are
1515          caught at compile time.) */
1516    
1517          for (ri = md->recursive; ri != NULL; ri = ri->prevrec)
1518            if (recno == ri->group_num && eptr == ri->subject_position)
1519              RRETURN(PCRE_ERROR_RECURSELOOP);
1520    
1521        /* Add to "recursing stack" */        /* Add to "recursing stack" */
1522    
1523          new_recursive.group_num = recno;
1524          new_recursive.subject_position = eptr;
1525        new_recursive.prevrec = md->recursive;        new_recursive.prevrec = md->recursive;
1526        md->recursive = &new_recursive;        md->recursive = &new_recursive;
1527    
# Line 1653  for (;;) Line 1669  for (;;)
1669        md->end_match_ptr = eptr;      /* For ONCE */        md->end_match_ptr = eptr;      /* For ONCE */
1670        md->end_offset_top = offset_top;        md->end_offset_top = offset_top;
1671        md->start_match_ptr = mstart;        md->start_match_ptr = mstart;
1672        MRRETURN(MATCH_MATCH);        MRRETURN(MATCH_MATCH);         /* Sets md->mark */
1673        }        }
1674    
1675      /* For capturing groups we have to check the group number back at the start      /* For capturing groups we have to check the group number back at the start
# Line 1998  for (;;) Line 2014  for (;;)
2014      /* Fall through */      /* Fall through */
2015    
2016      case OP_ALLANY:      case OP_ALLANY:
2017      if (eptr++ >= md->end_subject)      if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */
2018        {        {                            /* not be updated before SCHECK_PARTIAL. */
2019        SCHECK_PARTIAL();        SCHECK_PARTIAL();
2020        MRRETURN(MATCH_NOMATCH);        MRRETURN(MATCH_NOMATCH);
2021        }        }
2022        eptr++;
2023      if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;      if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
2024      ecode++;      ecode++;
2025      break;      break;
# Line 2011  for (;;) Line 2028  for (;;)
2028      any byte, even newline, independent of the setting of PCRE_DOTALL. */      any byte, even newline, independent of the setting of PCRE_DOTALL. */
2029    
2030      case OP_ANYBYTE:      case OP_ANYBYTE:
2031      if (eptr++ >= md->end_subject)      if (eptr >= md->end_subject)   /* DO NOT merge the eptr++ here; it must */
2032        {        {                            /* not be updated before SCHECK_PARTIAL. */
2033        SCHECK_PARTIAL();        SCHECK_PARTIAL();
2034        MRRETURN(MATCH_NOMATCH);        MRRETURN(MATCH_NOMATCH);
2035        }        }
2036        eptr++;
2037      ecode++;      ecode++;
2038      break;      break;
2039    
# Line 6370  if (rc == MATCH_MATCH || rc == MATCH_ACC Line 6388  if (rc == MATCH_MATCH || rc == MATCH_ACC
6388    those at the end that need unsetting here. We can't just unset them all at    those at the end that need unsetting here. We can't just unset them all at
6389    the start of the whole thing because they may get set in one branch that is    the start of the whole thing because they may get set in one branch that is
6390    not the final matching branch. */    not the final matching branch. */
6391    
6392    if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL)    if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL)
6393      {      {
6394      register int *iptr, *iend;      register int *iptr, *iend;

Legend:
Removed from v.625  
changed lines
  Added in v.648

  ViewVC Help
Powered by ViewVC 1.1.5