| 1433 |
{ |
{ |
| 1434 |
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); |
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); |
| 1435 |
} |
} |
| 1436 |
|
/* Fall through */ |
| 1437 |
|
|
| 1438 |
|
case OP_ALLANY: |
| 1439 |
if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); |
| 1440 |
if (utf8) |
if (utf8) |
| 1441 |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 1734 |
case OP_REF: |
case OP_REF: |
| 1735 |
{ |
{ |
| 1736 |
offset = GET2(ecode, 1) << 1; /* Doubled ref number */ |
offset = GET2(ecode, 1) << 1; /* Doubled ref number */ |
| 1737 |
ecode += 3; /* Advance past item */ |
ecode += 3; |
| 1738 |
|
|
| 1739 |
/* If the reference is unset, set the length to be longer than the amount |
/* If the reference is unset, there are two possibilities: |
| 1740 |
of subject left; this ensures that every attempt at a match fails. We |
|
| 1741 |
can't just fail here, because of the possibility of quantifiers with zero |
(a) In the default, Perl-compatible state, set the length to be longer |
| 1742 |
minima. */ |
than the amount of subject left; this ensures that every attempt at a |
| 1743 |
|
match fails. We can't just fail here, because of the possibility of |
| 1744 |
length = (offset >= offset_top || md->offset_vector[offset] < 0)? |
quantifiers with zero minima. |
| 1745 |
md->end_subject - eptr + 1 : |
|
| 1746 |
md->offset_vector[offset+1] - md->offset_vector[offset]; |
(b) If the JavaScript compatibility flag is set, set the length to zero |
| 1747 |
|
so that the back reference matches an empty string. |
| 1748 |
|
|
| 1749 |
|
Otherwise, set the length to the length of what was matched by the |
| 1750 |
|
referenced subpattern. */ |
| 1751 |
|
|
| 1752 |
|
if (offset >= offset_top || md->offset_vector[offset] < 0) |
| 1753 |
|
length = (md->jscript_compat)? 0 : md->end_subject - eptr + 1; |
| 1754 |
|
else |
| 1755 |
|
length = md->offset_vector[offset+1] - md->offset_vector[offset]; |
| 1756 |
|
|
| 1757 |
/* Set up for repetition, or handle the non-repeated case */ |
/* Set up for repetition, or handle the non-repeated case */ |
| 1758 |
|
|
| 2963 |
} |
} |
| 2964 |
break; |
break; |
| 2965 |
|
|
| 2966 |
|
case OP_ALLANY: |
| 2967 |
|
for (i = 1; i <= min; i++) |
| 2968 |
|
{ |
| 2969 |
|
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
| 2970 |
|
eptr++; |
| 2971 |
|
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 2972 |
|
} |
| 2973 |
|
break; |
| 2974 |
|
|
| 2975 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 2976 |
eptr += min; |
eptr += min; |
| 2977 |
break; |
break; |
| 3191 |
else eptr += min; |
else eptr += min; |
| 3192 |
break; |
break; |
| 3193 |
|
|
| 3194 |
|
case OP_ALLANY: |
| 3195 |
|
eptr += min; |
| 3196 |
|
break; |
| 3197 |
|
|
| 3198 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3199 |
eptr += min; |
eptr += min; |
| 3200 |
break; |
break; |
| 3457 |
switch(ctype) |
switch(ctype) |
| 3458 |
{ |
{ |
| 3459 |
case OP_ANY: /* This is the DOTALL case */ |
case OP_ANY: /* This is the DOTALL case */ |
| 3460 |
break; |
case OP_ALLANY: |
|
|
|
| 3461 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3462 |
break; |
break; |
| 3463 |
|
|
| 3615 |
c = *eptr++; |
c = *eptr++; |
| 3616 |
switch(ctype) |
switch(ctype) |
| 3617 |
{ |
{ |
| 3618 |
case OP_ANY: /* This is the DOTALL case */ |
case OP_ANY: /* This is the DOTALL case */ |
| 3619 |
break; |
case OP_ALLANY: |
|
|
|
| 3620 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3621 |
break; |
break; |
| 3622 |
|
|
| 3910 |
} |
} |
| 3911 |
break; |
break; |
| 3912 |
|
|
| 3913 |
|
case OP_ALLANY: |
| 3914 |
|
if (max < INT_MAX) |
| 3915 |
|
{ |
| 3916 |
|
for (i = min; i < max; i++) |
| 3917 |
|
{ |
| 3918 |
|
if (eptr >= md->end_subject) break; |
| 3919 |
|
eptr++; |
| 3920 |
|
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 3921 |
|
} |
| 3922 |
|
} |
| 3923 |
|
else eptr = md->end_subject; /* Unlimited UTF-8 repeat */ |
| 3924 |
|
break; |
| 3925 |
|
|
| 3926 |
/* The byte case is the same as non-UTF8 */ |
/* The byte case is the same as non-UTF8 */ |
| 3927 |
|
|
| 3928 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 4117 |
} |
} |
| 4118 |
break; |
break; |
| 4119 |
} |
} |
| 4120 |
/* For DOTALL case, fall through and treat as \C */ |
/* For DOTALL case, fall through */ |
| 4121 |
|
|
| 4122 |
|
case OP_ALLANY: |
| 4123 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 4124 |
c = max - min; |
c = max - min; |
| 4125 |
if (c > (unsigned int)(md->end_subject - eptr)) |
if (c > (unsigned int)(md->end_subject - eptr)) |
| 4495 |
|
|
| 4496 |
md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; |
md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; |
| 4497 |
utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0; |
utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0; |
| 4498 |
|
md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; |
| 4499 |
|
|
| 4500 |
md->notbol = (options & PCRE_NOTBOL) != 0; |
md->notbol = (options & PCRE_NOTBOL) != 0; |
| 4501 |
md->noteol = (options & PCRE_NOTEOL) != 0; |
md->noteol = (options & PCRE_NOTEOL) != 0; |