/[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 902 by ph10, Sat Jan 21 15:47:59 2012 UTC revision 903 by ph10, Sat Jan 21 16:37:17 2012 UTC
# Line 487  int condcode; Line 487  int condcode;
487  /* When recursion is not being used, all "local" variables that have to be  /* When recursion is not being used, all "local" variables that have to be
488  preserved over calls to RMATCH() are part of a "frame". We set up the top-level  preserved over calls to RMATCH() are part of a "frame". We set up the top-level
489  frame on the stack here; subsequent instantiations are obtained from the heap  frame on the stack here; subsequent instantiations are obtained from the heap
490  whenever RMATCH() does a "recursion". See the macro definitions above. Putting  whenever RMATCH() does a "recursion". See the macro definitions above. Putting
491  the top-level on the stack rather than malloc-ing them all gives a performance  the top-level on the stack rather than malloc-ing them all gives a performance
492  boost in many cases where there is not much "recursion". */  boost in many cases where there is not much "recursion". */
493    
494  #ifdef NO_RECURSE  #ifdef NO_RECURSE
495  heapframe frame_zero;  heapframe frame_zero;
496  heapframe *frame = &frame_zero;  heapframe *frame = &frame_zero;
497  frame->Xprevframe = NULL;            /* Marks the top level */  frame->Xprevframe = NULL;            /* Marks the top level */
498    
499  /* Copy in the original argument variables */  /* Copy in the original argument variables */
# Line 616  int stacksave[REC_STACK_SAVE_MAX]; Line 616  int stacksave[REC_STACK_SAVE_MAX];
616    
617  eptrblock newptrb;  eptrblock newptrb;
618    
619  /* There is a special fudge for calling match() in a way that causes it to  /* There is a special fudge for calling match() in a way that causes it to
620  measure the size of its basic stack frame when the stack is being used for  measure the size of its basic stack frame when the stack is being used for
621  recursion. The second argument (ecode) being NULL triggers this behaviour. It  recursion. The second argument (ecode) being NULL triggers this behaviour. It
622  cannot normally ever be NULL. The return is the negated value of the frame  cannot normally ever be NULL. The return is the negated value of the frame
# Line 631  if (ecode == NULL) Line 631  if (ecode == NULL)
631      int len = (char *)&rdepth - (char *)eptr;      int len = (char *)&rdepth - (char *)eptr;
632      return (len > 0)? -len : len;      return (len > 0)? -len : len;
633      }      }
634    }    }
635  #endif     /* NO_RECURSE */  #endif     /* NO_RECURSE */
636    
637  /* To save space on the stack and in the heap frame, I have doubled up on some  /* To save space on the stack and in the heap frame, I have doubled up on some
# Line 838  for (;;) Line 838  for (;;)
838      case OP_ONCE_NC:      case OP_ONCE_NC:
839      prev = ecode;      prev = ecode;
840      saved_eptr = eptr;      saved_eptr = eptr;
841      save_mark = md->mark;      save_mark = md->mark;
842      do      do
843        {        {
844        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64);        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64);
# Line 857  for (;;) Line 857  for (;;)
857    
858        if (rrc != MATCH_NOMATCH) RRETURN(rrc);        if (rrc != MATCH_NOMATCH) RRETURN(rrc);
859        ecode += GET(ecode,1);        ecode += GET(ecode,1);
860        md->mark = save_mark;        md->mark = save_mark;
861        }        }
862      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);
863    
# Line 937  for (;;) Line 937  for (;;)
937        save_offset2 = md->offset_vector[offset+1];        save_offset2 = md->offset_vector[offset+1];
938        save_offset3 = md->offset_vector[md->offset_end - number];        save_offset3 = md->offset_vector[md->offset_end - number];
939        save_capture_last = md->capture_last;        save_capture_last = md->capture_last;
940        save_mark = md->mark;        save_mark = md->mark;
941    
942        DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));        DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
943        md->offset_vector[md->offset_end - number] =        md->offset_vector[md->offset_end - number] =
# Line 1043  for (;;) Line 1043  for (;;)
1043        save_mark = md->mark;        save_mark = md->mark;
1044        RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb,        RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb,
1045          RM2);          RM2);
1046    
1047        /* See comment in the code for capturing groups above about handling        /* See comment in the code for capturing groups above about handling
1048        THEN. */        THEN. */
1049    
# Line 1070  for (;;) Line 1070  for (;;)
1070          RRETURN(rrc);          RRETURN(rrc);
1071          }          }
1072        ecode += GET(ecode, 1);        ecode += GET(ecode, 1);
1073        md->mark = save_mark;        md->mark = save_mark;
1074        if (*ecode != OP_ALT) break;        if (*ecode != OP_ALT) break;
1075        }        }
1076    
# Line 1549  for (;;) Line 1549  for (;;)
1549    
1550      case OP_ASSERT:      case OP_ASSERT:
1551      case OP_ASSERTBACK:      case OP_ASSERTBACK:
1552      save_mark = md->mark;      save_mark = md->mark;
1553      if (md->match_function_type == MATCH_CONDASSERT)      if (md->match_function_type == MATCH_CONDASSERT)
1554        {        {
1555        condassert = TRUE;        condassert = TRUE;
# Line 1571  for (;;) Line 1571  for (;;)
1571    
1572        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);        if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc);
1573        ecode += GET(ecode, 1);        ecode += GET(ecode, 1);
1574        md->mark = save_mark;        md->mark = save_mark;
1575        }        }
1576      while (*ecode == OP_ALT);      while (*ecode == OP_ALT);
1577    
# Line 1595  for (;;) Line 1595  for (;;)
1595    
1596      case OP_ASSERT_NOT:      case OP_ASSERT_NOT:
1597      case OP_ASSERTBACK_NOT:      case OP_ASSERTBACK_NOT:
1598      save_mark = md->mark;      save_mark = md->mark;
1599      if (md->match_function_type == MATCH_CONDASSERT)      if (md->match_function_type == MATCH_CONDASSERT)
1600        {        {
1601        condassert = TRUE;        condassert = TRUE;
# Line 1606  for (;;) Line 1606  for (;;)
1606      do      do
1607        {        {
1608        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);        RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5);
1609        md->mark = save_mark;        md->mark = save_mark;
1610        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH);        if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH);
1611        if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)        if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT)
1612          {          {
# Line 6207  PCRE_PUCHAR req_char_ptr = start_match - Line 6207  PCRE_PUCHAR req_char_ptr = start_match -
6207  const pcre_study_data *study;  const pcre_study_data *study;
6208  const REAL_PCRE *re = (const REAL_PCRE *)argument_re;  const REAL_PCRE *re = (const REAL_PCRE *)argument_re;
6209    
6210  /* Check for the special magic call that measures the size of the stack used  /* Check for the special magic call that measures the size of the stack used
6211  per recursive call of match(). */  per recursive call of match(). */
6212    
6213  if (re == NULL && extra_data == NULL && subject == NULL && length == -999 &&  if (re == NULL && extra_data == NULL && subject == NULL && length == -999 &&
6214      start_offset == -999)      start_offset == -999)
6215  #ifdef NO_RECURSE  #ifdef NO_RECURSE
6216    return -sizeof(heapframe);    return -sizeof(heapframe);
6217  #else  #else
6218    return match(NULL, NULL, NULL, 0, NULL, NULL, 0);    return match(NULL, NULL, NULL, 0, NULL, NULL, 0);
6219  #endif  #endif
6220    
6221  /* Plausibility checks */  /* Plausibility checks */
6222    
6223  if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;  if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
6224  if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0))  if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0))
6225    return PCRE_ERROR_NULL;    return PCRE_ERROR_NULL;
6226  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
6227  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;

Legend:
Removed from v.902  
changed lines
  Added in v.903

  ViewVC Help
Powered by ViewVC 1.1.5