/[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 341 by ph10, Sat Apr 19 16:41:04 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);  
       }  
     /* Fall through */  
   
1435      case OP_ALLANY:      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 1734  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;        ecode += 3;
1734    
1735        /* If the reference is unset, there are two possibilities:        /* If the reference is unset, there are two possibilities:
1736    
1737        (a) In the default, Perl-compatible state, set the length to be longer        (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        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        match fails. We can't just fail here, because of the possibility of
1740        quantifiers with zero minima.        quantifiers with zero minima.
1741    
1742        (b) If the JavaScript compatibility flag is set, set the length to zero        (b) If the JavaScript compatibility flag is set, set the length to zero
1743        so that the back reference matches an empty string.        so that the back reference matches an empty string.
1744    
1745        Otherwise, set the length to the length of what was matched by the        Otherwise, set the length to the length of what was matched by the
1746        referenced subpattern. */        referenced subpattern. */
1747    
1748        if (offset >= offset_top || md->offset_vector[offset] < 0)        if (offset >= offset_top || md->offset_vector[offset] < 0)
1749          length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1;          length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1;
1750        else        else
1751          length = md->offset_vector[offset+1] - md->offset_vector[offset];          length = md->offset_vector[offset+1] - md->offset_vector[offset];
1752    
# Line 2955  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++;
# Line 3180  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            }            }
         else eptr += min;  
3183          break;          break;
3184    
3185          case OP_ALLANY:          case OP_ALLANY:
# Line 3449  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              case OP_ALLANY:              case OP_ALLANY:
3451              case OP_ANYBYTE:              case OP_ANYBYTE:
3452              break;              break;
3453    
# Line 3609  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              case OP_ALLANY:              case OP_ALLANY:
3610              case OP_ANYBYTE:              case OP_ANYBYTE:
3611              break;              break;
3612    
# Line 3870  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 3894  for (;;) Line 3872  for (;;)
3872    
3873            else            else
3874              {              {
3875              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  
3876                {                {
3877                eptr = md->end_subject;                if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break;
3878                  eptr++;
3879                  while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
3880                }                }
3881              }              }
3882            break;            break;
# Line 4108  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 */            break;
4088    
4089            case OP_ALLANY:            case OP_ALLANY:
4090            case OP_ANYBYTE:            case OP_ANYBYTE:

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

  ViewVC Help
Powered by ViewVC 1.1.5