/[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 364 by ph10, Fri Jul 11 14:53:41 2008 UTC revision 381 by ph10, Tue Mar 3 16:08:23 2009 UTC
# Line 6  Line 6 
6  and semantics are as close as possible to those of the Perl 5 language.  and semantics are as close as possible to those of the Perl 5 language.
7    
8                         Written by Philip Hazel                         Written by Philip Hazel
9             Copyright (c) 1997-2008 University of Cambridge             Copyright (c) 1997-2009 University of Cambridge
10    
11  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------
12  Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
# Line 787  for (;;) Line 787  for (;;)
787    
788      case OP_COND:      case OP_COND:
789      case OP_SCOND:      case OP_SCOND:
790        /* Because of the way auto-callout works during compile, a callout item is
791        inserted between OP_COND and an assertion condition. */
792    
793        if (ecode[LINK_SIZE+1] == OP_CALLOUT)
794          {
795          if (pcre_callout != NULL)
796            {
797            pcre_callout_block cb;
798            cb.version          = 1;   /* Version 1 of the callout block */
799            cb.callout_number   = ecode[LINK_SIZE+2];
800            cb.offset_vector    = md->offset_vector;
801            cb.subject          = (PCRE_SPTR)md->start_subject;
802            cb.subject_length   = md->end_subject - md->start_subject;
803            cb.start_match      = mstart - md->start_subject;
804            cb.current_position = eptr - md->start_subject;
805            cb.pattern_position = GET(ecode, LINK_SIZE + 3);
806            cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE);
807            cb.capture_top      = offset_top/2;
808            cb.capture_last     = md->capture_last;
809            cb.callout_data     = md->callout_data;
810            if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
811            if (rrc < 0) RRETURN(rrc);
812            }
813          ecode += _pcre_OP_lengths[OP_CALLOUT];
814          }
815    
816        /* Now see what the actual condition is */
817    
818      if (ecode[LINK_SIZE+1] == OP_RREF)         /* Recursion test */      if (ecode[LINK_SIZE+1] == OP_RREF)         /* Recursion test */
819        {        {
820        offset = GET2(ecode, LINK_SIZE + 2);     /* Recursion group number*/        offset = GET2(ecode, LINK_SIZE + 2);     /* Recursion group number*/
# Line 2609  for (;;) Line 2637  for (;;)
2637              {              {
2638              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28);
2639              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2640                if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
2641              GETCHARINC(d, eptr);              GETCHARINC(d, eptr);
2642              if (d < 256) d = md->lcc[d];              if (d < 256) d = md->lcc[d];
2643              if (fi >= max || eptr >= md->end_subject || fc == d)              if (fc == d) RRETURN(MATCH_NOMATCH);
2644                RRETURN(MATCH_NOMATCH);  
2645              }              }
2646            }            }
2647          else          else
# Line 2718  for (;;) Line 2747  for (;;)
2747              {              {
2748              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);              RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32);
2749              if (rrc != MATCH_NOMATCH) RRETURN(rrc);              if (rrc != MATCH_NOMATCH) RRETURN(rrc);
2750                if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
2751              GETCHARINC(d, eptr);              GETCHARINC(d, eptr);
2752              if (fi >= max || eptr >= md->end_subject || fc == d)              if (fc == d) RRETURN(MATCH_NOMATCH);
               RRETURN(MATCH_NOMATCH);  
2753              }              }
2754            }            }
2755          else          else
# Line 4695  for(;;) Line 4724  for(;;)
4724    
4725    if (firstline)    if (firstline)
4726      {      {
4727      USPTR *t = start_match;      USPTR t = start_match;
4728  #ifdef SUPPORT_UTF8  #ifdef SUPPORT_UTF8
4729      if (utf8)      if (utf8)
4730        {        {
4731        while (t < md->end_subject && !IS_NEWLINE(t))        while (t < md->end_subject && !IS_NEWLINE(t))
4732          {          {
4733          t++;          t++;
4734          while (t < end_subject && (*t & 0xc0) == 0x80) t++;          while (t < end_subject && (*t & 0xc0) == 0x80) t++;
4735          }          }
4736        }        }
4737      else      else
4738  #endif  #endif
4739      while (t < md->end_subject && !IS_NEWLINE(t)) t++;      while (t < md->end_subject && !IS_NEWLINE(t)) t++;
4740      end_subject = t;      end_subject = t;
4741      }      }
# Line 4716  for(;;) Line 4745  for(;;)
4745    if (first_byte >= 0)    if (first_byte >= 0)
4746      {      {
4747      if (first_byte_caseless)      if (first_byte_caseless)
       {  
 #ifdef SUPPORT_UTF8  
       if (utf8)  
         {  
         while (start_match < end_subject && md->lcc[*start_match] != first_byte)  
           {  
           start_match++;  
           while(start_match < end_subject && (*start_match & 0xc0) == 0x80)  
             start_match++;  
           }  
         }  
       else  
 #endif  
4748        while (start_match < end_subject && md->lcc[*start_match] != first_byte)        while (start_match < end_subject && md->lcc[*start_match] != first_byte)
4749          start_match++;          start_match++;
4750        }      else
     else    /* Caseful case */  
       {  
 #ifdef SUPPORT_UTF8  
       if (utf8)  
         {  
         while (start_match < end_subject && *start_match != first_byte)  
           {  
           start_match++;  
           while(start_match < end_subject && (*start_match & 0xc0) == 0x80)  
             start_match++;  
           }  
         }  
       else  
 #endif  
4751        while (start_match < end_subject && *start_match != first_byte)        while (start_match < end_subject && *start_match != first_byte)
4752          start_match++;          start_match++;
       }  
4753      }      }
4754    
4755    /* Or to just after a linebreak for a multiline match */    /* Or to just after a linebreak for a multiline match */
# Line 4762  for(;;) Line 4763  for(;;)
4763          {          {
4764          while (start_match < end_subject && !WAS_NEWLINE(start_match))          while (start_match < end_subject && !WAS_NEWLINE(start_match))
4765            {            {
4766            start_match++;            start_match++;
4767            while(start_match < end_subject && (*start_match & 0xc0) == 0x80)            while(start_match < end_subject && (*start_match & 0xc0) == 0x80)
4768              start_match++;              start_match++;
4769            }            }
4770          }          }
4771        else        else
4772  #endif  #endif
4773        while (start_match < end_subject && !WAS_NEWLINE(start_match))        while (start_match < end_subject && !WAS_NEWLINE(start_match))
4774          start_match++;          start_match++;
4775    
4776        /* If we have just passed a CR and the newline option is ANY or ANYCRLF,        /* If we have just passed a CR and the newline option is ANY or ANYCRLF,
4777        and we are now at a LF, advance the match position by one more character.        and we are now at a LF, advance the match position by one more character.
4778        */        */
# Line 4788  for(;;) Line 4789  for(;;)
4789    
4790    else if (start_bits != NULL)    else if (start_bits != NULL)
4791      {      {
 #ifdef SUPPORT_UTF8  
     if (utf8)  
       {  
       while (start_match < end_subject)  
         {  
         register unsigned int c = *start_match;  
         if ((start_bits[c/8] & (1 << (c&7))) == 0)  
           {  
           start_match++;  
           while(start_match < end_subject && (*start_match & 0xc0) == 0x80)  
             start_match++;  
           }  
         else break;  
         }  
       }  
     else  
 #endif  
4792      while (start_match < end_subject)      while (start_match < end_subject)
4793        {        {
4794        register unsigned int c = *start_match;        register unsigned int c = *start_match;
# Line 4884  for(;;) Line 4868  for(;;)
4868      }      }
4869    
4870    /* OK, we can now run the match. */    /* OK, we can now run the match. */
4871    
4872    md->start_match_ptr = start_match;    md->start_match_ptr = start_match;
4873    md->match_call_count = 0;    md->match_call_count = 0;
4874    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);

Legend:
Removed from v.364  
changed lines
  Added in v.381

  ViewVC Help
Powered by ViewVC 1.1.5