/[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 892 by ph10, Wed Jan 18 17:23:20 2012 UTC revision 895 by ph10, Fri Jan 20 12:12:03 2012 UTC
# Line 615  int save_offset1, save_offset2, save_off Line 615  int save_offset1, save_offset2, save_off
615  int stacksave[REC_STACK_SAVE_MAX];  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
620    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
622    cannot normally every be NULL. The return is the negated value of the frame
623    size. */
624    
625    if (ecode == NULL)
626      {
627      if (rdepth == 0)
628        return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1);
629      else
630        {
631        int len = (char *)&rdepth - (char *)eptr;
632        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 6190  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
6211    per recursive call of match(). */
6212    
6213    if (re == NULL && extra_data == NULL && subject == NULL && length == -1)
6214    #ifdef NO_RECURSE
6215      return -sizeof(heapframe);
6216    #else
6217      return match(NULL, NULL, NULL, 0, NULL, NULL, 0);
6218    #endif
6219    
6220  /* Plausibility checks */  /* Plausibility checks */
6221    
6222  if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;  if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
6223  if (re == NULL || subject == NULL ||  if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0))
6224     (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;    return PCRE_ERROR_NULL;
6225  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;  if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
6226  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;  if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET;
6227    
6228    /* Check that the first field in the block is the magic number. If it is not,
6229    return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to
6230    REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which
6231    means that the pattern is likely compiled with different endianness. */
6232    
6233    if (re->magic_number != MAGIC_NUMBER)
6234      return re->magic_number == REVERSED_MAGIC_NUMBER?
6235        PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;
6236    if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;
6237    
6238  /* These two settings are used in the code for checking a UTF-8 string that  /* These two settings are used in the code for checking a UTF-8 string that
6239  follows immediately afterwards. Other values in the md block are used only  follows immediately afterwards. Other values in the md block are used only
6240  during "normal" pcre_exec() processing, not when the JIT support is in use,  during "normal" pcre_exec() processing, not when the JIT support is in use,
# Line 6297  in other programs later. */ Line 6334  in other programs later. */
6334    
6335  if (tables == NULL) tables = PRIV(default_tables);  if (tables == NULL) tables = PRIV(default_tables);
6336    
 /* Check that the first field in the block is the magic number. If it is not,  
 return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to  
 REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which  
 means that the pattern is likely compiled with different endianness. */  
   
 if (re->magic_number != MAGIC_NUMBER)  
   return re->magic_number == REVERSED_MAGIC_NUMBER?  
     PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC;  
 if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE;  
   
6337  /* Set up other data */  /* Set up other data */
6338    
6339  anchored = ((re->options | options) & PCRE_ANCHORED) != 0;  anchored = ((re->options | options) & PCRE_ANCHORED) != 0;

Legend:
Removed from v.892  
changed lines
  Added in v.895

  ViewVC Help
Powered by ViewVC 1.1.5