mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
99 lines
2.9 KiB
C
99 lines
2.9 KiB
C
#include "re_config.h"
|
|
#include "pcre_internal.h"
|
|
|
|
/*************************************************
|
|
* Match character against an XCLASS *
|
|
*************************************************/
|
|
|
|
/* This function is called to match a character against an extended class that
|
|
might contain values > 255.
|
|
|
|
Arguments:
|
|
c the character
|
|
data points to the flag byte of the XCLASS data
|
|
|
|
Returns: TRUE if character matches, else FALSE
|
|
*/
|
|
|
|
BOOL _pcre_xclass(int c, const uschar* data) {
|
|
int t;
|
|
BOOL negated = (*data & XCL_NOT) != 0;
|
|
|
|
/* Character values < 256 are matched against a bitmap, if one is present.
|
|
If not, we still carry on, because there may be ranges that start below 256
|
|
in the additional data. */
|
|
|
|
if (c < 256) {
|
|
if ((*data & XCL_MAP) != 0 && (data[1 + c / 8] & (1 << (c & 7))) != 0)
|
|
return !negated; /* char found */
|
|
}
|
|
|
|
/* First skip the bit map if present. Then match against the list of Unicode
|
|
properties or large chars or ranges that end with a large char. We won't
|
|
ever encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
|
|
|
|
if ((*data++ & XCL_MAP) != 0)
|
|
data += 32;
|
|
|
|
while ((t = *data++) != XCL_END) {
|
|
int x, y;
|
|
if (t == XCL_SINGLE) {
|
|
GETCHARINC(x, data);
|
|
if (c == x)
|
|
return !negated;
|
|
} else if (t == XCL_RANGE) {
|
|
GETCHARINC(x, data);
|
|
GETCHARINC(y, data);
|
|
if (c >= x && c <= y)
|
|
return !negated;
|
|
}
|
|
#ifdef SUPPORT_UCP
|
|
else /* XCL_PROP & XCL_NOTPROP */
|
|
{
|
|
int chartype, script;
|
|
int category = _pcre_ucp_findprop(c, &chartype, &script);
|
|
|
|
switch (*data) {
|
|
case PT_ANY:
|
|
if (t == XCL_PROP)
|
|
return !negated;
|
|
break;
|
|
|
|
case PT_LAMP:
|
|
if ((chartype == ucp_Lu || chartype == ucp_Ll ||
|
|
chartype == ucp_Lt) == (t == XCL_PROP))
|
|
return !negated;
|
|
break;
|
|
|
|
case PT_GC:
|
|
if ((data[1] == category) == (t == XCL_PROP))
|
|
return !negated;
|
|
break;
|
|
|
|
case PT_PC:
|
|
if ((data[1] == chartype) == (t == XCL_PROP))
|
|
return !negated;
|
|
break;
|
|
|
|
case PT_SC:
|
|
if ((data[1] == script) == (t == XCL_PROP))
|
|
return !negated;
|
|
break;
|
|
|
|
/* This should never occur, but compilers may mutter if
|
|
there is no default. */
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
data += 2;
|
|
}
|
|
#endif /* SUPPORT_UCP */
|
|
}
|
|
|
|
return negated; /* char did not match */
|
|
}
|
|
|
|
/* End of pcre_xclass.c */
|