/[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 335 by ph10, Sat Apr 12 14:36:14 2008 UTC revision 345 by ph10, Mon Apr 28 15:10:02 2008 UTC
# Line 1429  for (;;) Line 1429  for (;;)
1429      /* Match a single character type; inline for speed */      /* Match a single character type; inline for speed */
1430    
1431      case OP_ANY:      case OP_ANY:
1432      if ((ims & PCRE_DOTALL) == 0)      if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
1433        {      /* Fall through */
1434        if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);  
1435        }      case OP_ALLANY:
1436      if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);      if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
1437      if (utf8)      if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
       while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;  
1438      ecode++;      ecode++;
1439      break;      break;
1440    
# Line 1731  for (;;) Line 1730  for (;;)
1730      case OP_REF:      case OP_REF:
1731        {        {
1732        offset = GET2(ecode, 1) << 1;               /* Doubled ref number */        offset = GET2(ecode, 1) << 1;               /* Doubled ref number */
1733        ecode += 3;                                 /* Advance past item */        ecode += 3;
1734    
1735          /* If the reference is unset, there are two possibilities:
1736    
1737          (a) In the default, Perl-compatible state, set the length to be longer
1738          than the amount of subject left; this ensures that every attempt at a
1739          match fails. We can't just fail here, because of the possibility of
1740          quantifiers with zero minima.
1741    
1742        /* If the reference is unset, set the length to be longer than the amount        (b) If the JavaScript compatibility flag is set, set the length to zero
1743        of subject left; this ensures that every attempt at a match fails. We        so that the back reference matches an empty string.
1744        can't just fail here, because of the possibility of quantifiers with zero  
1745        minima. */        Otherwise, set the length to the length of what was matched by the
1746          referenced subpattern. */
1747        length = (offset >= offset_top || md->offset_vector[offset] < 0)?  
1748          md->end_subject - eptr + 1 :        if (offset >= offset_top || md->offset_vector[offset] < 0)
1749          md->offset_vector[offset+1] - md->offset_vector[offset];          length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1;
1750          else
1751            length = md->offset_vector[offset+1] - md->offset_vector[offset];
1752    
1753        /* Set up for repetition, or handle the non-repeated case */        /* Set up for repetition, or handle the non-repeated case */
1754    
# Line 2943  for (;;) Line 2951  for (;;)
2951          case OP_ANY:          case OP_ANY:
2952          for (i = 1; i <= min; i++)          for (i = 1; i <= min; i++)
2953            {            {
2954            if (eptr >= md->end_subject ||            if (eptr >= md->end_subject || IS_NEWLINE(eptr))
                ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr)))  
2955              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
2956            eptr++;            eptr++;
2957            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;            while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
2958            }            }
2959          break;          break;
2960    
2961            case OP_ALLANY:
2962            for (i = 1; i <= min; i++)
2963              {
2964              if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
2965              eptr++;
2966              while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
2967              }
2968            break;
2969    
2970          case OP_ANYBYTE:          case OP_ANYBYTE:
2971          eptr += min;          eptr += min;
2972          break;          break;
# Line 3159  for (;;) Line 3175  for (;;)
3175        switch(ctype)        switch(ctype)
3176          {          {
3177          case OP_ANY:          case OP_ANY:
3178          if ((ims & PCRE_DOTALL) == 0)          for (i = 1; i <= min; i++)
3179            {            {
3180            for (i = 1; i <= min; i++)            if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);
3181              {            eptr++;
             if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH);  
             eptr++;  
             }  
3182            }            }
3183          else eptr += min;          break;
3184    
3185            case OP_ALLANY:
3186            eptr += min;
3187          break;          break;
3188    
3189          case OP_ANYBYTE:          case OP_ANYBYTE:
# Line 3424  for (;;) Line 3440  for (;;)
3440            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42);
3441            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3442            if (fi >= max || eptr >= md->end_subject ||            if (fi >= max || eptr >= md->end_subject ||
3443                 (ctype == OP_ANY && (ims & PCRE_DOTALL) == 0 &&                 (ctype == OP_ANY && IS_NEWLINE(eptr)))
                 IS_NEWLINE(eptr)))  
3444              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3445    
3446            GETCHARINC(c, eptr);            GETCHARINC(c, eptr);
3447            switch(ctype)            switch(ctype)
3448              {              {
3449              case OP_ANY:        /* This is the DOTALL case */              case OP_ANY:        /* This is the non-NL case */
3450              break;              case OP_ALLANY:
   
3451              case OP_ANYBYTE:              case OP_ANYBYTE:
3452              break;              break;
3453    
# Line 3585  for (;;) Line 3599  for (;;)
3599            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);            RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43);
3600            if (rrc != MATCH_NOMATCH) RRETURN(rrc);            if (rrc != MATCH_NOMATCH) RRETURN(rrc);
3601            if (fi >= max || eptr >= md->end_subject ||            if (fi >= max || eptr >= md->end_subject ||
3602                 ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr)))                 (ctype == OP_ANY && IS_NEWLINE(eptr)))
3603              RRETURN(MATCH_NOMATCH);              RRETURN(MATCH_NOMATCH);
3604    
3605            c = *eptr++;            c = *eptr++;
3606            switch(ctype)            switch(ctype)
3607              {              {
3608              case OP_ANY:   /* This is the DOTALL case */              case OP_ANY:     /* This is the non-NL case */
3609              break;              case OP_ALLANY:
   
3610              case OP_ANYBYTE:              case OP_ANYBYTE:
3611              break;              break;
3612    
# Line 3847  for (;;) Line 3860  for (;;)
3860            case OP_ANY:            case OP_ANY:
3861            if (max < INT_MAX)            if (max < INT_MAX)
3862              {              {
3863              if ((ims & PCRE_DOTALL) == 0)              for (i = min; i < max; i++)
               {  
               for (i = min; i < max; i++)  
                 {  
                 if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;  
                 eptr++;  
                 while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;  
                 }  
               }  
             else  
3864                {                {
3865                for (i = min; i < max; i++)                if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
3866                  {                eptr++;
3867                  if (eptr >= md->end_subject) break;                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
                 eptr++;  
                 while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;  
                 }  
3868                }                }
3869              }              }
3870    
# Line 3871  for (;;) Line 3872  for (;;)
3872    
3873            else            else
3874              {              {
3875              if ((ims & PCRE_DOTALL) == 0)              for (i = min; i < max; i++)
3876                {                {
3877                for (i = min; i < max; i++)                if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
3878                  {                eptr++;
3879                  if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;                while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
                 eptr++;  
                 while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;  
                 }  
3880                }                }
3881              else              }
3882              break;
3883    
3884              case OP_ALLANY:
3885              if (max < INT_MAX)
3886                {
3887                for (i = min; i < max; i++)
3888                {                {
3889                eptr = md->end_subject;                if (eptr >= md->end_subject) break;
3890                  eptr++;
3891                  while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
3892                }                }
3893              }              }
3894              else eptr = md->end_subject;   /* Unlimited UTF-8 repeat */
3895            break;            break;
3896    
3897            /* The byte case is the same as non-UTF8 */            /* The byte case is the same as non-UTF8 */
# Line 4072  for (;;) Line 4079  for (;;)
4079          switch(ctype)          switch(ctype)
4080            {            {
4081            case OP_ANY:            case OP_ANY:
4082            if ((ims & PCRE_DOTALL) == 0)            for (i = min; i < max; i++)
4083              {              {
4084              for (i = min; i < max; i++)              if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
4085                {              eptr++;
               if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;  
               eptr++;  
               }  
             break;  
4086              }              }
4087            /* For DOTALL case, fall through and treat as \C */            break;
4088    
4089              case OP_ALLANY:
4090            case OP_ANYBYTE:            case OP_ANYBYTE:
4091            c = max - min;            c = max - min;
4092            if (c > (unsigned int)(md->end_subject - eptr))            if (c > (unsigned int)(md->end_subject - eptr))
# Line 4458  end_subject = md->end_subject; Line 4462  end_subject = md->end_subject;
4462    
4463  md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;  md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
4464  utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0;  utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0;
4465    md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0;
4466    
4467  md->notbol = (options & PCRE_NOTBOL) != 0;  md->notbol = (options & PCRE_NOTBOL) != 0;
4468  md->noteol = (options & PCRE_NOTEOL) != 0;  md->noteol = (options & PCRE_NOTEOL) != 0;

Legend:
Removed from v.335  
changed lines
  Added in v.345

webmaster@exim.org
ViewVC Help
Powered by ViewVC 1.1.12