| 398 |
|
|
| 399 |
/* This function is called recursively in many circumstances. Whenever it |
/* This function is called recursively in many circumstances. Whenever it |
| 400 |
returns a negative (error) response, the outer incarnation must also return the |
returns a negative (error) response, the outer incarnation must also return the |
| 401 |
same response. |
same response. */ |
| 402 |
|
|
| 403 |
Performance note: It might be tempting to extract commonly used fields from the |
/* These macros pack up tests that are used for partial matching, and which |
| 404 |
md structure (e.g. utf8, end_subject) into individual variables to improve |
appears several times in the code. We set the "hit end" flag if the pointer is |
| 405 |
|
at the end of the subject and also past the start of the subject (i.e. |
| 406 |
|
something has been matched). The second one is used when we already know we are |
| 407 |
|
past the end of the subject. */ |
| 408 |
|
|
| 409 |
|
#define CHECK_PARTIAL()\ |
| 410 |
|
if (md->partial && eptr >= md->end_subject && eptr > mstart)\ |
| 411 |
|
md->hitend = TRUE |
| 412 |
|
|
| 413 |
|
#define SCHECK_PARTIAL()\ |
| 414 |
|
if (md->partial && eptr > mstart) md->hitend = TRUE |
| 415 |
|
|
| 416 |
|
/* Performance note: It might be tempting to extract commonly used fields from |
| 417 |
|
the md structure (e.g. utf8, end_subject) into individual variables to improve |
| 418 |
performance. Tests using gcc on a SPARC disproved this; in the first case, it |
performance. Tests using gcc on a SPARC disproved this; in the first case, it |
| 419 |
made performance worse. |
made performance worse. |
| 420 |
|
|
| 656 |
op = *ecode; |
op = *ecode; |
| 657 |
|
|
| 658 |
/* For partial matching, remember if we ever hit the end of the subject after |
/* For partial matching, remember if we ever hit the end of the subject after |
| 659 |
matching at least one subject character. */ |
matching at least one subject character. This code is now wrapped in a macro |
| 660 |
|
because it appears several times below. */ |
| 661 |
|
|
| 662 |
if (md->partial && |
CHECK_PARTIAL(); |
|
eptr >= md->end_subject && |
|
|
eptr > mstart) |
|
|
md->hitend = TRUE; |
|
| 663 |
|
|
| 664 |
switch(op) |
switch(op) |
| 665 |
{ |
{ |
| 1868 |
|
|
| 1869 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 1870 |
{ |
{ |
| 1871 |
if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); |
if (!match_ref(offset, eptr, length, md, ims)) |
| 1872 |
|
{ |
| 1873 |
|
CHECK_PARTIAL(); |
| 1874 |
|
RRETURN(MATCH_NOMATCH); |
| 1875 |
|
} |
| 1876 |
eptr += length; |
eptr += length; |
| 1877 |
} |
} |
| 1878 |
|
|
| 1890 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14); |
| 1891 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 1892 |
if (fi >= max || !match_ref(offset, eptr, length, md, ims)) |
if (fi >= max || !match_ref(offset, eptr, length, md, ims)) |
| 1893 |
|
{ |
| 1894 |
|
CHECK_PARTIAL(); |
| 1895 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 1896 |
|
} |
| 1897 |
eptr += length; |
eptr += length; |
| 1898 |
} |
} |
| 1899 |
/* Control never gets here */ |
/* Control never gets here */ |
| 1909 |
if (!match_ref(offset, eptr, length, md, ims)) break; |
if (!match_ref(offset, eptr, length, md, ims)) break; |
| 1910 |
eptr += length; |
eptr += length; |
| 1911 |
} |
} |
| 1912 |
|
CHECK_PARTIAL(); |
| 1913 |
while (eptr >= pp) |
while (eptr >= pp) |
| 1914 |
{ |
{ |
| 1915 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15); |
| 1977 |
{ |
{ |
| 1978 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 1979 |
{ |
{ |
| 1980 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 1981 |
|
{ |
| 1982 |
|
CHECK_PARTIAL(); |
| 1983 |
|
RRETURN(MATCH_NOMATCH); |
| 1984 |
|
} |
| 1985 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 1986 |
if (c > 255) |
if (c > 255) |
| 1987 |
{ |
{ |
| 1999 |
{ |
{ |
| 2000 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2001 |
{ |
{ |
| 2002 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 2003 |
|
{ |
| 2004 |
|
CHECK_PARTIAL(); |
| 2005 |
|
RRETURN(MATCH_NOMATCH); |
| 2006 |
|
} |
| 2007 |
c = *eptr++; |
c = *eptr++; |
| 2008 |
if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); |
if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); |
| 2009 |
} |
} |
| 2027 |
{ |
{ |
| 2028 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16); |
| 2029 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2030 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2031 |
|
{ |
| 2032 |
|
CHECK_PARTIAL(); |
| 2033 |
|
RRETURN(MATCH_NOMATCH); |
| 2034 |
|
} |
| 2035 |
|
if (eptr >= md->end_subject) |
| 2036 |
|
{ |
| 2037 |
|
SCHECK_PARTIAL(); |
| 2038 |
|
RRETURN(MATCH_NOMATCH); |
| 2039 |
|
} |
| 2040 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 2041 |
if (c > 255) |
if (c > 255) |
| 2042 |
{ |
{ |
| 2056 |
{ |
{ |
| 2057 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17); |
| 2058 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2059 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2060 |
|
{ |
| 2061 |
|
CHECK_PARTIAL(); |
| 2062 |
|
RRETURN(MATCH_NOMATCH); |
| 2063 |
|
} |
| 2064 |
|
if (eptr >= md->end_subject) |
| 2065 |
|
{ |
| 2066 |
|
SCHECK_PARTIAL(); |
| 2067 |
|
RRETURN(MATCH_NOMATCH); |
| 2068 |
|
} |
| 2069 |
c = *eptr++; |
c = *eptr++; |
| 2070 |
if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); |
if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); |
| 2071 |
} |
} |
| 2098 |
} |
} |
| 2099 |
eptr += len; |
eptr += len; |
| 2100 |
} |
} |
| 2101 |
|
CHECK_PARTIAL(); |
| 2102 |
for (;;) |
for (;;) |
| 2103 |
{ |
{ |
| 2104 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18); |
| 2118 |
if ((data[c/8] & (1 << (c&7))) == 0) break; |
if ((data[c/8] & (1 << (c&7))) == 0) break; |
| 2119 |
eptr++; |
eptr++; |
| 2120 |
} |
} |
| 2121 |
|
CHECK_PARTIAL(); |
| 2122 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2123 |
{ |
{ |
| 2124 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19); |
| 2176 |
|
|
| 2177 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2178 |
{ |
{ |
| 2179 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 2180 |
|
{ |
| 2181 |
|
SCHECK_PARTIAL(); |
| 2182 |
|
RRETURN(MATCH_NOMATCH); |
| 2183 |
|
} |
| 2184 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 2185 |
if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); |
if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); |
| 2186 |
} |
} |
| 2199 |
{ |
{ |
| 2200 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20); |
| 2201 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2202 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2203 |
|
{ |
| 2204 |
|
CHECK_PARTIAL(); |
| 2205 |
|
RRETURN(MATCH_NOMATCH); |
| 2206 |
|
} |
| 2207 |
|
if (eptr >= md->end_subject) |
| 2208 |
|
{ |
| 2209 |
|
SCHECK_PARTIAL(); |
| 2210 |
|
RRETURN(MATCH_NOMATCH); |
| 2211 |
|
} |
| 2212 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 2213 |
if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); |
if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); |
| 2214 |
} |
} |
| 2228 |
if (!_pcre_xclass(c, data)) break; |
if (!_pcre_xclass(c, data)) break; |
| 2229 |
eptr += len; |
eptr += len; |
| 2230 |
} |
} |
| 2231 |
|
CHECK_PARTIAL(); |
| 2232 |
for(;;) |
for(;;) |
| 2233 |
{ |
{ |
| 2234 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21); |
| 2369 |
max = rep_max[c]; /* zero for max => infinity */ |
max = rep_max[c]; /* zero for max => infinity */ |
| 2370 |
if (max == 0) max = INT_MAX; |
if (max == 0) max = INT_MAX; |
| 2371 |
|
|
| 2372 |
/* Common code for all repeated single-character matches. We can give |
/* Common code for all repeated single-character matches. */ |
|
up quickly if there are fewer than the minimum number of characters left in |
|
|
the subject. */ |
|
| 2373 |
|
|
| 2374 |
REPEATCHAR: |
REPEATCHAR: |
| 2375 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF8 |
| 2378 |
length = 1; |
length = 1; |
| 2379 |
charptr = ecode; |
charptr = ecode; |
| 2380 |
GETCHARLEN(fc, ecode, length); |
GETCHARLEN(fc, ecode, length); |
|
if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); |
|
| 2381 |
ecode += length; |
ecode += length; |
| 2382 |
|
|
| 2383 |
/* Handle multibyte character matching specially here. There is |
/* Handle multibyte character matching specially here. There is |
| 2395 |
|
|
| 2396 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2397 |
{ |
{ |
| 2398 |
if (memcmp(eptr, charptr, length) == 0) eptr += length; |
if (eptr <= md->end_subject - length && |
| 2399 |
|
memcmp(eptr, charptr, length) == 0) eptr += length; |
| 2400 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 2401 |
/* Need braces because of following else */ |
else if (oclength > 0 && |
| 2402 |
else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } |
eptr <= md->end_subject - oclength && |
| 2403 |
|
memcmp(eptr, occhars, oclength) == 0) eptr += oclength; |
| 2404 |
|
#endif /* SUPPORT_UCP */ |
| 2405 |
else |
else |
| 2406 |
{ |
{ |
| 2407 |
if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); |
CHECK_PARTIAL(); |
| 2408 |
eptr += oclength; |
RRETURN(MATCH_NOMATCH); |
| 2409 |
} |
} |
|
#else /* without SUPPORT_UCP */ |
|
|
else { RRETURN(MATCH_NOMATCH); } |
|
|
#endif /* SUPPORT_UCP */ |
|
| 2410 |
} |
} |
| 2411 |
|
|
| 2412 |
if (min == max) continue; |
if (min == max) continue; |
| 2417 |
{ |
{ |
| 2418 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22); |
| 2419 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2420 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2421 |
if (memcmp(eptr, charptr, length) == 0) eptr += length; |
{ |
| 2422 |
|
CHECK_PARTIAL(); |
| 2423 |
|
RRETURN(MATCH_NOMATCH); |
| 2424 |
|
} |
| 2425 |
|
if (eptr <= md->end_subject - length && |
| 2426 |
|
memcmp(eptr, charptr, length) == 0) eptr += length; |
| 2427 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 2428 |
/* Need braces because of following else */ |
else if (oclength > 0 && |
| 2429 |
else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } |
eptr <= md->end_subject - oclength && |
| 2430 |
|
memcmp(eptr, occhars, oclength) == 0) eptr += oclength; |
| 2431 |
|
#endif /* SUPPORT_UCP */ |
| 2432 |
else |
else |
| 2433 |
{ |
{ |
| 2434 |
if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); |
CHECK_PARTIAL(); |
| 2435 |
eptr += oclength; |
RRETURN(MATCH_NOMATCH); |
| 2436 |
} |
} |
|
#else /* without SUPPORT_UCP */ |
|
|
else { RRETURN (MATCH_NOMATCH); } |
|
|
#endif /* SUPPORT_UCP */ |
|
| 2437 |
} |
} |
| 2438 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2439 |
} |
} |
| 2443 |
pp = eptr; |
pp = eptr; |
| 2444 |
for (i = min; i < max; i++) |
for (i = min; i < max; i++) |
| 2445 |
{ |
{ |
| 2446 |
if (eptr > md->end_subject - length) break; |
if (eptr <= md->end_subject - length && |
| 2447 |
if (memcmp(eptr, charptr, length) == 0) eptr += length; |
memcmp(eptr, charptr, length) == 0) eptr += length; |
| 2448 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 2449 |
else if (oclength == 0) break; |
else if (oclength > 0 && |
| 2450 |
else |
eptr <= md->end_subject - oclength && |
| 2451 |
{ |
memcmp(eptr, occhars, oclength) == 0) eptr += oclength; |
|
if (memcmp(eptr, occhars, oclength) != 0) break; |
|
|
eptr += oclength; |
|
|
} |
|
|
#else /* without SUPPORT_UCP */ |
|
|
else break; |
|
| 2452 |
#endif /* SUPPORT_UCP */ |
#endif /* SUPPORT_UCP */ |
| 2453 |
|
else break; |
| 2454 |
} |
} |
| 2455 |
|
|
| 2456 |
|
CHECK_PARTIAL(); |
| 2457 |
if (possessive) continue; |
if (possessive) continue; |
| 2458 |
|
|
| 2459 |
for(;;) |
for(;;) |
| 2460 |
{ |
{ |
| 2461 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); |
| 2462 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2463 |
if (eptr == pp) RRETURN(MATCH_NOMATCH); |
if (eptr == pp) { RRETURN(MATCH_NOMATCH); } |
| 2464 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 2465 |
eptr--; |
eptr--; |
| 2466 |
BACKCHAR(eptr); |
BACKCHAR(eptr); |
| 2467 |
#else /* without SUPPORT_UCP */ |
#else /* without SUPPORT_UCP */ |
| 2468 |
eptr -= length; |
eptr -= length; |
| 2469 |
#endif /* SUPPORT_UCP */ |
#endif /* SUPPORT_UCP */ |
| 2470 |
} |
} |
| 2471 |
} |
} |
| 2472 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2473 |
} |
} |
| 2480 |
#endif /* SUPPORT_UTF8 */ |
#endif /* SUPPORT_UTF8 */ |
| 2481 |
|
|
| 2482 |
/* When not in UTF-8 mode, load a single-byte character. */ |
/* When not in UTF-8 mode, load a single-byte character. */ |
| 2483 |
{ |
|
| 2484 |
if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); |
fc = *ecode++; |
|
fc = *ecode++; |
|
|
} |
|
| 2485 |
|
|
| 2486 |
/* 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 |
| 2487 |
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 |
| 2499 |
{ |
{ |
| 2500 |
fc = md->lcc[fc]; |
fc = md->lcc[fc]; |
| 2501 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2502 |
|
{ |
| 2503 |
|
if (eptr >= md->end_subject) |
| 2504 |
|
{ |
| 2505 |
|
SCHECK_PARTIAL(); |
| 2506 |
|
RRETURN(MATCH_NOMATCH); |
| 2507 |
|
} |
| 2508 |
if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
| 2509 |
|
} |
| 2510 |
if (min == max) continue; |
if (min == max) continue; |
| 2511 |
if (minimize) |
if (minimize) |
| 2512 |
{ |
{ |
| 2514 |
{ |
{ |
| 2515 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24); |
| 2516 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2517 |
if (fi >= max || eptr >= md->end_subject || |
if (fi >= max) |
| 2518 |
fc != md->lcc[*eptr++]) |
{ |
| 2519 |
|
CHECK_PARTIAL(); |
| 2520 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2521 |
|
} |
| 2522 |
|
if (eptr >= md->end_subject) |
| 2523 |
|
{ |
| 2524 |
|
SCHECK_PARTIAL(); |
| 2525 |
|
RRETURN(MATCH_NOMATCH); |
| 2526 |
|
} |
| 2527 |
|
if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
| 2528 |
} |
} |
| 2529 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2530 |
} |
} |
| 2536 |
if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; |
if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; |
| 2537 |
eptr++; |
eptr++; |
| 2538 |
} |
} |
| 2539 |
|
|
| 2540 |
|
CHECK_PARTIAL(); |
| 2541 |
if (possessive) continue; |
if (possessive) continue; |
| 2542 |
|
|
| 2543 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2544 |
{ |
{ |
| 2545 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25); |
| 2555 |
|
|
| 2556 |
else |
else |
| 2557 |
{ |
{ |
| 2558 |
for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); |
for (i = 1; i <= min; i++) |
| 2559 |
|
{ |
| 2560 |
|
if (eptr >= md->end_subject) |
| 2561 |
|
{ |
| 2562 |
|
SCHECK_PARTIAL(); |
| 2563 |
|
RRETURN(MATCH_NOMATCH); |
| 2564 |
|
} |
| 2565 |
|
if (fc != *eptr++) RRETURN(MATCH_NOMATCH); |
| 2566 |
|
} |
| 2567 |
if (min == max) continue; |
if (min == max) continue; |
| 2568 |
if (minimize) |
if (minimize) |
| 2569 |
{ |
{ |
| 2571 |
{ |
{ |
| 2572 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26); |
| 2573 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2574 |
if (fi >= max || eptr >= md->end_subject || fc != *eptr++) |
if (fi >= max) |
| 2575 |
|
{ |
| 2576 |
|
CHECK_PARTIAL(); |
| 2577 |
|
RRETURN(MATCH_NOMATCH); |
| 2578 |
|
} |
| 2579 |
|
if (eptr >= md->end_subject) |
| 2580 |
|
{ |
| 2581 |
|
SCHECK_PARTIAL(); |
| 2582 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2583 |
|
} |
| 2584 |
|
if (fc != *eptr++) RRETURN(MATCH_NOMATCH); |
| 2585 |
} |
} |
| 2586 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2587 |
} |
} |
| 2593 |
if (eptr >= md->end_subject || fc != *eptr) break; |
if (eptr >= md->end_subject || fc != *eptr) break; |
| 2594 |
eptr++; |
eptr++; |
| 2595 |
} |
} |
| 2596 |
|
CHECK_PARTIAL(); |
| 2597 |
if (possessive) continue; |
if (possessive) continue; |
| 2598 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2599 |
{ |
{ |
| 2687 |
max = rep_max[c]; /* zero for max => infinity */ |
max = rep_max[c]; /* zero for max => infinity */ |
| 2688 |
if (max == 0) max = INT_MAX; |
if (max == 0) max = INT_MAX; |
| 2689 |
|
|
| 2690 |
/* Common code for all repeated single-byte matches. We can give up quickly |
/* Common code for all repeated single-byte matches. */ |
|
if there are fewer than the minimum number of bytes left in the |
|
|
subject. */ |
|
| 2691 |
|
|
| 2692 |
REPEATNOTCHAR: |
REPEATNOTCHAR: |
|
if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); |
|
| 2693 |
fc = *ecode++; |
fc = *ecode++; |
| 2694 |
|
|
| 2695 |
/* The code is duplicated for the caseless and caseful cases, for speed, |
/* The code is duplicated for the caseless and caseful cases, for speed, |
| 2714 |
register unsigned int d; |
register unsigned int d; |
| 2715 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2716 |
{ |
{ |
| 2717 |
|
if (eptr >= md->end_subject) |
| 2718 |
|
{ |
| 2719 |
|
SCHECK_PARTIAL(); |
| 2720 |
|
RRETURN(MATCH_NOMATCH); |
| 2721 |
|
} |
| 2722 |
GETCHARINC(d, eptr); |
GETCHARINC(d, eptr); |
| 2723 |
if (d < 256) d = md->lcc[d]; |
if (d < 256) d = md->lcc[d]; |
| 2724 |
if (fc == d) RRETURN(MATCH_NOMATCH); |
if (fc == d) RRETURN(MATCH_NOMATCH); |
| 2730 |
/* Not UTF-8 mode */ |
/* Not UTF-8 mode */ |
| 2731 |
{ |
{ |
| 2732 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2733 |
|
{ |
| 2734 |
|
if (eptr >= md->end_subject) |
| 2735 |
|
{ |
| 2736 |
|
SCHECK_PARTIAL(); |
| 2737 |
|
RRETURN(MATCH_NOMATCH); |
| 2738 |
|
} |
| 2739 |
if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
| 2740 |
|
} |
| 2741 |
} |
} |
| 2742 |
|
|
| 2743 |
if (min == max) continue; |
if (min == max) continue; |
| 2753 |
{ |
{ |
| 2754 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28); |
| 2755 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2756 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2757 |
|
{ |
| 2758 |
|
CHECK_PARTIAL(); |
| 2759 |
|
RRETURN(MATCH_NOMATCH); |
| 2760 |
|
} |
| 2761 |
|
if (eptr >= md->end_subject) |
| 2762 |
|
{ |
| 2763 |
|
SCHECK_PARTIAL(); |
| 2764 |
|
RRETURN(MATCH_NOMATCH); |
| 2765 |
|
} |
| 2766 |
GETCHARINC(d, eptr); |
GETCHARINC(d, eptr); |
| 2767 |
if (d < 256) d = md->lcc[d]; |
if (d < 256) d = md->lcc[d]; |
| 2768 |
if (fc == d) RRETURN(MATCH_NOMATCH); |
if (fc == d) RRETURN(MATCH_NOMATCH); |
|
|
|
| 2769 |
} |
} |
| 2770 |
} |
} |
| 2771 |
else |
else |
| 2776 |
{ |
{ |
| 2777 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29); |
| 2778 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2779 |
if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) |
if (fi >= max) |
| 2780 |
|
{ |
| 2781 |
|
CHECK_PARTIAL(); |
| 2782 |
|
RRETURN(MATCH_NOMATCH); |
| 2783 |
|
} |
| 2784 |
|
if (eptr >= md->end_subject) |
| 2785 |
|
{ |
| 2786 |
|
SCHECK_PARTIAL(); |
| 2787 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2788 |
|
} |
| 2789 |
|
if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); |
| 2790 |
} |
} |
| 2791 |
} |
} |
| 2792 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2812 |
if (fc == d) break; |
if (fc == d) break; |
| 2813 |
eptr += len; |
eptr += len; |
| 2814 |
} |
} |
| 2815 |
|
CHECK_PARTIAL(); |
| 2816 |
if (possessive) continue; |
if (possessive) continue; |
| 2817 |
for(;;) |
for(;;) |
| 2818 |
{ |
{ |
| 2831 |
if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; |
if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; |
| 2832 |
eptr++; |
eptr++; |
| 2833 |
} |
} |
| 2834 |
|
CHECK_PARTIAL(); |
| 2835 |
if (possessive) continue; |
if (possessive) continue; |
| 2836 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2837 |
{ |
{ |
| 2857 |
register unsigned int d; |
register unsigned int d; |
| 2858 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2859 |
{ |
{ |
| 2860 |
|
if (eptr >= md->end_subject) |
| 2861 |
|
{ |
| 2862 |
|
SCHECK_PARTIAL(); |
| 2863 |
|
RRETURN(MATCH_NOMATCH); |
| 2864 |
|
} |
| 2865 |
GETCHARINC(d, eptr); |
GETCHARINC(d, eptr); |
| 2866 |
if (fc == d) RRETURN(MATCH_NOMATCH); |
if (fc == d) RRETURN(MATCH_NOMATCH); |
| 2867 |
} |
} |
| 2871 |
/* Not UTF-8 mode */ |
/* Not UTF-8 mode */ |
| 2872 |
{ |
{ |
| 2873 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 2874 |
|
{ |
| 2875 |
|
if (eptr >= md->end_subject) |
| 2876 |
|
{ |
| 2877 |
|
SCHECK_PARTIAL(); |
| 2878 |
|
RRETURN(MATCH_NOMATCH); |
| 2879 |
|
} |
| 2880 |
if (fc == *eptr++) RRETURN(MATCH_NOMATCH); |
if (fc == *eptr++) RRETURN(MATCH_NOMATCH); |
| 2881 |
|
} |
| 2882 |
} |
} |
| 2883 |
|
|
| 2884 |
if (min == max) continue; |
if (min == max) continue; |
| 2894 |
{ |
{ |
| 2895 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32); |
| 2896 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2897 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 2898 |
|
{ |
| 2899 |
|
CHECK_PARTIAL(); |
| 2900 |
|
RRETURN(MATCH_NOMATCH); |
| 2901 |
|
} |
| 2902 |
|
if (eptr >= md->end_subject) |
| 2903 |
|
{ |
| 2904 |
|
SCHECK_PARTIAL(); |
| 2905 |
|
RRETURN(MATCH_NOMATCH); |
| 2906 |
|
} |
| 2907 |
GETCHARINC(d, eptr); |
GETCHARINC(d, eptr); |
| 2908 |
if (fc == d) RRETURN(MATCH_NOMATCH); |
if (fc == d) RRETURN(MATCH_NOMATCH); |
| 2909 |
} |
} |
| 2916 |
{ |
{ |
| 2917 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33); |
| 2918 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 2919 |
if (fi >= max || eptr >= md->end_subject || fc == *eptr++) |
if (fi >= max) |
| 2920 |
|
{ |
| 2921 |
|
CHECK_PARTIAL(); |
| 2922 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 2923 |
|
} |
| 2924 |
|
if (eptr >= md->end_subject) |
| 2925 |
|
{ |
| 2926 |
|
SCHECK_PARTIAL(); |
| 2927 |
|
RRETURN(MATCH_NOMATCH); |
| 2928 |
|
} |
| 2929 |
|
if (fc == *eptr++) RRETURN(MATCH_NOMATCH); |
| 2930 |
} |
} |
| 2931 |
} |
} |
| 2932 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2951 |
if (fc == d) break; |
if (fc == d) break; |
| 2952 |
eptr += len; |
eptr += len; |
| 2953 |
} |
} |
| 2954 |
|
CHECK_PARTIAL(); |
| 2955 |
if (possessive) continue; |
if (possessive) continue; |
| 2956 |
for(;;) |
for(;;) |
| 2957 |
{ |
{ |
| 2970 |
if (eptr >= md->end_subject || fc == *eptr) break; |
if (eptr >= md->end_subject || fc == *eptr) break; |
| 2971 |
eptr++; |
eptr++; |
| 2972 |
} |
} |
| 2973 |
|
CHECK_PARTIAL(); |
| 2974 |
if (possessive) continue; |
if (possessive) continue; |
| 2975 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2976 |
{ |
{ |
| 3062 |
|
|
| 3063 |
/* First, ensure the minimum number of matches are present. Use inline |
/* First, ensure the minimum number of matches are present. Use inline |
| 3064 |
code for maximizing the speed, and do the type test once at the start |
code for maximizing the speed, and do the type test once at the start |
| 3065 |
(i.e. keep it out of the loop). Also we can test that there are at least |
(i.e. keep it out of the loop). Separate the UTF-8 code completely as that |
|
the minimum number of bytes before we start. This isn't as effective in |
|
|
UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that |
|
| 3066 |
is tidier. Also separate the UCP code, which can be the same for both UTF-8 |
is tidier. Also separate the UCP code, which can be the same for both UTF-8 |
| 3067 |
and single-bytes. */ |
and single-bytes. */ |
| 3068 |
|
|
|
if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); |
|
| 3069 |
if (min > 0) |
if (min > 0) |
| 3070 |
{ |
{ |
| 3071 |
#ifdef SUPPORT_UCP |
#ifdef SUPPORT_UCP |
| 3077 |
if (prop_fail_result) RRETURN(MATCH_NOMATCH); |
if (prop_fail_result) RRETURN(MATCH_NOMATCH); |
| 3078 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3079 |
{ |
{ |
| 3080 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3081 |
|
{ |
| 3082 |
|
SCHECK_PARTIAL(); |
| 3083 |
|
RRETURN(MATCH_NOMATCH); |
| 3084 |
|
} |
| 3085 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3086 |
} |
} |
| 3087 |
break; |
break; |
| 3089 |
case PT_LAMP: |
case PT_LAMP: |
| 3090 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3091 |
{ |
{ |
| 3092 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3093 |
|
{ |
| 3094 |
|
SCHECK_PARTIAL(); |
| 3095 |
|
RRETURN(MATCH_NOMATCH); |
| 3096 |
|
} |
| 3097 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3098 |
prop_chartype = UCD_CHARTYPE(c); |
prop_chartype = UCD_CHARTYPE(c); |
| 3099 |
if ((prop_chartype == ucp_Lu || |
if ((prop_chartype == ucp_Lu || |
| 3106 |
case PT_GC: |
case PT_GC: |
| 3107 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3108 |
{ |
{ |
| 3109 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3110 |
|
{ |
| 3111 |
|
SCHECK_PARTIAL(); |
| 3112 |
|
RRETURN(MATCH_NOMATCH); |
| 3113 |
|
} |
| 3114 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3115 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3116 |
if ((prop_category == prop_value) == prop_fail_result) |
if ((prop_category == prop_value) == prop_fail_result) |
| 3121 |
case PT_PC: |
case PT_PC: |
| 3122 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3123 |
{ |
{ |
| 3124 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3125 |
|
{ |
| 3126 |
|
SCHECK_PARTIAL(); |
| 3127 |
|
RRETURN(MATCH_NOMATCH); |
| 3128 |
|
} |
| 3129 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3130 |
prop_chartype = UCD_CHARTYPE(c); |
prop_chartype = UCD_CHARTYPE(c); |
| 3131 |
if ((prop_chartype == prop_value) == prop_fail_result) |
if ((prop_chartype == prop_value) == prop_fail_result) |
| 3136 |
case PT_SC: |
case PT_SC: |
| 3137 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3138 |
{ |
{ |
| 3139 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3140 |
|
{ |
| 3141 |
|
SCHECK_PARTIAL(); |
| 3142 |
|
RRETURN(MATCH_NOMATCH); |
| 3143 |
|
} |
| 3144 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3145 |
prop_script = UCD_SCRIPT(c); |
prop_script = UCD_SCRIPT(c); |
| 3146 |
if ((prop_script == prop_value) == prop_fail_result) |
if ((prop_script == prop_value) == prop_fail_result) |
| 3160 |
{ |
{ |
| 3161 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3162 |
{ |
{ |
| 3163 |
|
if (eptr >= md->end_subject) |
| 3164 |
|
{ |
| 3165 |
|
SCHECK_PARTIAL(); |
| 3166 |
|
RRETURN(MATCH_NOMATCH); |
| 3167 |
|
} |
| 3168 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3169 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3170 |
if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); |
if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); |
| 3171 |
while (eptr < md->end_subject) |
while (eptr < md->end_subject) |
| 3172 |
{ |
{ |
| 3173 |
int len = 1; |
int len = 1; |
| 3174 |
if (!utf8) c = *eptr; else |
if (!utf8) c = *eptr; |
| 3175 |
{ |
else { GETCHARLEN(c, eptr, len); } |
|
GETCHARLEN(c, eptr, len); |
|
|
} |
|
| 3176 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3177 |
if (prop_category != ucp_M) break; |
if (prop_category != ucp_M) break; |
| 3178 |
eptr += len; |
eptr += len; |
| 3191 |
case OP_ANY: |
case OP_ANY: |
| 3192 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3193 |
{ |
{ |
| 3194 |
if (eptr >= md->end_subject || IS_NEWLINE(eptr)) |
if (eptr >= md->end_subject) |
| 3195 |
|
{ |
| 3196 |
|
SCHECK_PARTIAL(); |
| 3197 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3198 |
|
} |
| 3199 |
|
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); |
| 3200 |
eptr++; |
eptr++; |
| 3201 |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 3202 |
} |
} |
| 3205 |
case OP_ALLANY: |
case OP_ALLANY: |
| 3206 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3207 |
{ |
{ |
| 3208 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3209 |
|
{ |
| 3210 |
|
SCHECK_PARTIAL(); |
| 3211 |
|
RRETURN(MATCH_NOMATCH); |
| 3212 |
|
} |
| 3213 |
eptr++; |
eptr++; |
| 3214 |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; |
| 3215 |
} |
} |
| 3216 |
break; |
break; |
| 3217 |
|
|
| 3218 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3219 |
|
if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); |
| 3220 |
eptr += min; |
eptr += min; |
| 3221 |
break; |
break; |
| 3222 |
|
|
| 3223 |
case OP_ANYNL: |
case OP_ANYNL: |
| 3224 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3225 |
{ |
{ |
| 3226 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3227 |
|
{ |
| 3228 |
|
SCHECK_PARTIAL(); |
| 3229 |
|
RRETURN(MATCH_NOMATCH); |
| 3230 |
|
} |
| 3231 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3232 |
switch(c) |
switch(c) |
| 3233 |
{ |
{ |
| 3253 |
case OP_NOT_HSPACE: |
case OP_NOT_HSPACE: |
| 3254 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3255 |
{ |
{ |
| 3256 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3257 |
|
{ |
| 3258 |
|
SCHECK_PARTIAL(); |
| 3259 |
|
RRETURN(MATCH_NOMATCH); |
| 3260 |
|
} |
| 3261 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3262 |
switch(c) |
switch(c) |
| 3263 |
{ |
{ |
| 3289 |
case OP_HSPACE: |
case OP_HSPACE: |
| 3290 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3291 |
{ |
{ |
| 3292 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3293 |
|
{ |
| 3294 |
|
SCHECK_PARTIAL(); |
| 3295 |
|
RRETURN(MATCH_NOMATCH); |
| 3296 |
|
} |
| 3297 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3298 |
switch(c) |
switch(c) |
| 3299 |
{ |
{ |
| 3325 |
case OP_NOT_VSPACE: |
case OP_NOT_VSPACE: |
| 3326 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3327 |
{ |
{ |
| 3328 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3329 |
|
{ |
| 3330 |
|
SCHECK_PARTIAL(); |
| 3331 |
|
RRETURN(MATCH_NOMATCH); |
| 3332 |
|
} |
| 3333 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3334 |
switch(c) |
switch(c) |
| 3335 |
{ |
{ |
| 3349 |
case OP_VSPACE: |
case OP_VSPACE: |
| 3350 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3351 |
{ |
{ |
| 3352 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3353 |
|
{ |
| 3354 |
|
SCHECK_PARTIAL(); |
| 3355 |
|
RRETURN(MATCH_NOMATCH); |
| 3356 |
|
} |
| 3357 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3358 |
switch(c) |
switch(c) |
| 3359 |
{ |
{ |
| 3373 |
case OP_NOT_DIGIT: |
case OP_NOT_DIGIT: |
| 3374 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3375 |
{ |
{ |
| 3376 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3377 |
|
{ |
| 3378 |
|
SCHECK_PARTIAL(); |
| 3379 |
|
RRETURN(MATCH_NOMATCH); |
| 3380 |
|
} |
| 3381 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3382 |
if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) |
if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) |
| 3383 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3387 |
case OP_DIGIT: |
case OP_DIGIT: |
| 3388 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3389 |
{ |
{ |
| 3390 |
if (eptr >= md->end_subject || |
if (eptr >= md->end_subject) |
| 3391 |
*eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) |
{ |
| 3392 |
|
SCHECK_PARTIAL(); |
| 3393 |
|
RRETURN(MATCH_NOMATCH); |
| 3394 |
|
} |
| 3395 |
|
if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) |
| 3396 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3397 |
/* No need to skip more bytes - we know it's a 1-byte character */ |
/* No need to skip more bytes - we know it's a 1-byte character */ |
| 3398 |
} |
} |
| 3401 |
case OP_NOT_WHITESPACE: |
case OP_NOT_WHITESPACE: |
| 3402 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3403 |
{ |
{ |
| 3404 |
if (eptr >= md->end_subject || |
if (eptr >= md->end_subject) |
| 3405 |
(*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)) |
{ |
| 3406 |
|
SCHECK_PARTIAL(); |
| 3407 |
|
RRETURN(MATCH_NOMATCH); |
| 3408 |
|
} |
| 3409 |
|
if (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0) |
| 3410 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3411 |
while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); |
while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); |
| 3412 |
} |
} |
| 3415 |
case OP_WHITESPACE: |
case OP_WHITESPACE: |
| 3416 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3417 |
{ |
{ |
| 3418 |
if (eptr >= md->end_subject || |
if (eptr >= md->end_subject) |
| 3419 |
*eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) |
{ |
| 3420 |
|
SCHECK_PARTIAL(); |
| 3421 |
|
RRETURN(MATCH_NOMATCH); |
| 3422 |
|
} |
| 3423 |
|
if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) |
| 3424 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3425 |
/* No need to skip more bytes - we know it's a 1-byte character */ |
/* No need to skip more bytes - we know it's a 1-byte character */ |
| 3426 |
} |
} |
| 3439 |
case OP_WORDCHAR: |
case OP_WORDCHAR: |
| 3440 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3441 |
{ |
{ |
| 3442 |
if (eptr >= md->end_subject || |
if (eptr >= md->end_subject) |
| 3443 |
*eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) |
{ |
| 3444 |
|
SCHECK_PARTIAL(); |
| 3445 |
|
RRETURN(MATCH_NOMATCH); |
| 3446 |
|
} |
| 3447 |
|
if (*eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) |
| 3448 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3449 |
/* No need to skip more bytes - we know it's a 1-byte character */ |
/* No need to skip more bytes - we know it's a 1-byte character */ |
| 3450 |
} |
} |
| 3458 |
#endif /* SUPPORT_UTF8 */ |
#endif /* SUPPORT_UTF8 */ |
| 3459 |
|
|
| 3460 |
/* Code for the non-UTF-8 case for minimum matching of operators other |
/* Code for the non-UTF-8 case for minimum matching of operators other |
| 3461 |
than OP_PROP and OP_NOTPROP. We can assume that there are the minimum |
than OP_PROP and OP_NOTPROP. */ |
|
number of bytes present, as this was tested above. */ |
|
| 3462 |
|
|
| 3463 |
switch(ctype) |
switch(ctype) |
| 3464 |
{ |
{ |
| 3465 |
case OP_ANY: |
case OP_ANY: |
| 3466 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3467 |
{ |
{ |
| 3468 |
|
if (eptr >= md->end_subject) |
| 3469 |
|
{ |
| 3470 |
|
SCHECK_PARTIAL(); |
| 3471 |
|
RRETURN(MATCH_NOMATCH); |
| 3472 |
|
} |
| 3473 |
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); |
if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); |
| 3474 |
eptr++; |
eptr++; |
| 3475 |
} |
} |
| 3476 |
break; |
break; |
| 3477 |
|
|
| 3478 |
case OP_ALLANY: |
case OP_ALLANY: |
| 3479 |
|
if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); |
| 3480 |
eptr += min; |
eptr += min; |
| 3481 |
break; |
break; |
| 3482 |
|
|
| 3483 |
case OP_ANYBYTE: |
case OP_ANYBYTE: |
| 3484 |
|
if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); |
| 3485 |
eptr += min; |
eptr += min; |
| 3486 |
break; |
break; |
| 3487 |
|
|
|
/* Because of the CRLF case, we can't assume the minimum number of |
|
|
bytes are present in this case. */ |
|
|
|
|
| 3488 |
case OP_ANYNL: |
case OP_ANYNL: |
| 3489 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3490 |
{ |
{ |
| 3491 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3492 |
|
{ |
| 3493 |
|
SCHECK_PARTIAL(); |
| 3494 |
|
RRETURN(MATCH_NOMATCH); |
| 3495 |
|
} |
| 3496 |
switch(*eptr++) |
switch(*eptr++) |
| 3497 |
{ |
{ |
| 3498 |
default: RRETURN(MATCH_NOMATCH); |
default: RRETURN(MATCH_NOMATCH); |
| 3514 |
case OP_NOT_HSPACE: |
case OP_NOT_HSPACE: |
| 3515 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3516 |
{ |
{ |
| 3517 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3518 |
|
{ |
| 3519 |
|
SCHECK_PARTIAL(); |
| 3520 |
|
RRETURN(MATCH_NOMATCH); |
| 3521 |
|
} |
| 3522 |
switch(*eptr++) |
switch(*eptr++) |
| 3523 |
{ |
{ |
| 3524 |
default: break; |
default: break; |
| 3533 |
case OP_HSPACE: |
case OP_HSPACE: |
| 3534 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3535 |
{ |
{ |
| 3536 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3537 |
|
{ |
| 3538 |
|
SCHECK_PARTIAL(); |
| 3539 |
|
RRETURN(MATCH_NOMATCH); |
| 3540 |
|
} |
| 3541 |
switch(*eptr++) |
switch(*eptr++) |
| 3542 |
{ |
{ |
| 3543 |
default: RRETURN(MATCH_NOMATCH); |
default: RRETURN(MATCH_NOMATCH); |
| 3552 |
case OP_NOT_VSPACE: |
case OP_NOT_VSPACE: |
| 3553 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3554 |
{ |
{ |
| 3555 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3556 |
|
{ |
| 3557 |
|
SCHECK_PARTIAL(); |
| 3558 |
|
RRETURN(MATCH_NOMATCH); |
| 3559 |
|
} |
| 3560 |
switch(*eptr++) |
switch(*eptr++) |
| 3561 |
{ |
{ |
| 3562 |
default: break; |
default: break; |
| 3573 |
case OP_VSPACE: |
case OP_VSPACE: |
| 3574 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3575 |
{ |
{ |
| 3576 |
if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (eptr >= md->end_subject) |
| 3577 |
|
{ |
| 3578 |
|
SCHECK_PARTIAL(); |
| 3579 |
|
RRETURN(MATCH_NOMATCH); |
| 3580 |
|
} |
| 3581 |
switch(*eptr++) |
switch(*eptr++) |
| 3582 |
{ |
{ |
| 3583 |
default: RRETURN(MATCH_NOMATCH); |
default: RRETURN(MATCH_NOMATCH); |
| 3593 |
|
|
| 3594 |
case OP_NOT_DIGIT: |
case OP_NOT_DIGIT: |
| 3595 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3596 |
|
{ |
| 3597 |
|
if (eptr >= md->end_subject) |
| 3598 |
|
{ |
| 3599 |
|
SCHECK_PARTIAL(); |
| 3600 |
|
RRETURN(MATCH_NOMATCH); |
| 3601 |
|
} |
| 3602 |
if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); |
if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); |
| 3603 |
|
} |
| 3604 |
break; |
break; |
| 3605 |
|
|
| 3606 |
case OP_DIGIT: |
case OP_DIGIT: |
| 3607 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3608 |
|
{ |
| 3609 |
|
if (eptr >= md->end_subject) |
| 3610 |
|
{ |
| 3611 |
|
SCHECK_PARTIAL(); |
| 3612 |
|
RRETURN(MATCH_NOMATCH); |
| 3613 |
|
} |
| 3614 |
if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); |
if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); |
| 3615 |
|
} |
| 3616 |
break; |
break; |
| 3617 |
|
|
| 3618 |
case OP_NOT_WHITESPACE: |
case OP_NOT_WHITESPACE: |
| 3619 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3620 |
|
{ |
| 3621 |
|
if (eptr >= md->end_subject) |
| 3622 |
|
{ |
| 3623 |
|
SCHECK_PARTIAL(); |
| 3624 |
|
RRETURN(MATCH_NOMATCH); |
| 3625 |
|
} |
| 3626 |
if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); |
if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); |
| 3627 |
|
} |
| 3628 |
break; |
break; |
| 3629 |
|
|
| 3630 |
case OP_WHITESPACE: |
case OP_WHITESPACE: |
| 3631 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3632 |
|
{ |
| 3633 |
|
if (eptr >= md->end_subject) |
| 3634 |
|
{ |
| 3635 |
|
SCHECK_PARTIAL(); |
| 3636 |
|
RRETURN(MATCH_NOMATCH); |
| 3637 |
|
} |
| 3638 |
if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); |
if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); |
| 3639 |
|
} |
| 3640 |
break; |
break; |
| 3641 |
|
|
| 3642 |
case OP_NOT_WORDCHAR: |
case OP_NOT_WORDCHAR: |
| 3643 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3644 |
|
{ |
| 3645 |
|
if (eptr >= md->end_subject) |
| 3646 |
|
{ |
| 3647 |
|
SCHECK_PARTIAL(); |
| 3648 |
|
RRETURN(MATCH_NOMATCH); |
| 3649 |
|
} |
| 3650 |
if ((md->ctypes[*eptr++] & ctype_word) != 0) |
if ((md->ctypes[*eptr++] & ctype_word) != 0) |
| 3651 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3652 |
|
} |
| 3653 |
break; |
break; |
| 3654 |
|
|
| 3655 |
case OP_WORDCHAR: |
case OP_WORDCHAR: |
| 3656 |
for (i = 1; i <= min; i++) |
for (i = 1; i <= min; i++) |
| 3657 |
|
{ |
| 3658 |
|
if (eptr >= md->end_subject) |
| 3659 |
|
{ |
| 3660 |
|
SCHECK_PARTIAL(); |
| 3661 |
|
RRETURN(MATCH_NOMATCH); |
| 3662 |
|
} |
| 3663 |
if ((md->ctypes[*eptr++] & ctype_word) == 0) |
if ((md->ctypes[*eptr++] & ctype_word) == 0) |
| 3664 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
| 3665 |
|
} |
| 3666 |
break; |
break; |
| 3667 |
|
|
| 3668 |
default: |
default: |
| 3690 |
{ |
{ |
| 3691 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36); |
| 3692 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3693 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3694 |
|
{ |
| 3695 |
|
CHECK_PARTIAL(); |
| 3696 |
|
RRETURN(MATCH_NOMATCH); |
| 3697 |
|
} |
| 3698 |
|
if (eptr >= md->end_subject) |
| 3699 |
|
{ |
| 3700 |
|
SCHECK_PARTIAL(); |
| 3701 |
|
RRETURN(MATCH_NOMATCH); |
| 3702 |
|
} |
| 3703 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3704 |
if (prop_fail_result) RRETURN(MATCH_NOMATCH); |
if (prop_fail_result) RRETURN(MATCH_NOMATCH); |
| 3705 |
} |
} |
| 3710 |
{ |
{ |
| 3711 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37); |
| 3712 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3713 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3714 |
|
{ |
| 3715 |
|
CHECK_PARTIAL(); |
| 3716 |
|
RRETURN(MATCH_NOMATCH); |
| 3717 |
|
} |
| 3718 |
|
if (eptr >= md->end_subject) |
| 3719 |
|
{ |
| 3720 |
|
SCHECK_PARTIAL(); |
| 3721 |
|
RRETURN(MATCH_NOMATCH); |
| 3722 |
|
} |
| 3723 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3724 |
prop_chartype = UCD_CHARTYPE(c); |
prop_chartype = UCD_CHARTYPE(c); |
| 3725 |
if ((prop_chartype == ucp_Lu || |
if ((prop_chartype == ucp_Lu || |
| 3734 |
{ |
{ |
| 3735 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38); |
| 3736 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3737 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3738 |
|
{ |
| 3739 |
|
CHECK_PARTIAL(); |
| 3740 |
|
RRETURN(MATCH_NOMATCH); |
| 3741 |
|
} |
| 3742 |
|
if (eptr >= md->end_subject) |
| 3743 |
|
{ |
| 3744 |
|
SCHECK_PARTIAL(); |
| 3745 |
|
RRETURN(MATCH_NOMATCH); |
| 3746 |
|
} |
| 3747 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3748 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3749 |
if ((prop_category == prop_value) == prop_fail_result) |
if ((prop_category == prop_value) == prop_fail_result) |
| 3756 |
{ |
{ |
| 3757 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39); |
| 3758 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3759 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3760 |
|
{ |
| 3761 |
|
CHECK_PARTIAL(); |
| 3762 |
|
RRETURN(MATCH_NOMATCH); |
| 3763 |
|
} |
| 3764 |
|
if (eptr >= md->end_subject) |
| 3765 |
|
{ |
| 3766 |
|
SCHECK_PARTIAL(); |
| 3767 |
|
RRETURN(MATCH_NOMATCH); |
| 3768 |
|
} |
| 3769 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3770 |
prop_chartype = UCD_CHARTYPE(c); |
prop_chartype = UCD_CHARTYPE(c); |
| 3771 |
if ((prop_chartype == prop_value) == prop_fail_result) |
if ((prop_chartype == prop_value) == prop_fail_result) |
| 3778 |
{ |
{ |
| 3779 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40); |
| 3780 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3781 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3782 |
|
{ |
| 3783 |
|
CHECK_PARTIAL(); |
| 3784 |
|
RRETURN(MATCH_NOMATCH); |
| 3785 |
|
} |
| 3786 |
|
if (eptr >= md->end_subject) |
| 3787 |
|
{ |
| 3788 |
|
SCHECK_PARTIAL(); |
| 3789 |
|
RRETURN(MATCH_NOMATCH); |
| 3790 |
|
} |
| 3791 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3792 |
prop_script = UCD_SCRIPT(c); |
prop_script = UCD_SCRIPT(c); |
| 3793 |
if ((prop_script == prop_value) == prop_fail_result) |
if ((prop_script == prop_value) == prop_fail_result) |
| 3809 |
{ |
{ |
| 3810 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41); |
| 3811 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3812 |
if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); |
if (fi >= max) |
| 3813 |
|
{ |
| 3814 |
|
CHECK_PARTIAL(); |
| 3815 |
|
RRETURN(MATCH_NOMATCH); |
| 3816 |
|
} |
| 3817 |
|
if (eptr >= md->end_subject) |
| 3818 |
|
{ |
| 3819 |
|
SCHECK_PARTIAL(); |
| 3820 |
|
RRETURN(MATCH_NOMATCH); |
| 3821 |
|
} |
| 3822 |
GETCHARINCTEST(c, eptr); |
GETCHARINCTEST(c, eptr); |
| 3823 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3824 |
if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); |
if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); |
| 3825 |
while (eptr < md->end_subject) |
while (eptr < md->end_subject) |
| 3826 |
{ |
{ |
| 3827 |
int len = 1; |
int len = 1; |
| 3828 |
if (!utf8) c = *eptr; else |
if (!utf8) c = *eptr; |
| 3829 |
{ |
else { GETCHARLEN(c, eptr, len); } |
|
GETCHARLEN(c, eptr, len); |
|
|
} |
|
| 3830 |
prop_category = UCD_CATEGORY(c); |
prop_category = UCD_CATEGORY(c); |
| 3831 |
if (prop_category != ucp_M) break; |
if (prop_category != ucp_M) break; |
| 3832 |
eptr += len; |
eptr += len; |
| 3845 |
{ |
{ |
| 3846 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42); |
| 3847 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3848 |
if (fi >= max || eptr >= md->end_subject || |
if (fi >= max) |
| 3849 |
(ctype == OP_ANY && IS_NEWLINE(eptr))) |
{ |
| 3850 |
|
CHECK_PARTIAL(); |
| 3851 |
|
RRETURN(MATCH_NOMATCH); |
| 3852 |
|
} |
| 3853 |
|
if (eptr >= md->end_subject) |
| 3854 |
|
{ |
| 3855 |
|
SCHECK_PARTIAL(); |
| 3856 |
|
RRETURN(MATCH_NOMATCH); |
| 3857 |
|
} |
| 3858 |
|
if (ctype == OP_ANY && IS_NEWLINE(eptr)) |
| 3859 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
|
|
|
| 3860 |
GETCHARINC(c, eptr); |
GETCHARINC(c, eptr); |
| 3861 |
switch(ctype) |
switch(ctype) |
| 3862 |
{ |
{ |
| 4012 |
{ |
{ |
| 4013 |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43); |
RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43); |
| 4014 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 4015 |
if (fi >= max || eptr >= md->end_subject || |
if (fi >= max) |
| 4016 |
(ctype == OP_ANY && IS_NEWLINE(eptr))) |
{ |
| 4017 |
|
CHECK_PARTIAL(); |
| 4018 |
|
RRETURN(MATCH_NOMATCH); |
| 4019 |
|
} |
| 4020 |
|
if (eptr >= md->end_subject) |
| 4021 |
|
{ |
| 4022 |
|
SCHECK_PARTIAL(); |
| 4023 |
|
RRETURN(MATCH_NOMATCH); |
| 4024 |
|
} |
| 4025 |
|
if (ctype == OP_ANY && IS_NEWLINE(eptr)) |
| 4026 |
RRETURN(MATCH_NOMATCH); |
RRETURN(MATCH_NOMATCH); |
|
|
|
| 4027 |
c = *eptr++; |
c = *eptr++; |
| 4028 |
switch(ctype) |
switch(ctype) |
| 4029 |
{ |
{ |
| 4212 |
|
|
| 4213 |
/* eptr is now past the end of the maximum run */ |
/* eptr is now past the end of the maximum run */ |
| 4214 |
|
|
| 4215 |
|
CHECK_PARTIAL(); |
| 4216 |
if (possessive) continue; |
if (possessive) continue; |
| 4217 |
for(;;) |
for(;;) |
| 4218 |
{ |
{ |
| 4249 |
|
|
| 4250 |
/* eptr is now past the end of the maximum run */ |
/* eptr is now past the end of the maximum run */ |
| 4251 |
|
|
| 4252 |
|
CHECK_PARTIAL(); |
| 4253 |
if (possessive) continue; |
if (possessive) continue; |
| 4254 |
for(;;) |
for(;;) |
| 4255 |
{ |
{ |
| 4486 |
|
|
| 4487 |
/* eptr is now past the end of the maximum run */ |
/* eptr is now past the end of the maximum run */ |
| 4488 |
|
|
| 4489 |
|
CHECK_PARTIAL(); |
| 4490 |
if (possessive) continue; |
if (possessive) continue; |
| 4491 |
for(;;) |
for(;;) |
| 4492 |
{ |
{ |
| 4642 |
|
|
| 4643 |
/* eptr is now past the end of the maximum run */ |
/* eptr is now past the end of the maximum run */ |
| 4644 |
|
|
| 4645 |
|
CHECK_PARTIAL(); |
| 4646 |
if (possessive) continue; |
if (possessive) continue; |
| 4647 |
while (eptr >= pp) |
while (eptr >= pp) |
| 4648 |
{ |
{ |
| 4810 |
const uschar *start_bits = NULL; |
const uschar *start_bits = NULL; |
| 4811 |
USPTR start_match = (USPTR)subject + start_offset; |
USPTR start_match = (USPTR)subject + start_offset; |
| 4812 |
USPTR end_subject; |
USPTR end_subject; |
| 4813 |
|
USPTR start_partial = NULL; |
| 4814 |
USPTR req_byte_ptr = start_match - 1; |
USPTR req_byte_ptr = start_match - 1; |
| 4815 |
|
|
| 4816 |
pcre_study_data internal_study; |
pcre_study_data internal_study; |
| 4968 |
} |
} |
| 4969 |
} |
} |
| 4970 |
|
|
| 4971 |
/* Partial matching is supported only for a restricted set of regexes at the |
/* Partial matching was originally supported only for a restricted set of |
| 4972 |
moment. */ |
regexes; from release 8.00 there are no restrictions, but the bits are still |
| 4973 |
|
defined (though never set). So there's no harm in leaving this code. */ |
| 4974 |
|
|
| 4975 |
if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) |
if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) |
| 4976 |
return PCRE_ERROR_BADPARTIAL; |
return PCRE_ERROR_BADPARTIAL; |
| 5252 |
} |
} |
| 5253 |
} |
} |
| 5254 |
|
|
| 5255 |
/* OK, we can now run the match. */ |
/* OK, we can now run the match. If "hitend" is set afterwards, remember the |
| 5256 |
|
first starting point for which a partial match was found. */ |
| 5257 |
|
|
| 5258 |
md->start_match_ptr = start_match; |
md->start_match_ptr = start_match; |
| 5259 |
md->match_call_count = 0; |
md->match_call_count = 0; |
| 5260 |
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); |
| 5261 |
|
if (md->hitend && start_partial == NULL) start_partial = start_match; |
| 5262 |
|
|
| 5263 |
switch(rc) |
switch(rc) |
| 5264 |
{ |
{ |
| 5399 |
DPRINTF((">>>> error: returning %d\n", rc)); |
DPRINTF((">>>> error: returning %d\n", rc)); |
| 5400 |
return rc; |
return rc; |
| 5401 |
} |
} |
| 5402 |
else if (md->partial && md->hitend) |
else if (md->partial && start_partial != NULL) |
| 5403 |
{ |
{ |
| 5404 |
DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); |
DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); |
| 5405 |
|
if (offsetcount > 1) |
| 5406 |
|
{ |
| 5407 |
|
offsets[0] = start_partial - (USPTR)subject; |
| 5408 |
|
offsets[1] = end_subject - (USPTR)subject; |
| 5409 |
|
} |
| 5410 |
return PCRE_ERROR_PARTIAL; |
return PCRE_ERROR_PARTIAL; |
| 5411 |
} |
} |
| 5412 |
else |
else |