| 663 |
{ |
{ |
| 664 |
minimize = possessive = FALSE; |
minimize = possessive = FALSE; |
| 665 |
op = *ecode; |
op = *ecode; |
| 666 |
|
|
| 667 |
switch(op) |
switch(op) |
| 668 |
{ |
{ |
| 669 |
case OP_FAIL: |
case OP_FAIL: |
| 909 |
ecode += 1 + LINK_SIZE; |
ecode += 1 + LINK_SIZE; |
| 910 |
} |
} |
| 911 |
break; |
break; |
| 912 |
|
|
| 913 |
|
|
| 914 |
|
/* Before OP_ACCEPT there may be any number of OP_CLOSE opcodes, |
| 915 |
|
to close any currently open capturing brackets. */ |
| 916 |
|
|
| 917 |
|
case OP_CLOSE: |
| 918 |
|
number = GET2(ecode, 1); |
| 919 |
|
offset = number << 1; |
| 920 |
|
|
| 921 |
|
#ifdef DEBUG |
| 922 |
|
printf("end bracket %d at *ACCEPT", number); |
| 923 |
|
printf("\n"); |
| 924 |
|
#endif |
| 925 |
|
|
| 926 |
|
md->capture_last = number; |
| 927 |
|
if (offset >= md->offset_max) md->offset_overflow = TRUE; else |
| 928 |
|
{ |
| 929 |
|
md->offset_vector[offset] = |
| 930 |
|
md->offset_vector[md->offset_end - number]; |
| 931 |
|
md->offset_vector[offset+1] = eptr - md->start_subject; |
| 932 |
|
if (offset_top <= offset) offset_top = offset + 2; |
| 933 |
|
} |
| 934 |
|
ecode += 3; |
| 935 |
|
break; |
| 936 |
|
|
| 937 |
|
|
| 938 |
/* End of the pattern, either real or forced. If we are in a top-level |
/* End of the pattern, either real or forced. If we are in a top-level |
| 948 |
md->recursive = rec->prevrec; |
md->recursive = rec->prevrec; |
| 949 |
memmove(md->offset_vector, rec->offset_save, |
memmove(md->offset_vector, rec->offset_save, |
| 950 |
rec->saved_max * sizeof(int)); |
rec->saved_max * sizeof(int)); |
| 951 |
|
offset_top = rec->offset_top; |
| 952 |
mstart = rec->save_start; |
mstart = rec->save_start; |
| 953 |
ims = original_ims; |
ims = original_ims; |
| 954 |
ecode = rec->after_call; |
ecode = rec->after_call; |
| 955 |
break; |
break; |
| 956 |
} |
} |
| 957 |
|
|
| 958 |
/* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty |
/* Otherwise, if we have matched an empty string, fail if PCRE_NOTEMPTY is |
| 959 |
string - backtracking will then try other alternatives, if any. */ |
set, or if PCRE_NOTEMPTY_ATSTART is set and we have matched at the start of |
| 960 |
|
the subject. In both cases, backtracking will then try other alternatives, |
| 961 |
|
if any. */ |
| 962 |
|
|
| 963 |
|
if (eptr == mstart && |
| 964 |
|
(md->notempty || |
| 965 |
|
(md->notempty_atstart && |
| 966 |
|
mstart == md->start_subject + md->start_offset))) |
| 967 |
|
RRETURN(MATCH_NOMATCH); |
| 968 |
|
|
| 969 |
|
/* Otherwise, we have a match. */ |
| 970 |
|
|
|
if (md->notempty && eptr == mstart) RRETURN(MATCH_NOMATCH); |
|
| 971 |
md->end_match_ptr = eptr; /* Record where we ended */ |
md->end_match_ptr = eptr; /* Record where we ended */ |
| 972 |
md->end_offset_top = offset_top; /* and how many extracts were taken */ |
md->end_offset_top = offset_top; /* and how many extracts were taken */ |
| 973 |
md->start_match_ptr = mstart; /* and the start (\K can modify) */ |
md->start_match_ptr = mstart; /* and the start (\K can modify) */ |
| 1140 |
memcpy(new_recursive.offset_save, md->offset_vector, |
memcpy(new_recursive.offset_save, md->offset_vector, |
| 1141 |
new_recursive.saved_max * sizeof(int)); |
new_recursive.saved_max * sizeof(int)); |
| 1142 |
new_recursive.save_start = mstart; |
new_recursive.save_start = mstart; |
| 1143 |
|
new_recursive.offset_top = offset_top; |
| 1144 |
mstart = eptr; |
mstart = eptr; |
| 1145 |
|
|
| 1146 |
/* OK, now we can do the recursion. For each top-level alternative we |
/* OK, now we can do the recursion. For each top-level alternative we |
| 1339 |
{ |
{ |
| 1340 |
number = GET2(prev, 1+LINK_SIZE); |
number = GET2(prev, 1+LINK_SIZE); |
| 1341 |
offset = number << 1; |
offset = number << 1; |
| 1342 |
|
|
| 1343 |
#ifdef DEBUG |
#ifdef DEBUG |
| 1344 |
printf("end bracket %d", number); |
printf("end bracket %d", number); |
| 1345 |
printf("\n"); |
printf("\n"); |
| 1365 |
mstart = rec->save_start; |
mstart = rec->save_start; |
| 1366 |
memcpy(md->offset_vector, rec->offset_save, |
memcpy(md->offset_vector, rec->offset_save, |
| 1367 |
rec->saved_max * sizeof(int)); |
rec->saved_max * sizeof(int)); |
| 1368 |
|
offset_top = rec->offset_top; |
| 1369 |
ecode = rec->after_call; |
ecode = rec->after_call; |
| 1370 |
ims = original_ims; |
ims = original_ims; |
| 1371 |
break; |
break; |
| 1505 |
|
|
| 1506 |
/* Find out if the previous and current characters are "word" characters. |
/* Find out if the previous and current characters are "word" characters. |
| 1507 |
It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to |
It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to |
| 1508 |
be "non-word" characters. Remember the earliest consulted character for |
be "non-word" characters. Remember the earliest consulted character for |
| 1509 |
partial matching. */ |
partial matching. */ |
| 1510 |
|
|
| 1511 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1515 |
{ |
{ |
| 1516 |
USPTR lastptr = eptr - 1; |
USPTR lastptr = eptr - 1; |
| 1517 |
while((*lastptr & 0xc0) == 0x80) lastptr--; |
while((*lastptr & 0xc0) == 0x80) lastptr--; |
| 1518 |
if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr; |
if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr; |
| 1519 |
GETCHAR(c, lastptr); |
GETCHAR(c, lastptr); |
| 1520 |
prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; |
prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; |
| 1521 |
} |
} |
| 1522 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1523 |
{ |
{ |
| 1524 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1525 |
cur_is_word = FALSE; |
cur_is_word = FALSE; |
| 1526 |
} |
} |
| 1527 |
else |
else |
| 1528 |
{ |
{ |
| 1538 |
{ |
{ |
| 1539 |
if (eptr == md->start_subject) prev_is_word = FALSE; else |
if (eptr == md->start_subject) prev_is_word = FALSE; else |
| 1540 |
{ |
{ |
| 1541 |
if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1; |
if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1; |
| 1542 |
prev_is_word = ((md->ctypes[eptr[-1]] & ctype_word) != 0); |
prev_is_word = ((md->ctypes[eptr[-1]] & ctype_word) != 0); |
| 1543 |
} |
} |
| 1544 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1545 |
{ |
{ |
| 1546 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1547 |
cur_is_word = FALSE; |
cur_is_word = FALSE; |
| 1548 |
} |
} |
| 1549 |
else cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0); |
else cur_is_word = ((md->ctypes[*eptr] & ctype_word) != 0); |
| 1550 |
} |
} |
| 1564 |
/* Fall through */ |
/* Fall through */ |
| 1565 |
|
|
| 1566 |
case OP_ALLANY: |
case OP_ALLANY: |
| 1567 |
if (eptr++ >= md->end_subject) |
if (eptr++ >= md->end_subject) |
| 1568 |
{ |
{ |
| 1569 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1570 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1571 |
} |
} |
| 1572 |
if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 1573 |
ecode++; |
ecode++; |
| 1574 |
break; |
break; |
| 1577 |
any byte, even newline, independent of the setting of PCRE_DOTALL. */ |
any byte, even newline, independent of the setting of PCRE_DOTALL. */ |
| 1578 |
|
|
| 1579 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 1580 |
if (eptr++ >= md->end_subject) |
if (eptr++ >= md->end_subject) |
| 1581 |
{ |
{ |
| 1582 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1583 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1584 |
} |
} |
| 1585 |
ecode++; |
ecode++; |
| 1586 |
break; |
break; |
| 1587 |
|
|
| 1588 |
case OP_NOT_DIGIT: |
case OP_NOT_DIGIT: |
| 1589 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1590 |
{ |
{ |
| 1591 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1592 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1593 |
} |
} |
| 1594 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1595 |
if ( |
if ( |
| 1596 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1603 |
break; |
break; |
| 1604 |
|
|
| 1605 |
case OP_DIGIT: |
case OP_DIGIT: |
| 1606 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1607 |
{ |
{ |
| 1608 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1609 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1610 |
} |
} |
| 1611 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1612 |
if ( |
if ( |
| 1613 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1620 |
break; |
break; |
| 1621 |
|
|
| 1622 |
case OP_NOT_WHITESPACE: |
case OP_NOT_WHITESPACE: |
| 1623 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1624 |
{ |
{ |
| 1625 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1626 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1627 |
} |
} |
| 1628 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1629 |
if ( |
if ( |
| 1630 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1637 |
break; |
break; |
| 1638 |
|
|
| 1639 |
case OP_WHITESPACE: |
case OP_WHITESPACE: |
| 1640 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1641 |
{ |
{ |
| 1642 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1643 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1644 |
} |
} |
| 1645 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1646 |
if ( |
if ( |
| 1647 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1654 |
break; |
break; |
| 1655 |
|
|
| 1656 |
case OP_NOT_WORDCHAR: |
case OP_NOT_WORDCHAR: |
| 1657 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1658 |
{ |
{ |
| 1659 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1660 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1661 |
} |
} |
| 1662 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1663 |
if ( |
if ( |
| 1664 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1671 |
break; |
break; |
| 1672 |
|
|
| 1673 |
case OP_WORDCHAR: |
case OP_WORDCHAR: |
| 1674 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1675 |
{ |
{ |
| 1676 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1677 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1678 |
} |
} |
| 1679 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1680 |
if ( |
if ( |
| 1681 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 1688 |
break; |
break; |
| 1689 |
|
|
| 1690 |
case OP_ANYNL: |
case OP_ANYNL: |
| 1691 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1692 |
{ |
{ |
| 1693 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1694 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1695 |
} |
} |
| 1696 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1697 |
switch(c) |
switch(c) |
| 1698 |
{ |
{ |
| 1716 |
break; |
break; |
| 1717 |
|
|
| 1718 |
case OP_NOT_HSPACE: |
case OP_NOT_HSPACE: |
| 1719 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1720 |
{ |
{ |
| 1721 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1722 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1723 |
} |
} |
| 1724 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1725 |
switch(c) |
switch(c) |
| 1726 |
{ |
{ |
| 1750 |
break; |
break; |
| 1751 |
|
|
| 1752 |
case OP_HSPACE: |
case OP_HSPACE: |
| 1753 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1754 |
{ |
{ |
| 1755 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1756 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1757 |
} |
} |
| 1758 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1759 |
switch(c) |
switch(c) |
| 1760 |
{ |
{ |
| 1784 |
break; |
break; |
| 1785 |
|
|
| 1786 |
case OP_NOT_VSPACE: |
case OP_NOT_VSPACE: |
| 1787 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1788 |
{ |
{ |
| 1789 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1790 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1791 |
} |
} |
| 1792 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1793 |
switch(c) |
switch(c) |
| 1794 |
{ |
{ |
| 1806 |
break; |
break; |
| 1807 |
|
|
| 1808 |
case OP_VSPACE: |
case OP_VSPACE: |
| 1809 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1810 |
{ |
{ |
| 1811 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1812 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1813 |
} |
} |
| 1814 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1815 |
switch(c) |
switch(c) |
| 1816 |
{ |
{ |
| 1833 |
|
|
| 1834 |
case OP_PROP: |
case OP_PROP: |
| 1835 |
case OP_NOTPROP: |
case OP_NOTPROP: |
| 1836 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1837 |
{ |
{ |
| 1838 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1839 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1840 |
} |
} |
| 1841 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1842 |
{ |
{ |
| 1843 |
const ucd_record *prop = GET_UCD(c); |
const ucd_record *prop = GET_UCD(c); |
| 1882 |
is in the binary; otherwise a compile-time error occurs. */ |
is in the binary; otherwise a compile-time error occurs. */ |
| 1883 |
|
|
| 1884 |
case OP_EXTUNI: |
case OP_EXTUNI: |
| 1885 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 1886 |
{ |
{ |
| 1887 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 1888 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1889 |
} |
} |
| 1890 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 1891 |
{ |
{ |
| 1892 |
int category = UCD_CATEGORY(c); |
int category = UCD_CATEGORY(c); |
| 1966 |
break; |
break; |
| 1967 |
|
|
| 1968 |
default: /* No repeat follows */ |
default: /* No repeat follows */ |
| 1969 |
if (!match_ref(offset, eptr, length, md, ims)) |
if (!match_ref(offset, eptr, length, md, ims)) |
| 1970 |
{ |
{ |
| 1971 |
CHECK_PARTIAL(); |
CHECK_PARTIAL(); |
| 1972 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1973 |
} |
} |
| 1974 |
eptr += length; |
eptr += length; |
| 1975 |
continue; /* With the main loop */ |
continue; /* With the main loop */ |
| 1976 |
} |
} |
| 1977 |
|
|
| 1978 |
/* If the length of the reference is zero, just continue with the |
/* If the length of the reference is zero, just continue with the |
| 1979 |
main loop. */ |
main loop. */ |
| 1980 |
|
|
| 1981 |
if (length == 0) continue; |
if (length == 0) continue; |
| 1982 |
|
|
| 1983 |
/* First, ensure the minimum number of matches are present. We get back |
/* First, ensure the minimum number of matches are present. We get back |
| 2353 |
length = 1; |
length = 1; |
| 2354 |
ecode++; |
ecode++; |
| 2355 |
GETCHARLEN(fc, ecode, length); |
GETCHARLEN(fc, ecode, length); |
| 2356 |
if (length > md->end_subject - eptr) |
if (length > md->end_subject - eptr) |
| 2357 |
{ |
{ |
| 2358 |
CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ |
CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ |
| 2359 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2360 |
} |
} |
| 2361 |
while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); |
while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); |
| 2362 |
} |
} |
| 2363 |
else |
else |
| 2365 |
|
|
| 2366 |
/* Non-UTF-8 mode */ |
/* Non-UTF-8 mode */ |
| 2367 |
{ |
{ |
| 2368 |
if (md->end_subject - eptr < 1) |
if (md->end_subject - eptr < 1) |
| 2369 |
{ |
{ |
| 2370 |
SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ |
SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ |
| 2371 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2372 |
} |
} |
| 2373 |
if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); |
if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); |
| 2374 |
ecode += 2; |
ecode += 2; |
| 2375 |
} |
} |
| 2385 |
ecode++; |
ecode++; |
| 2386 |
GETCHARLEN(fc, ecode, length); |
GETCHARLEN(fc, ecode, length); |
| 2387 |
|
|
| 2388 |
if (length > md->end_subject - eptr) |
if (length > md->end_subject - eptr) |
| 2389 |
{ |
{ |
| 2390 |
CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ |
CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ |
| 2391 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2392 |
} |
} |
| 2393 |
|
|
| 2394 |
/* 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 |
| 2395 |
can use the fast lookup table. */ |
can use the fast lookup table. */ |
| 2424 |
|
|
| 2425 |
/* Non-UTF-8 mode */ |
/* Non-UTF-8 mode */ |
| 2426 |
{ |
{ |
| 2427 |
if (md->end_subject - eptr < 1) |
if (md->end_subject - eptr < 1) |
| 2428 |
{ |
{ |
| 2429 |
SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ |
SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ |
| 2430 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2431 |
} |
} |
| 2432 |
if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
| 2433 |
ecode += 2; |
ecode += 2; |
| 2434 |
} |
} |
| 2482 |
case OP_MINQUERY: |
case OP_MINQUERY: |
| 2483 |
c = *ecode++ - OP_STAR; |
c = *ecode++ - OP_STAR; |
| 2484 |
minimize = (c & 1) != 0; |
minimize = (c & 1) != 0; |
| 2485 |
|
|
| 2486 |
min = rep_min[c]; /* Pick up values from tables; */ |
min = rep_min[c]; /* Pick up values from tables; */ |
| 2487 |
max = rep_max[c]; /* zero for max => infinity */ |
max = rep_max[c]; /* zero for max => infinity */ |
| 2488 |
if (max == 0) max = INT_MAX; |
if (max == 0) max = INT_MAX; |
| 2595 |
/* When not in UTF-8 mode, load a single-byte character. */ |
/* When not in UTF-8 mode, load a single-byte character. */ |
| 2596 |
|
|
| 2597 |
fc = *ecode++; |
fc = *ecode++; |
| 2598 |
|
|
| 2599 |
/* The value of fc at this point is always less than 256, though we may or |
/* The value of fc at this point is always less than 256, though we may or |
| 2600 |
may not be in UTF-8 mode. The code is duplicated for the caseless and |
may not be in UTF-8 mode. The code is duplicated for the caseless and |
| 2601 |
caseful cases, for speed, since matching characters is likely to be quite |
caseful cases, for speed, since matching characters is likely to be quite |
| 2672 |
} |
} |
| 2673 |
if (fc != *eptr++) RRETURN(MATCH_NOMATCH); |
if (fc != *eptr++) RRETURN(MATCH_NOMATCH); |
| 2674 |
} |
} |
| 2675 |
|
|
| 2676 |
if (min == max) continue; |
if (min == max) continue; |
| 2677 |
|
|
| 2678 |
if (minimize) |
if (minimize) |
| 2679 |
{ |
{ |
| 2680 |
for (fi = min;; fi++) |
for (fi = min;; fi++) |
| 2700 |
eptr++; |
eptr++; |
| 2701 |
} |
} |
| 2702 |
if (possessive) continue; |
if (possessive) continue; |
| 2703 |
|
|
| 2704 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2705 |
{ |
{ |
| 2706 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27); |
| 2716 |
checking can be multibyte. */ |
checking can be multibyte. */ |
| 2717 |
|
|
| 2718 |
case OP_NOT: |
case OP_NOT: |
| 2719 |
if (eptr >= md->end_subject) |
if (eptr >= md->end_subject) |
| 2720 |
{ |
{ |
| 2721 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 2722 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2723 |
} |
} |
| 2724 |
ecode++; |
ecode++; |
| 2725 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 2726 |
if ((ims & PCRE_CASELESS) != 0) |
if ((ims & PCRE_CASELESS) != 0) |
| 3566 |
break; |
break; |
| 3567 |
|
|
| 3568 |
case OP_ALLANY: |
case OP_ALLANY: |
| 3569 |
if (eptr > md->end_subject - min) |
if (eptr > md->end_subject - min) |
| 3570 |
{ |
{ |
| 3571 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 3572 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3573 |
} |
} |
| 3574 |
eptr += min; |
eptr += min; |
| 3575 |
break; |
break; |
| 3576 |
|
|
| 3577 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3578 |
if (eptr > md->end_subject - min) |
if (eptr > md->end_subject - min) |
| 3579 |
{ |
{ |
| 3580 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 3581 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3582 |
} |
} |
| 3583 |
eptr += min; |
eptr += min; |
| 3584 |
break; |
break; |
| 3585 |
|
|
| 4956 |
md->notbol = (options & PCRE_NOTBOL) != 0; |
md->notbol = (options & PCRE_NOTBOL) != 0; |
| 4957 |
md->noteol = (options & PCRE_NOTEOL) != 0; |
md->noteol = (options & PCRE_NOTEOL) != 0; |
| 4958 |
md->notempty = (options & PCRE_NOTEMPTY) != 0; |
md->notempty = (options & PCRE_NOTEMPTY) != 0; |
| 4959 |
|
md->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; |
| 4960 |
md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 : |
md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 : |
| 4961 |
((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0; |
((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0; |
| 4962 |
md->hitend = FALSE; |
md->hitend = FALSE; |
| 5320 |
first starting point for which a partial match was found. */ |
first starting point for which a partial match was found. */ |
| 5321 |
|
|
| 5322 |
md->start_match_ptr = start_match; |
md->start_match_ptr = start_match; |
| 5323 |
md->start_used_ptr = start_match; |
md->start_used_ptr = start_match; |
| 5324 |
md->match_call_count = 0; |
md->match_call_count = 0; |
| 5325 |
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); |
| 5326 |
if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; |
if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; |
| 5353 |
rc = MATCH_NOMATCH; |
rc = MATCH_NOMATCH; |
| 5354 |
goto ENDLOOP; |
goto ENDLOOP; |
| 5355 |
|
|
| 5356 |
/* Any other return is some kind of error. */ |
/* Any other return is either a match, or some kind of error. */ |
| 5357 |
|
|
| 5358 |
default: |
default: |
| 5359 |
goto ENDLOOP; |
goto ENDLOOP; |
| 5435 |
too many to fit into the vector. */ |
too many to fit into the vector. */ |
| 5436 |
|
|
| 5437 |
rc = md->offset_overflow? 0 : md->end_offset_top/2; |
rc = md->offset_overflow? 0 : md->end_offset_top/2; |
| 5438 |
|
|
| 5439 |
/* If there is space, set up the whole thing as substring 0. The value of |
/* If there is space, set up the whole thing as substring 0. The value of |
| 5440 |
md->start_match_ptr might be modified if \K was encountered on the success |
md->start_match_ptr might be modified if \K was encountered on the success |
| 5441 |
matching path. */ |
matching path. */ |