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 |