| 752 |
RRETURN(MATCH_SKIP); |
RRETURN(MATCH_SKIP); |
| 753 |
|
|
| 754 |
/* Note that, for Perl compatibility, SKIP with an argument does NOT set |
/* Note that, for Perl compatibility, SKIP with an argument does NOT set |
| 755 |
nomatch_mark. There is a flag that disables this opcode when re-matching a |
nomatch_mark. There is a flag that disables this opcode when re-matching a |
| 756 |
pattern that ended with a SKIP for which there was not a matching MARK. */ |
pattern that ended with a SKIP for which there was not a matching MARK. */ |
| 757 |
|
|
| 758 |
case OP_SKIP_ARG: |
case OP_SKIP_ARG: |
| 759 |
if (md->ignore_skip_arg) |
if (md->ignore_skip_arg) |
| 760 |
{ |
{ |
| 761 |
ecode += _pcre_OP_lengths[*ecode] + ecode[1]; |
ecode += _pcre_OP_lengths[*ecode] + ecode[1]; |
| 762 |
break; |
break; |
| 763 |
} |
} |
| 764 |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode] + ecode[1], offset_top, md, |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode] + ecode[1], offset_top, md, |
| 765 |
eptrb, RM57); |
eptrb, RM57); |
| 766 |
if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) |
if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) |
| 768 |
|
|
| 769 |
/* Pass back the current skip name by overloading md->start_match_ptr and |
/* Pass back the current skip name by overloading md->start_match_ptr and |
| 770 |
returning the special MATCH_SKIP_ARG return code. This will either be |
returning the special MATCH_SKIP_ARG return code. This will either be |
| 771 |
caught by a matching MARK, or get to the top, where it causes a rematch |
caught by a matching MARK, or get to the top, where it causes a rematch |
| 772 |
with the md->ignore_skip_arg flag set. */ |
with the md->ignore_skip_arg flag set. */ |
| 773 |
|
|
| 774 |
md->start_match_ptr = ecode + 2; |
md->start_match_ptr = ecode + 2; |
| 3037 |
} |
} |
| 3038 |
break; |
break; |
| 3039 |
|
|
| 3040 |
/* Match a single character, caselessly. If we are at the end of the |
/* Match a single character, caselessly. If we are at the end of the |
| 3041 |
subject, give up immediately. */ |
subject, give up immediately. */ |
| 3042 |
|
|
| 3043 |
case OP_CHARI: |
case OP_CHARI: |
| 3044 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 3045 |
{ |
{ |
| 3046 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 3047 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3048 |
} |
} |
| 3049 |
|
|
| 3050 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 3051 |
if (utf8) |
if (utf8) |
| 3052 |
{ |
{ |
| 3053 |
length = 1; |
length = 1; |
| 3054 |
ecode++; |
ecode++; |
| 3055 |
GETCHARLEN(fc, ecode, length); |
GETCHARLEN(fc, ecode, length); |
| 3056 |
|
|
| 3057 |
/* If the pattern character's value is < 128, we have only one byte, and |
/* If the pattern character's value is < 128, we have only one byte, and |
| 3058 |
we know that its other case must also be one byte long, so we can use the |
we know that its other case must also be one byte long, so we can use the |
| 3059 |
fast lookup table. We know that there is at least one byte left in the |
fast lookup table. We know that there is at least one byte left in the |
| 3060 |
subject. */ |
subject. */ |
| 3061 |
|
|
| 3062 |
if (fc < 128) |
if (fc < 128) |
| 6456 |
switch(rc) |
switch(rc) |
| 6457 |
{ |
{ |
| 6458 |
/* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched |
/* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched |
| 6459 |
the SKIP's arg was not found. In this circumstance, Perl ignores the SKIP |
the SKIP's arg was not found. In this circumstance, Perl ignores the SKIP |
| 6460 |
entirely. The only way we can do that is to re-do the match at the same |
entirely. The only way we can do that is to re-do the match at the same |
| 6461 |
point, with a flag to force SKIP with an argument to be ignored. Just |
point, with a flag to force SKIP with an argument to be ignored. Just |
| 6462 |
treating this case as NOMATCH does not work because it does not check other |
treating this case as NOMATCH does not work because it does not check other |
| 6463 |
alternatives in patterns such as A(*SKIP:A)B|AC when the subject is AC. */ |
alternatives in patterns such as A(*SKIP:A)B|AC when the subject is AC. */ |
| 6464 |
|
|
| 6465 |
case MATCH_SKIP_ARG: |
case MATCH_SKIP_ARG: |
| 6466 |
new_start_match = start_match; |
new_start_match = start_match; |
| 6467 |
md->ignore_skip_arg = TRUE; |
md->ignore_skip_arg = TRUE; |
| 6468 |
break; |
break; |
| 6469 |
|
|
| 6470 |
/* SKIP passes back the next starting point explicitly, but if it is the |
/* SKIP passes back the next starting point explicitly, but if it is the |
| 6471 |
same as the match we have just done, treat it as NOMATCH. */ |
same as the match we have just done, treat it as NOMATCH. */ |
| 6614 |
} |
} |
| 6615 |
|
|
| 6616 |
/* Return MARK data if requested */ |
/* Return MARK data if requested */ |
| 6617 |
|
|
| 6618 |
if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) |
if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) |
| 6619 |
*(extra_data->mark) = (unsigned char *)(md->mark); |
*(extra_data->mark) = (unsigned char *)(md->mark); |
| 6620 |
DPRINTF((">>>> returning %d\n", rc)); |
DPRINTF((">>>> returning %d\n", rc)); |