/[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 210 by ph10, Wed Aug 8 14:24:50 2007 UTC revision 227 by ph10, Tue Aug 21 15:00:15 2007 UTC
# Line 68  defined PCRE_ERROR_xxx codes, which are Line 68  defined PCRE_ERROR_xxx codes, which are
68  #define MATCH_MATCH        1  #define MATCH_MATCH        1
69  #define MATCH_NOMATCH      0  #define MATCH_NOMATCH      0
70    
71  /* Special internal returns from the match() function. Make them sufficiently  /* Special internal returns from the match() function. Make them sufficiently
72  negative to avoid the external error codes. */  negative to avoid the external error codes. */
73    
74  #define MATCH_COMMIT       (-999)  #define MATCH_COMMIT       (-999)
# Line 211  variable instead of being passed in the Line 211  variable instead of being passed in the
211  ****************************************************************************  ****************************************************************************
212  ***************************************************************************/  ***************************************************************************/
213    
214    /* Numbers for RMATCH calls. When this list is changed, the code at HEAP_RETURN
215  /* Numbers for RMATCH calls */  below must be updated in sync.  */
216    
217  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM6,  RM7,  RM8,  RM9,  RM10,  enum { RM1=1, RM2,  RM3,  RM4,  RM5,  RM6,  RM7,  RM8,  RM9,  RM10,
218         RM11,  RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20,         RM11,  RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20,
219         RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,         RM21,  RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30,
220         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,         RM31,  RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40,
221         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,         RM41,  RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50,
222         RM51,  RM52, RM53 };         RM51,  RM52, RM53, RM54 };
   
223    
224  /* 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
225  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 622  for (;;) Line 621  for (;;)
621    switch(op)    switch(op)
622      {      {
623      case OP_FAIL:      case OP_FAIL:
624      return MATCH_NOMATCH;      RRETURN(MATCH_NOMATCH);
625    
626      case OP_PRUNE:      case OP_PRUNE:
627      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,
628        ims, eptrb, flags, RM51);        ims, eptrb, flags, RM51);
629      if (rrc != MATCH_NOMATCH) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
630      return MATCH_PRUNE;      RRETURN(MATCH_PRUNE);
631    
632      case OP_COMMIT:      case OP_COMMIT:
633      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,
634        ims, eptrb, flags, RM52);        ims, eptrb, flags, RM52);
635      if (rrc != MATCH_NOMATCH) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
636      return MATCH_COMMIT;      RRETURN(MATCH_COMMIT);
637    
638      case OP_SKIP:      case OP_SKIP:
639      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,
640        ims, eptrb, flags, RM53);        ims, eptrb, flags, RM53);
641      if (rrc != MATCH_NOMATCH) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
642      md->start_match_ptr = eptr;   /* Pass back current position */      md->start_match_ptr = eptr;   /* Pass back current position */
643      return MATCH_SKIP;      RRETURN(MATCH_SKIP);
644    
645      case OP_THEN:      case OP_THEN:
646      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,      RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md,
647        ims, eptrb, flags, RM53);        ims, eptrb, flags, RM54);
648      if (rrc != MATCH_NOMATCH) RRETURN(rrc);      if (rrc != MATCH_NOMATCH) RRETURN(rrc);
649      return MATCH_THEN;      RRETURN(MATCH_THEN);
650    
651      /* Handle a capturing bracket. If there is space in the offset vector, save      /* Handle a capturing bracket. If there is space in the offset vector, save
652      the current subject position in the working slot at the top of the vector.      the current subject position in the working slot at the top of the vector.
653      We mustn't change the current values of the data slot, because they may be      We mustn't change the current values of the data slot, because they may be
# Line 2089  for (;;) Line 2088  for (;;)
2088            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21);
2089            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2090            if (eptr-- == pp) break;        /* Stop if tried at original pos */            if (eptr-- == pp) break;        /* Stop if tried at original pos */
2091            BACKCHAR(eptr);            if (utf8) BACKCHAR(eptr);
2092            }            }
2093          RRETURN(MATCH_NOMATCH);          RRETURN(MATCH_NOMATCH);
2094          }          }
# Line 3094  for (;;) Line 3093  for (;;)
3093          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3094            {            {
3095            if (eptr >= md->end_subject ||            if (eptr >= md->end_subject ||
3096               (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0))               (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0))
3097              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3098            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);
3099            }            }
3100          break;          break;
3101    
# Line 3114  for (;;) Line 3113  for (;;)
3113          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
3114            {            {
3115            if (eptr >= md->end_subject ||            if (eptr >= md->end_subject ||
3116               (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0))               (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0))
3117              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3118            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;            while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80);
3119            }            }
3120          break;          break;
3121    
# Line 4229  switch (frame->Xwhere) Line 4228  switch (frame->Xwhere)
4228    LBL(17) LBL(18) LBL(19) LBL(20) LBL(21) LBL(22) LBL(23) LBL(24)    LBL(17) LBL(18) LBL(19) LBL(20) LBL(21) LBL(22) LBL(23) LBL(24)
4229    LBL(25) LBL(26) LBL(27) LBL(28) LBL(29) LBL(30) LBL(31) LBL(32)    LBL(25) LBL(26) LBL(27) LBL(28) LBL(29) LBL(30) LBL(31) LBL(32)
4230    LBL(33) LBL(34) LBL(35) LBL(36) LBL(37) LBL(38) LBL(39) LBL(40)    LBL(33) LBL(34) LBL(35) LBL(36) LBL(37) LBL(38) LBL(39) LBL(40)
4231    LBL(41) LBL(42) LBL(43) LBL(44) LBL(45) LBL(46) LBL(47)    LBL(41) LBL(42) LBL(43) LBL(44) LBL(45) LBL(46) LBL(47) LBL(48)
4232      LBL(49) LBL(50) LBL(51) LBL(52) LBL(53) LBL(54)
4233    default:    default:
4234    DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere));    DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere));
4235    return PCRE_ERROR_INTERNAL;    return PCRE_ERROR_INTERNAL;
# Line 4586  the loop runs just once. */ Line 4586  the loop runs just once. */
4586  for(;;)  for(;;)
4587    {    {
4588    USPTR save_end_subject = end_subject;    USPTR save_end_subject = end_subject;
4589    USPTR new_start_match;    USPTR new_start_match;
4590    
4591    /* Reset the maximum number of extractions we might see. */    /* Reset the maximum number of extractions we might see. */
4592    
# Line 4730  for(;;) Line 4730  for(;;)
4730    md->start_match_ptr = start_match;    md->start_match_ptr = start_match;
4731    md->match_call_count = 0;    md->match_call_count = 0;
4732    rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0);    rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0);
4733    
4734    switch(rc)    switch(rc)
4735      {      {
4736      /* NOMATCH and PRUNE advance by one character. THEN at this level acts      /* NOMATCH and PRUNE advance by one character. THEN at this level acts
4737      exactly like PRUNE. */      exactly like PRUNE. */
4738    
4739      case MATCH_NOMATCH:      case MATCH_NOMATCH:
4740      case MATCH_PRUNE:      case MATCH_PRUNE:
4741      case MATCH_THEN:      case MATCH_THEN:
4742      new_start_match = start_match + 1;      new_start_match = start_match + 1;
4743  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
4744      if (utf8)      if (utf8)
4745        while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80)        while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80)
4746          new_start_match++;          new_start_match++;
4747  #endif  #endif
4748      break;      break;
4749    
4750      /* SKIP passes back the next starting point explicitly. */      /* SKIP passes back the next starting point explicitly. */
4751    
4752      case MATCH_SKIP:      case MATCH_SKIP:
4753      new_start_match = md->start_match_ptr;      new_start_match = md->start_match_ptr;
4754      break;      break;
4755    
4756      /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */      /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */
4757    
4758      case MATCH_COMMIT:      case MATCH_COMMIT:
4759      rc = MATCH_NOMATCH;      rc = MATCH_NOMATCH;
4760      goto ENDLOOP;      goto ENDLOOP;
4761    
4762      /* Any other return is some kind of error. */      /* Any other return is some kind of error. */
4763    
4764      default:      default:
4765      goto ENDLOOP;      goto ENDLOOP;
4766      }      }
4767    
4768    /* Control reaches here for the various types of "no match at this point"    /* Control reaches here for the various types of "no match at this point"
4769    result. Reset the code to MATCH_NOMATCH for subsequent checking. */    result. Reset the code to MATCH_NOMATCH for subsequent checking. */
4770    
4771    rc = MATCH_NOMATCH;    rc = MATCH_NOMATCH;
4772    
4773    /* If PCRE_FIRSTLINE is set, the match must happen before or at the first    /* If PCRE_FIRSTLINE is set, the match must happen before or at the first
4774    newline in the subject (though it may continue over the newline). Therefore,    newline in the subject (though it may continue over the newline). Therefore,
# Line 4785  for(;;) Line 4785  for(;;)
4785    
4786    if (anchored || start_match > end_subject) break;    if (anchored || start_match > end_subject) break;
4787    
4788    /* If we have just passed a CR and the newline option is CRLF or ANY or    /* If we have just passed a CR and we are now at a LF, and the pattern does
4789    ANYCRLF, and we are now at a LF, advance the match position by one more    not contain any explicit matches for \r or \n, and the newline option is CRLF
4790    character. */    or ANY or ANYCRLF, advance the match position by one more character. */
4791    
4792    if (start_match[-1] == '\r' &&    if (start_match[-1] == '\r' &&
4793         (md->nltype == NLTYPE_ANY ||        start_match < end_subject &&
4794          md->nltype == NLTYPE_ANYCRLF ||        *start_match == '\n' &&
4795          md->nllen == 2) &&        (re->options & PCRE_HASCRORLF) == 0 &&
4796         start_match < end_subject &&          (md->nltype == NLTYPE_ANY ||
4797         *start_match == '\n')           md->nltype == NLTYPE_ANYCRLF ||
4798             md->nllen == 2))
4799      start_match++;      start_match++;
4800    
4801    }   /* End of for(;;) "bumpalong" loop */    }   /* End of for(;;) "bumpalong" loop */

Legend:
Removed from v.210  
changed lines
  Added in v.227

  ViewVC Help
Powered by ViewVC 1.1.5