| 1070 |
if (pcre_callout != NULL) |
if (pcre_callout != NULL) |
| 1071 |
{ |
{ |
| 1072 |
pcre_callout_block cb; |
pcre_callout_block cb; |
| 1073 |
cb.version = 1; /* Version 1 of the callout block */ |
cb.version = 2; /* Version 1 of the callout block */ |
| 1074 |
cb.callout_number = ecode[LINK_SIZE+2]; |
cb.callout_number = ecode[LINK_SIZE+2]; |
| 1075 |
cb.offset_vector = md->offset_vector; |
cb.offset_vector = md->offset_vector; |
| 1076 |
cb.subject = (PCRE_SPTR)md->start_subject; |
cb.subject = (PCRE_SPTR)md->start_subject; |
| 1082 |
cb.capture_top = offset_top/2; |
cb.capture_top = offset_top/2; |
| 1083 |
cb.capture_last = md->capture_last; |
cb.capture_last = md->capture_last; |
| 1084 |
cb.callout_data = md->callout_data; |
cb.callout_data = md->callout_data; |
| 1085 |
|
cb.mark = markptr; |
| 1086 |
if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH); |
if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH); |
| 1087 |
if (rrc < 0) RRETURN(rrc); |
if (rrc < 0) RRETURN(rrc); |
| 1088 |
} |
} |
| 1366 |
if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) |
if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) |
| 1367 |
{ |
{ |
| 1368 |
mstart = md->start_match_ptr; /* In case \K reset it */ |
mstart = md->start_match_ptr; /* In case \K reset it */ |
| 1369 |
|
markptr = md->mark; |
| 1370 |
break; |
break; |
| 1371 |
} |
} |
| 1372 |
if (rrc != MATCH_NOMATCH && |
if (rrc != MATCH_NOMATCH && |
| 1465 |
if (pcre_callout != NULL) |
if (pcre_callout != NULL) |
| 1466 |
{ |
{ |
| 1467 |
pcre_callout_block cb; |
pcre_callout_block cb; |
| 1468 |
cb.version = 1; /* Version 1 of the callout block */ |
cb.version = 2; /* Version 1 of the callout block */ |
| 1469 |
cb.callout_number = ecode[1]; |
cb.callout_number = ecode[1]; |
| 1470 |
cb.offset_vector = md->offset_vector; |
cb.offset_vector = md->offset_vector; |
| 1471 |
cb.subject = (PCRE_SPTR)md->start_subject; |
cb.subject = (PCRE_SPTR)md->start_subject; |
| 1477 |
cb.capture_top = offset_top/2; |
cb.capture_top = offset_top/2; |
| 1478 |
cb.capture_last = md->capture_last; |
cb.capture_last = md->capture_last; |
| 1479 |
cb.callout_data = md->callout_data; |
cb.callout_data = md->callout_data; |
| 1480 |
|
cb.mark = markptr; |
| 1481 |
if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH); |
if ((rrc = (*pcre_callout)(&cb)) > 0) MRRETURN(MATCH_NOMATCH); |
| 1482 |
if (rrc < 0) RRETURN(rrc); |
if (rrc < 0) RRETURN(rrc); |
| 1483 |
} |
} |
| 1503 |
|
|
| 1504 |
case OP_RECURSE: |
case OP_RECURSE: |
| 1505 |
{ |
{ |
| 1506 |
|
recursion_info *ri; |
| 1507 |
|
int recno; |
| 1508 |
|
|
| 1509 |
callpat = md->start_code + GET(ecode, 1); |
callpat = md->start_code + GET(ecode, 1); |
| 1510 |
new_recursive.group_num = (callpat == md->start_code)? 0 : |
recno = (callpat == md->start_code)? 0 : |
| 1511 |
GET2(callpat, 1 + LINK_SIZE); |
GET2(callpat, 1 + LINK_SIZE); |
| 1512 |
|
|
| 1513 |
|
/* Check for repeating a recursion without advancing the subject pointer. |
| 1514 |
|
This should catch convoluted mutual recursions. (Some simple cases are |
| 1515 |
|
caught at compile time.) */ |
| 1516 |
|
|
| 1517 |
|
for (ri = md->recursive; ri != NULL; ri = ri->prevrec) |
| 1518 |
|
if (recno == ri->group_num && eptr == ri->subject_position) |
| 1519 |
|
RRETURN(PCRE_ERROR_RECURSELOOP); |
| 1520 |
|
|
| 1521 |
/* Add to "recursing stack" */ |
/* Add to "recursing stack" */ |
| 1522 |
|
|
| 1523 |
|
new_recursive.group_num = recno; |
| 1524 |
|
new_recursive.subject_position = eptr; |
| 1525 |
new_recursive.prevrec = md->recursive; |
new_recursive.prevrec = md->recursive; |
| 1526 |
md->recursive = &new_recursive; |
md->recursive = &new_recursive; |
| 1527 |
|
|
| 1669 |
md->end_match_ptr = eptr; /* For ONCE */ |
md->end_match_ptr = eptr; /* For ONCE */ |
| 1670 |
md->end_offset_top = offset_top; |
md->end_offset_top = offset_top; |
| 1671 |
md->start_match_ptr = mstart; |
md->start_match_ptr = mstart; |
| 1672 |
MRRETURN(MATCH_MATCH); |
MRRETURN(MATCH_MATCH); /* Sets md->mark */ |
| 1673 |
} |
} |
| 1674 |
|
|
| 1675 |
/* For capturing groups we have to check the group number back at the start |
/* For capturing groups we have to check the group number back at the start |
| 2014 |
/* Fall through */ |
/* Fall through */ |
| 2015 |
|
|
| 2016 |
case OP_ALLANY: |
case OP_ALLANY: |
| 2017 |
if (eptr++ >= md->end_subject) |
if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */ |
| 2018 |
{ |
{ /* not be updated before SCHECK_PARTIAL. */ |
| 2019 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 2020 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 2021 |
} |
} |
| 2022 |
|
eptr++; |
| 2023 |
if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 2024 |
ecode++; |
ecode++; |
| 2025 |
break; |
break; |
| 2028 |
any byte, even newline, independent of the setting of PCRE_DOTALL. */ |
any byte, even newline, independent of the setting of PCRE_DOTALL. */ |
| 2029 |
|
|
| 2030 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 2031 |
if (eptr++ >= md->end_subject) |
if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */ |
| 2032 |
{ |
{ /* not be updated before SCHECK_PARTIAL. */ |
| 2033 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 2034 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 2035 |
} |
} |
| 2036 |
|
eptr++; |
| 2037 |
ecode++; |
ecode++; |
| 2038 |
break; |
break; |
| 2039 |
|
|