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