| 68 |
#define MATCH_MATCH 1 |
#define MATCH_MATCH 1 |
| 69 |
#define MATCH_NOMATCH 0 |
#define MATCH_NOMATCH 0 |
| 70 |
|
|
| 71 |
/* Special internal returns from the match() function. Make them sufficiently |
/* Special internal returns from the match() function. Make them sufficiently |
| 72 |
negative to avoid the external error codes. */ |
negative to avoid the external error codes. */ |
| 73 |
|
|
| 74 |
#define MATCH_COMMIT (-999) |
#define MATCH_COMMIT (-999) |
| 622 |
switch(op) |
switch(op) |
| 623 |
{ |
{ |
| 624 |
case OP_FAIL: |
case OP_FAIL: |
| 625 |
return MATCH_NOMATCH; |
return MATCH_NOMATCH; |
| 626 |
|
|
| 627 |
case OP_PRUNE: |
case OP_PRUNE: |
| 628 |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
| 629 |
ims, eptrb, flags, RM51); |
ims, eptrb, flags, RM51); |
| 630 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 631 |
return MATCH_PRUNE; |
return MATCH_PRUNE; |
| 632 |
|
|
| 633 |
case OP_COMMIT: |
case OP_COMMIT: |
| 634 |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
| 635 |
ims, eptrb, flags, RM52); |
ims, eptrb, flags, RM52); |
| 636 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 637 |
return MATCH_COMMIT; |
return MATCH_COMMIT; |
| 638 |
|
|
| 639 |
case OP_SKIP: |
case OP_SKIP: |
| 640 |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
| 641 |
ims, eptrb, flags, RM53); |
ims, eptrb, flags, RM53); |
| 642 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 643 |
md->start_match_ptr = eptr; /* Pass back current position */ |
md->start_match_ptr = eptr; /* Pass back current position */ |
| 644 |
return MATCH_SKIP; |
return MATCH_SKIP; |
| 645 |
|
|
| 646 |
case OP_THEN: |
case OP_THEN: |
| 647 |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, |
| 648 |
ims, eptrb, flags, RM53); |
ims, eptrb, flags, RM53); |
| 649 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 650 |
return MATCH_THEN; |
return MATCH_THEN; |
| 651 |
|
|
| 652 |
/* Handle a capturing bracket. If there is space in the offset vector, save |
/* Handle a capturing bracket. If there is space in the offset vector, save |
| 653 |
the current subject position in the working slot at the top of the vector. |
the current subject position in the working slot at the top of the vector. |
| 654 |
We mustn't change the current values of the data slot, because they may be |
We mustn't change the current values of the data slot, because they may be |
| 4586 |
for(;;) |
for(;;) |
| 4587 |
{ |
{ |
| 4588 |
USPTR save_end_subject = end_subject; |
USPTR save_end_subject = end_subject; |
| 4589 |
USPTR new_start_match; |
USPTR new_start_match; |
| 4590 |
|
|
| 4591 |
/* Reset the maximum number of extractions we might see. */ |
/* Reset the maximum number of extractions we might see. */ |
| 4592 |
|
|
| 4730 |
md->start_match_ptr = start_match; |
md->start_match_ptr = start_match; |
| 4731 |
md->match_call_count = 0; |
md->match_call_count = 0; |
| 4732 |
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); |
| 4733 |
|
|
| 4734 |
switch(rc) |
switch(rc) |
| 4735 |
{ |
{ |
| 4736 |
/* NOMATCH and PRUNE advance by one character. THEN at this level acts |
/* NOMATCH and PRUNE advance by one character. THEN at this level acts |
| 4737 |
exactly like PRUNE. */ |
exactly like PRUNE. */ |
| 4738 |
|
|
| 4739 |
case MATCH_NOMATCH: |
case MATCH_NOMATCH: |
| 4740 |
case MATCH_PRUNE: |
case MATCH_PRUNE: |
| 4741 |
case MATCH_THEN: |
case MATCH_THEN: |
| 4742 |
new_start_match = start_match + 1; |
new_start_match = start_match + 1; |
| 4743 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 4744 |
if (utf8) |
if (utf8) |
| 4745 |
while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80) |
while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80) |
| 4746 |
new_start_match++; |
new_start_match++; |
| 4747 |
#endif |
#endif |
| 4748 |
break; |
break; |
| 4749 |
|
|
| 4750 |
/* SKIP passes back the next starting point explicitly. */ |
/* SKIP passes back the next starting point explicitly. */ |
| 4751 |
|
|
| 4752 |
case MATCH_SKIP: |
case MATCH_SKIP: |
| 4753 |
new_start_match = md->start_match_ptr; |
new_start_match = md->start_match_ptr; |
| 4754 |
break; |
break; |
| 4755 |
|
|
| 4756 |
/* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ |
/* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ |
| 4757 |
|
|
| 4758 |
case MATCH_COMMIT: |
case MATCH_COMMIT: |
| 4759 |
rc = MATCH_NOMATCH; |
rc = MATCH_NOMATCH; |
| 4760 |
goto ENDLOOP; |
goto ENDLOOP; |
| 4761 |
|
|
| 4762 |
/* Any other return is some kind of error. */ |
/* Any other return is some kind of error. */ |
| 4763 |
|
|
| 4764 |
default: |
default: |
| 4765 |
goto ENDLOOP; |
goto ENDLOOP; |
| 4766 |
} |
} |
| 4767 |
|
|
| 4768 |
/* Control reaches here for the various types of "no match at this point" |
/* Control reaches here for the various types of "no match at this point" |
| 4769 |
result. Reset the code to MATCH_NOMATCH for subsequent checking. */ |
result. Reset the code to MATCH_NOMATCH for subsequent checking. */ |
| 4770 |
|
|
| 4771 |
rc = MATCH_NOMATCH; |
rc = MATCH_NOMATCH; |
| 4772 |
|
|
| 4773 |
/* If PCRE_FIRSTLINE is set, the match must happen before or at the first |
/* If PCRE_FIRSTLINE is set, the match must happen before or at the first |
| 4774 |
newline in the subject (though it may continue over the newline). Therefore, |
newline in the subject (though it may continue over the newline). Therefore, |