| 2706 |
case OP_NCLASS: |
case OP_NCLASS: |
| 2707 |
case OP_CLASS: |
case OP_CLASS: |
| 2708 |
{ |
{ |
| 2709 |
|
/* The data variable is saved across frames, so the byte map needs to |
| 2710 |
|
be stored there. */ |
| 2711 |
|
#define BYTE_MAP ((pcre_uint8 *)data) |
| 2712 |
data = ecode + 1; /* Save for matching */ |
data = ecode + 1; /* Save for matching */ |
| 2713 |
ecode += 33; /* Advance past the item */ |
ecode += 1 + (32 / sizeof(pcre_uchar)); /* Advance past the item */ |
| 2714 |
|
|
| 2715 |
switch (*ecode) |
switch (*ecode) |
| 2716 |
{ |
{ |
| 2743 |
|
|
| 2744 |
/* First, ensure the minimum number of matches are present. */ |
/* First, ensure the minimum number of matches are present. */ |
| 2745 |
|
|
| 2746 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF |
| 2747 |
/* UTF-8 mode */ |
/* UTF-8 mode */ |
| 2748 |
if (utf8) |
if (utf8) |
| 2749 |
{ |
{ |
| 2760 |
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
| 2761 |
} |
} |
| 2762 |
else |
else |
| 2763 |
{ |
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
|
if ((data[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
|
|
} |
|
| 2764 |
} |
} |
| 2765 |
} |
} |
| 2766 |
else |
else |
| 2775 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 2776 |
} |
} |
| 2777 |
c = *eptr++; |
c = *eptr++; |
| 2778 |
if ((data[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
#ifndef COMPILE_PCRE8 |
| 2779 |
|
if (c > 255) |
| 2780 |
|
{ |
| 2781 |
|
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
| 2782 |
|
} |
| 2783 |
|
else |
| 2784 |
|
#endif |
| 2785 |
|
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
| 2786 |
} |
} |
| 2787 |
} |
} |
| 2788 |
|
|
| 2796 |
|
|
| 2797 |
if (minimize) |
if (minimize) |
| 2798 |
{ |
{ |
| 2799 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF |
| 2800 |
/* UTF-8 mode */ |
/* UTF-8 mode */ |
| 2801 |
if (utf8) |
if (utf8) |
| 2802 |
{ |
{ |
| 2816 |
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
| 2817 |
} |
} |
| 2818 |
else |
else |
| 2819 |
{ |
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
|
if ((data[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
|
|
} |
|
| 2820 |
} |
} |
| 2821 |
} |
} |
| 2822 |
else |
else |
| 2834 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 2835 |
} |
} |
| 2836 |
c = *eptr++; |
c = *eptr++; |
| 2837 |
if ((data[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
#ifndef COMPILE_PCRE8 |
| 2838 |
|
if (c > 255) |
| 2839 |
|
{ |
| 2840 |
|
if (op == OP_CLASS) MRRETURN(MATCH_NOMATCH); |
| 2841 |
|
} |
| 2842 |
|
else |
| 2843 |
|
#endif |
| 2844 |
|
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) MRRETURN(MATCH_NOMATCH); |
| 2845 |
} |
} |
| 2846 |
} |
} |
| 2847 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2853 |
{ |
{ |
| 2854 |
pp = eptr; |
pp = eptr; |
| 2855 |
|
|
| 2856 |
#ifdef SUPPORT_UTF8 |
#ifdef SUPPORT_UTF |
| 2857 |
/* UTF-8 mode */ |
/* UTF mode */ |
| 2858 |
if (utf8) |
if (utf8) |
| 2859 |
{ |
{ |
| 2860 |
for (i = min; i < max; i++) |
for (i = min; i < max; i++) |
| 2871 |
if (op == OP_CLASS) break; |
if (op == OP_CLASS) break; |
| 2872 |
} |
} |
| 2873 |
else |
else |
| 2874 |
{ |
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; |
|
if ((data[c/8] & (1 << (c&7))) == 0) break; |
|
|
} |
|
| 2875 |
eptr += len; |
eptr += len; |
| 2876 |
} |
} |
| 2877 |
for (;;) |
for (;;) |
| 2884 |
} |
} |
| 2885 |
else |
else |
| 2886 |
#endif |
#endif |
| 2887 |
/* Not UTF-8 mode */ |
/* Not UTF mode */ |
| 2888 |
{ |
{ |
| 2889 |
for (i = min; i < max; i++) |
for (i = min; i < max; i++) |
| 2890 |
{ |
{ |
| 2894 |
break; |
break; |
| 2895 |
} |
} |
| 2896 |
c = *eptr; |
c = *eptr; |
| 2897 |
if ((data[c/8] & (1 << (c&7))) == 0) break; |
#ifndef COMPILE_PCRE8 |
| 2898 |
|
if (c > 255) |
| 2899 |
|
{ |
| 2900 |
|
if (op == OP_CLASS) break; |
| 2901 |
|
} |
| 2902 |
|
else |
| 2903 |
|
#endif |
| 2904 |
|
if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; |
| 2905 |
eptr++; |
eptr++; |
| 2906 |
} |
} |
| 2907 |
while (eptr >= pp) |
while (eptr >= pp) |
| 2914 |
|
|
| 2915 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 2916 |
} |
} |
| 2917 |
|
#undef BYTE_MAP |
| 2918 |
} |
} |
| 2919 |
/* Control never gets here */ |
/* Control never gets here */ |
| 2920 |
|
|
| 2923 |
when UTF-8 mode mode is supported. Nevertheless, we may not be in UTF-8 |
when UTF-8 mode mode is supported. Nevertheless, we may not be in UTF-8 |
| 2924 |
mode, because Unicode properties are supported in non-UTF-8 mode. */ |
mode, because Unicode properties are supported in non-UTF-8 mode. */ |
| 2925 |
|
|
| 2926 |
#ifdef SUPPORT_UTF8 |
#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 |
| 2927 |
case OP_XCLASS: |
case OP_XCLASS: |
| 2928 |
{ |
{ |
| 2929 |
data = ecode + 1 + LINK_SIZE; /* Save for matching */ |
data = ecode + 1 + LINK_SIZE; /* Save for matching */ |
| 3010 |
SCHECK_PARTIAL(); |
SCHECK_PARTIAL(); |
| 3011 |
break; |
break; |
| 3012 |
} |
} |
| 3013 |
|
#ifdef SUPPORT_UTF |
| 3014 |
GETCHARLENTEST(c, eptr, len); |
GETCHARLENTEST(c, eptr, len); |
| 3015 |
|
#else |
| 3016 |
|
c = *eptr; |
| 3017 |
|
#endif |
| 3018 |
if (!PRIV(xclass)(c, data)) break; |
if (!PRIV(xclass)(c, data)) break; |
| 3019 |
eptr += len; |
eptr += len; |
| 3020 |
} |
} |
| 3023 |
RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); |
RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); |
| 3024 |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
if (rrc != MATCH_NOMATCH) RRETURN(rrc); |
| 3025 |
if (eptr-- == pp) break; /* Stop if tried at original pos */ |
if (eptr-- == pp) break; /* Stop if tried at original pos */ |
| 3026 |
|
#ifdef SUPPORT_UTF |
| 3027 |
if (utf8) BACKCHAR(eptr); |
if (utf8) BACKCHAR(eptr); |
| 3028 |
|
#endif |
| 3029 |
} |
} |
| 3030 |
MRRETURN(MATCH_NOMATCH); |
MRRETURN(MATCH_NOMATCH); |
| 3031 |
} |
} |
| 6378 |
{ |
{ |
| 6379 |
while (start_match < end_subject) |
while (start_match < end_subject) |
| 6380 |
{ |
{ |
| 6381 |
|
#ifdef COMPILE_PCRE8 |
| 6382 |
register unsigned int c = *start_match; |
register unsigned int c = *start_match; |
| 6383 |
|
#else |
| 6384 |
|
register unsigned int c = *start_match & 0xff; |
| 6385 |
|
#endif |
| 6386 |
if ((start_bits[c/8] & (1 << (c&7))) == 0) |
if ((start_bits[c/8] & (1 << (c&7))) == 0) |
| 6387 |
{ |
{ |
| 6388 |
start_match++; |
start_match++; |