165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/************************************************* 265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich* Perl-Compatible Regular Expressions * 365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/ 465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is a library of functions to support regular expressions whose syntax 665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand semantics are as close as possible to those of the Perl 5 language. 765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Written by Philip Hazel 965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Copyright (c) 1997-2013 University of Cambridge 1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich----------------------------------------------------------------------------- 1265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichRedistribution and use in source and binary forms, with or without 1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodification, are permitted provided that the following conditions are met: 1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Redistributions of source code must retain the above copyright notice, 1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich this list of conditions and the following disclaimer. 1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Redistributions in binary form must reproduce the above copyright 1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich notice, this list of conditions and the following disclaimer in the 2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich documentation and/or other materials provided with the distribution. 2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Neither the name of the University of Cambridge nor the names of its 2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich contributors may be used to endorse or promote products derived from 2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich this software without specific prior written permission. 2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 2665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 3065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 3165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPOSSIBILITY OF SUCH DAMAGE. 3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich----------------------------------------------------------------------------- 3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/ 3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This module contains an internal function that is used to match an extended 4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichclass. It is used by both pcre_exec() and pcre_def_exec(). */ 4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef HAVE_CONFIG_H 4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "config.h" 4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre_internal.h" 5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/************************************************* 5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich* Match character against an XCLASS * 5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/ 5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This function is called to match a character against an extended class that 5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmight contain values > 255 and/or Unicode properties. 5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments: 6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich c the character 6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich data points to the flag byte of the XCLASS data 6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 6365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns: TRUE if character matches, else FALSE 6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/ 6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 6665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichBOOL 6765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPRIV(xclass)(pcre_uint32 c, const pcre_uchar *data, BOOL utf) 6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ 6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar t; 7065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichBOOL negated = (*data & XCL_NOT) != 0; 7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(void)utf; 7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE8 7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */ 7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichutf = TRUE; 7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Character values < 256 are matched against a bitmap, if one is present. If 7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnot, we still carry on, because there may be ranges that start below 256 in the 8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichadditional data. */ 8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (c < 256) 8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((*data & XCL_HASPROP) == 0) 8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((*data & XCL_MAP) == 0) return negated; 8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0; 8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((*data & XCL_MAP) != 0 && 9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (((pcre_uint8 *)(data + 1))[c/8] & (1 << (c&7))) != 0) 9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; /* char found */ 9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* First skip the bit map if present. Then match against the list of Unicode 9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichproperties or large chars or ranges that end with a large char. We won't ever 9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichencounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */ 9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((*data++ & XCL_MAP) != 0) data += 32 / sizeof(pcre_uchar); 9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile ((t = *data++) != XCL_END) 10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich pcre_uint32 x, y; 10365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (t == XCL_SINGLE) 10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_UTF 10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (utf) 10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 10865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich GETCHARINC(x, data); /* macro generates multiple statements */ 10965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 11065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 11265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich x = *data++; 11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (c == x) return !negated; 11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else if (t == XCL_RANGE) 11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_UTF 11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (utf) 11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich GETCHARINC(x, data); /* macro generates multiple statements */ 12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich GETCHARINC(y, data); /* macro generates multiple statements */ 12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 12665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich x = *data++; 12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich y = *data++; 12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (c >= x && c <= y) return !negated; 13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_UCP 13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else /* XCL_PROP & XCL_NOTPROP */ 13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich const ucd_record *prop = GET_UCD(c); 13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich BOOL isprop = t == XCL_PROP; 13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich switch(*data) 13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_ANY: 14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (isprop) return !negated; 14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_LAMP: 14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || 14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prop->chartype == ucp_Lt) == isprop) return !negated; 14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_GC: 15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == isprop) 15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_PC: 15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((data[1] == prop->chartype) == isprop) return !negated; 15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_SC: 15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((data[1] == prop->script) == isprop) return !negated; 16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_ALNUM: 16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || 16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PRIV(ucp_gentype)[prop->chartype] == ucp_N) == isprop) 16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* Perl space used to exclude VT, but from Perl 5.18 it is included, 16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich which means that Perl space and POSIX space are now identical. PCRE 17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich was changed at release 8.34. */ 17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_SPACE: /* Perl space */ 17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_PXSPACE: /* POSIX space */ 17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich switch(c) 17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich HSPACE_CASES: 17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich VSPACE_CASES: 17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (isprop) return !negated; 17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich default: 18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z) == isprop) 18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_WORD: 18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || 19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE) 19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich == isprop) 19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_UCNC: 19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if (c < 0xa0) 19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((c == CHAR_DOLLAR_SIGN || c == CHAR_COMMERCIAL_AT || 19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich c == CHAR_GRAVE_ACCENT) == isprop) 20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich else 20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich { 20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((c < 0xd800 || c > 0xdfff) == isprop) 20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* The following three properties can occur only in an XCLASS, as there 21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich is no \p or \P coding for them. */ 21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* Graphic character. Implement this as not Z (space or separator) and 21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich not C (other), except for Cf (format) with a few exceptions. This seems 21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich to be what Perl does. The exceptional characters are: 21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich U+061C Arabic Letter Mark 21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich U+180E Mongolian Vowel Separator 21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich U+2066 - U+2069 Various "isolate"s 21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich */ 22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_PXGRAPH: 22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((PRIV(ucp_gentype)[prop->chartype] != ucp_Z && 22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (PRIV(ucp_gentype)[prop->chartype] != ucp_C || 22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (prop->chartype == ucp_Cf && 22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich c != 0x061c && c != 0x180e && (c < 0x2066 || c > 0x2069)) 22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich )) == isprop) 22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* Printable character: same as graphic, with the addition of Zs, i.e. 23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich not Zl and not Zp, and U+180E. */ 23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_PXPRINT: 23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((prop->chartype != ucp_Zl && 23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich prop->chartype != ucp_Zp && 23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (PRIV(ucp_gentype)[prop->chartype] != ucp_C || 23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (prop->chartype == ucp_Cf && 23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich c != 0x061c && (c < 0x2066 || c > 0x2069)) 23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich )) == isprop) 24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* Punctuation: all Unicode punctuation, plus ASCII characters that 24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Unicode treats as symbols rather than punctuation, for Perl 24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich compatibility (these are $+<=>^`|~). */ 24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich case PT_PXPUNCT: 24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich if ((PRIV(ucp_gentype)[prop->chartype] == ucp_P || 24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (c < 256 && PRIV(ucp_gentype)[prop->chartype] == ucp_S)) == isprop) 25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return !negated; 25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich break; 25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich /* This should never occur, but compilers may mutter if there is no 25465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich default. */ 25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich default: 25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich return FALSE; 25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich data += 2; 26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* SUPPORT_UCP */ 26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich } 26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn negated; /* char did not match */ 26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} 26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* End of pcre_xclass.c */ 269