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-2012 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 a PCRE private debugging function for printing out the
4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinternal form of a compiled regular expression, along with some supporting
4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlocal functions. This source file is used in two places:
4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(1) It is #included by pcre_compile.c when it is compiled in debugging mode
4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(PCRE_DEBUG defined in pcre_internal.h). It is not included in production
4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompiles. In this case PCRE_INCLUDED is defined.
4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(2) It is also compiled separately and linked with pcretest.c, which can be
5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichasked to print out a compiled regex for debugging purposes. */
5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PCRE_INCLUDED
5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef HAVE_CONFIG_H
5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "config.h"
5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* For pcretest program. */
5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRIV(name) name
6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* We have to include pcre_internal.h because we need the internal info for
6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdisplaying the results of pcre_study() and we also need to know about the
6365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinternal macros, structures, and other internal data values; pcretest has
6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich"inside information" compared to a program that strictly follows the PCRE API.
6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAlthough pcre_internal.h does itself include pcre.h, we explicitly include it
6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhere before pcre_internal.h so that the PCRE_EXP_xxx macros get set
6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichappropriately for an application, not for building PCRE. */
6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre.h"
7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre_internal.h"
7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* These are the funtions that are contained within. It doesn't seem worth
7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhaving a separate .h file just for this. */
7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* PCRE_INCLUDED */
7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef PCRE_INCLUDED
7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic /* Keep the following function as private. */
8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths);
8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths);
8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths);
8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Macro that decides whether a character should be output as a literal or in
9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhexadecimal. We don't use isprint() because that can vary from system to system
9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(even without the use of locales) and we want the output always to be the same,
9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor testing purposes. */
9465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef EBCDIC
9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRINTABLE(c) ((c) >= 64 && (c) < 255)
9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRINTABLE(c) ((c) >= 32 && (c) < 127)
9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The table of operator names. */
10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic const char *priv_OP_names[] = { OP_NAME_LIST };
10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This table of operator lengths is not actually used by the working code,
10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbut its size is needed for a check that ensures it is the correct size for the
10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnumber of opcodes (thus catching update omissions). */
10865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic const pcre_uint8 priv_OP_lengths[] = { OP_LENGTHS };
11065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*       Print single- or multi-byte character    *
11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic unsigned int
11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprint_char(FILE *f, pcre_uchar *ptr, BOOL utf)
11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uint32 c = *ptr;
12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef SUPPORT_UTF
12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(void)utf;  /* Avoid compiler warning */
12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (PRINTABLE(c)) fprintf(f, "%c", (char)c);
12665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse if (c <= 0x80) fprintf(f, "\\x%02x", c);
12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse fprintf(f, "\\x{%x}", c);
12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn 0;
12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (!utf || (c & 0xc0) != 0xc0)
13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
13765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else if (c < 0x80) fprintf(f, "\\x%02x", c);
13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else fprintf(f, "\\x{%02x}", c);
13965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return 0;
14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
14365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int i;
14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int a = PRIV(utf8_table4)[c & 0x3f];  /* Number of additional bytes */
14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int s = 6*a;
14665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = (c & PRIV(utf8_table3)[a]) << s;
14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  for (i = 1; i <= a; i++)
14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {
14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* This is a check for malformed UTF-8; it should only occur if the sanity
15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    check has been turned off. Rather than swallow random bytes, just stop if
15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    we hit a bad one. Print it with \X instead of \x as an indication. */
15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if ((ptr[i] & 0xc0) != 0x80)
15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, "\\X{%x}", c);
15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      return i - 1;
15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* The byte is OK */
16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    s -= 6;
16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    c |= (ptr[i] & 0x3f) << s;
16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "\\x{%x}", c);
16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return a;
16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (!utf || (c & 0xfc00) != 0xd800)
17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else if (c <= 0x80) fprintf(f, "\\x%02x", c);
17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else fprintf(f, "\\x{%02x}", c);
17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return 0;
17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* This is a check for malformed UTF-16; it should only occur if the sanity
18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  check has been turned off. Rather than swallow a low surrogate, just stop if
18165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  we hit a bad one. Print it with \X instead of \x as an indication. */
18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if ((ptr[1] & 0xfc00) != 0xdc00)
18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {
18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "\\X{%x}", c);
18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    return 0;
18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = (((c & 0x3ff) << 10) | (ptr[1] & 0x3ff)) + 0x10000;
19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "\\x{%x}", c);
19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return 1;
19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (!utf || (c & 0xfffff800u) != 0xd800u)
19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (PRINTABLE(c)) fprintf(f, "%c", (char)c);
19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else if (c <= 0x80) fprintf(f, "\\x%02x", c);
20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else fprintf(f, "\\x{%x}", c);
20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return 0;
20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* This is a check for malformed UTF-32; it should only occur if the sanity
20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  check has been turned off. Rather than swallow a surrogate, just stop if
20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  we hit one. Print it with \X instead of \x as an indication. */
20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "\\X{%x}", c);
20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return 0;
21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* SUPPORT_UTF */
21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*  Print uchar string (regardless of utf)        *
21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic void
22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprint_puchar(FILE *f, PCRE_PUCHAR ptr)
22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhile (*ptr != '\0')
22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
22665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  register pcre_uint32 c = *ptr++;
22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x{%x}", c);
22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*          Find Unicode property name            *
23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic const char *
23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichget_ucpname(unsigned int ptype, unsigned int pvalue)
23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_UCP
23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint i;
24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor (i = PRIV(utt_size) - 1; i >= 0; i--)
24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (ptype == PRIV(utt)[i].type && pvalue == PRIV(utt)[i].value) break;
24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn (i >= 0)? PRIV(utt_names) + PRIV(utt)[i].name_offset : "??";
24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
24665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* It gets harder and harder to shut off unwanted compiler warnings. */
24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichptype = ptype * pvalue;
24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn (ptype == pvalue)? "??" : "??";
24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
25065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
25465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*       Print Unicode property value             *
25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
25665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* "Normal" properties can be printed from tables. The PT_CLIST property is a
25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpseudo-property that contains a pointer to a list of case-equivalent
25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcharacters. This is used only when UCP support is available and UTF mode is
26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichselected. It should never occur otherwise, but just in case it does, have
26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsomething ready to print. */
26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic void
26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprint_prop(FILE *f, pcre_uchar *code, const char *before, const char *after)
26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (code[1] != PT_CLIST)
26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "%s%s %s%s", before, priv_OP_names[*code], get_ucpname(code[1],
26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    code[2]), after);
27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const char *not = (*code == OP_PROP)? "" : "not ";
27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef SUPPORT_UCP
27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "%s%sclist %d%s", before, not, code[2], after);
27665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint32 *p = PRIV(ucd_caseless_sets) + code[2];
27865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf (f, "%s%sclist", before, not);
27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  while (*p < NOTACHAR) fprintf(f, " %04x", *p++);
28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "%s", after);
28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*         Print compiled regex                   *
29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Make this function work for a regex with integers either byte order.
29365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichHowever, we assume that what we are passed is a compiled regex. The
29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichprint_lengths flag controls whether offsets and lengths of items are printed.
29565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThey can be turned off from pcretest so that automatic tests on bytecode can be
29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwritten that do not depend on the value of LINK_SIZE. */
29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef PCRE_INCLUDED
29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic /* Keep the following function as private. */
30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid
30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_printint(pcre *external_re, FILE *f, BOOL print_lengths)
30465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid
30665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths)
30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvoid
30965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths)
31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
31165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
31265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichREAL_PCRE *re = (REAL_PCRE *)external_re;
31365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar *codestart, *code;
31465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichBOOL utf;
31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichunsigned int options = re->options;
31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint offset = re->name_table_offset;
31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint count = re->name_count;
31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichint size = re->name_entry_size;
32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (re->magic_number != MAGIC_NUMBER)
32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff);
32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff);
32565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff);
32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  options = ((options << 24) & 0xff000000) |
32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            ((options <<  8) & 0x00ff0000) |
32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            ((options >>  8) & 0x0000ff00) |
32965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            ((options >> 24) & 0x000000ff);
33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcode = codestart = (pcre_uchar *)re + offset + count * size;
33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE_UTF(16|32) have the same value as PCRE_UTF8. */
33465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichutf = (options & PCRE_UTF8) != 0;
33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor(;;)
33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
33865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *ccode;
33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const char *flag = "  ";
34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 c;
34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int extra = 0;
34265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (print_lengths)
34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%3d ", (int)(code - codestart));
34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  else
34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    ");
34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  switch(*code)
34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    {
35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* ========================================================================== */
35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      /* These cases are never obeyed. This is a fudge that causes a compile-
35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      time error if the vectors OP_names or OP_lengths, which are indexed
35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      by opcode, are not the correct length. It seems to be the only way to do
35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      such a check at compile time, as the sizeof() operator does not work in
35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      the C preprocessor. */
35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      case OP_TABLE_LENGTH:
35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      case OP_TABLE_LENGTH +
35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        ((sizeof(priv_OP_names)/sizeof(const char *) == OP_TABLE_LENGTH) &&
36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        (sizeof(priv_OP_lengths) == OP_TABLE_LENGTH)):
36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      break;
36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* ========================================================================== */
36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_END:
36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    %s\n", priv_OP_names[*code]);
36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "------------------------------------------------------------------\n");
36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    return;
36865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CHAR:
37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    ");
37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    do
37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      code++;
37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      code += 1 + print_char(f, code, utf);
37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    while (*code == OP_CHAR);
37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "\n");
37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    continue;
37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CHARI:
38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " /i ");
38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    do
38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      code++;
38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      code += 1 + print_char(f, code, utf);
38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    while (*code == OP_CHARI);
38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "\n");
38965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    continue;
39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CBRA:
39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CBRAPOS:
39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SCBRA:
39465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SCBRAPOS:
39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else fprintf(f, "    ");
39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%s %d", priv_OP_names[*code], GET2(code, 1+LINK_SIZE));
39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
39965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_BRA:
40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_BRAPOS:
40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SBRA:
40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SBRAPOS:
40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_KETRMAX:
40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_KETRMIN:
40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_KETRPOS:
40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ALT:
40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_KET:
40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ASSERT:
41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ASSERT_NOT:
41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ASSERTBACK:
41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ASSERTBACK_NOT:
41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ONCE:
41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_ONCE_NC:
41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_COND:
41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SCOND:
41765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_REVERSE:
41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else fprintf(f, "    ");
42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%s", priv_OP_names[*code]);
42165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CLOSE:
42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    %s %d", priv_OP_names[*code], GET2(code, 1));
42565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CREF:
42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%3d %s", GET2(code,1), priv_OP_names[*code]);
42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DNCREF:
43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
43465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        IMM2_SIZE;
43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, " %s Cond ref <", flag);
43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      print_puchar(f, entry);
43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
44065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_RREF:
44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    c = GET2(code, 1);
44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (c == RREF_ANY)
44465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, "    Cond recurse any");
44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else
44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, "    Cond recurse %d", c);
44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
44865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DNRREF:
45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        IMM2_SIZE;
45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, " %s Cond recurse <", flag);
45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      print_puchar(f, entry);
45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DEF:
46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    Cond def");
46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_STARI:
46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINSTARI:
46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSSTARI:
46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_PLUSI:
46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINPLUSI:
46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSPLUSI:
46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_QUERYI:
47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINQUERYI:
47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSQUERYI:
47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_STAR:
47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINSTAR:
47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSSTAR:
47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_PLUS:
47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINPLUS:
47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSPLUS:
48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_QUERY:
48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINQUERY:
48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSQUERY:
48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPESTAR:
48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEMINSTAR:
48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEPOSSTAR:
48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEPLUS:
48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEMINPLUS:
48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEPOSPLUS:
48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEQUERY:
49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEMINQUERY:
49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEPOSQUERY:
49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s ", flag);
49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code >= OP_TYPESTAR)
49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (code[1] == OP_PROP || code[1] == OP_NOTPROP)
49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
49765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        print_prop(f, code + 1, "", " ");
49865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        extra = 2;
49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else fprintf(f, "%s", priv_OP_names[code[1]]);
50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
50265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else extra = print_char(f, code+1, utf);
50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%s", priv_OP_names[*code]);
50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
50565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_EXACTI:
50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_UPTOI:
50865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINUPTOI:
50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSUPTOI:
51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_EXACT:
51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_UPTO:
51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MINUPTO:
51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_POSUPTO:
51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s ", flag);
51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    extra = print_char(f, code + 1 + IMM2_SIZE, utf);
51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "{");
51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code != OP_EXACT && *code != OP_EXACTI) fprintf(f, "0,");
52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%d}", GET2(code,1));
52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code == OP_MINUPTO || *code == OP_MINUPTOI) fprintf(f, "?");
52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else if (*code == OP_POSUPTO || *code == OP_POSUPTOI) fprintf(f, "+");
52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
52465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEEXACT:
52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEUPTO:
52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEMINUPTO:
52865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_TYPEPOSUPTO:
52965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (code[1 + IMM2_SIZE] == OP_PROP || code[1 + IMM2_SIZE] == OP_NOTPROP)
53065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
53165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      print_prop(f, code + IMM2_SIZE + 1, "    ", " ");
53265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      extra = 2;
53365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
53465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else fprintf(f, "    %s", priv_OP_names[code[1 + IMM2_SIZE]]);
53565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "{");
53665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code != OP_TYPEEXACT) fprintf(f, "0,");
53765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%d}", GET2(code,1));
53865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code == OP_TYPEMINUPTO) fprintf(f, "?");
53965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else if (*code == OP_TYPEPOSUPTO) fprintf(f, "+");
54065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
54165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
54265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTI:
54365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
54465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
54565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOT:
54665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s [^", flag);
54765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    extra = print_char(f, code + 1, utf);
54865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "]");
54965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
55065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTSTARI:
55265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINSTARI:
55365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSSTARI:
55465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPLUSI:
55565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINPLUSI:
55665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSPLUSI:
55765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTQUERYI:
55865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINQUERYI:
55965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSQUERYI:
56065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
56165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
56265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTSTAR:
56465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINSTAR:
56565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSSTAR:
56665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPLUS:
56765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINPLUS:
56865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSPLUS:
56965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTQUERY:
57065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINQUERY:
57165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSQUERY:
57265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s [^", flag);
57365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    extra = print_char(f, code + 1, utf);
57465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "]%s", priv_OP_names[*code]);
57565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
57665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTEXACTI:
57865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTUPTOI:
57965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINUPTOI:
58065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSUPTOI:
58165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
58265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
58365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
58465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTEXACT:
58565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTUPTO:
58665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTMINUPTO:
58765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPOSUPTO:
58865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s [^", flag);
58965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    extra = print_char(f, code + 1 + IMM2_SIZE, utf);
59065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "]{");
59165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code != OP_NOTEXACT && *code != OP_NOTEXACTI) fprintf(f, "0,");
59265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%d}", GET2(code,1));
59365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code == OP_NOTMINUPTO || *code == OP_NOTMINUPTOI) fprintf(f, "?");
59465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else
59565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (*code == OP_NOTPOSUPTO || *code == OP_NOTPOSUPTOI) fprintf(f, "+");
59665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
59765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
59865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_RECURSE:
59965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if (print_lengths) fprintf(f, "%3d ", GET(code, 1));
60065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else fprintf(f, "    ");
60165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "%s", priv_OP_names[*code]);
60265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
60365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_REFI:
60565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
60665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
60765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_REF:
60865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s \\%d", flag, GET2(code,1));
60965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ccode = code + priv_OP_lengths[*code];
61065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    goto CLASS_REF_REPEAT;
61165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
61265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DNREFI:
61365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/i";
61465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
61565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DNREF:
61665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
61765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      pcre_uchar *entry = (pcre_uchar *)re + offset + (GET2(code, 1) * size) +
61865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        IMM2_SIZE;
61965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, " %s \\k<", flag);
62065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      print_puchar(f, entry);
62165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, ">%d", GET2(code, 1 + IMM2_SIZE));
62265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
62365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ccode = code + priv_OP_lengths[*code];
62465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    goto CLASS_REF_REPEAT;
62565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CALLOUT:
62765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    %s %d %d %d", priv_OP_names[*code], code[1], GET(code,2),
62865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      GET(code, 2 + LINK_SIZE));
62965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
63065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_PROP:
63265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NOTPROP:
63365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    print_prop(f, code, "    ", "");
63465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
63565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* OP_XCLASS cannot occur in 8-bit, non-UTF mode. However, there's no harm
63765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    in having this code always here, and it makes it less messy without all
63865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    those #ifdefs. */
63965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
64065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CLASS:
64165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_NCLASS:
64265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_XCLASS:
64365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {
64465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      int i;
64565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      unsigned int min, max;
64665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      BOOL printmap;
64765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      BOOL invertmap = FALSE;
64865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      pcre_uint8 *map;
64965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      pcre_uint8 inverted_map[32];
65065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
65165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, "    [");
65265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
65365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (*code == OP_XCLASS)
65465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
65565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        extra = GET(code, 1);
65665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        ccode = code + LINK_SIZE + 1;
65765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        printmap = (*ccode & XCL_MAP) != 0;
65865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        if ((*ccode & XCL_NOT) != 0)
65965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          {
66065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          invertmap = (*ccode & XCL_HASPROP) == 0;
66165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          fprintf(f, "^");
66265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          }
66365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        ccode++;
66465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
66565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      else
66665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
66765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        printmap = TRUE;
66865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        ccode = code + 1;
66965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
67065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
67165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      /* Print a bit map */
67265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
67365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (printmap)
67465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
67565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        map = (pcre_uint8 *)ccode;
67665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        if (invertmap)
67765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          {
67865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          for (i = 0; i < 32; i++) inverted_map[i] = ~map[i];
67965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          map = inverted_map;
68065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          }
68165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
68265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        for (i = 0; i < 256; i++)
68365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          {
68465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          if ((map[i/8] & (1 << (i&7))) != 0)
68565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            {
68665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            int j;
68765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            for (j = i+1; j < 256; j++)
68865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              if ((map[j/8] & (1 << (j&7))) == 0) break;
68965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            if (i == '-' || i == ']') fprintf(f, "\\");
69065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            if (PRINTABLE(i)) fprintf(f, "%c", i);
69165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              else fprintf(f, "\\x%02x", i);
69265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            if (--j > i)
69365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              {
69465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              if (j != i + 1) fprintf(f, "-");
69565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              if (j == '-' || j == ']') fprintf(f, "\\");
69665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              if (PRINTABLE(j)) fprintf(f, "%c", j);
69765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                else fprintf(f, "\\x%02x", j);
69865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              }
69965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            i = j;
70065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            }
70165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          }
70265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        ccode += 32 / sizeof(pcre_uchar);
70365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
70465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      /* For an XCLASS there is always some additional data */
70665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      if (*code == OP_XCLASS)
70865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
70965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        pcre_uchar ch;
71065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        while ((ch = *ccode++) != XCL_END)
71165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          {
71265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          BOOL not = FALSE;
71365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          const char *notch = "";
71465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
71565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          switch(ch)
71665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            {
71765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            case XCL_NOTPROP:
71865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            not = TRUE;
71965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            notch = "^";
72065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            /* Fall through */
72165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
72265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            case XCL_PROP:
72365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              {
72465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              unsigned int ptype = *ccode++;
72565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              unsigned int pvalue = *ccode++;
72665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
72765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              switch(ptype)
72865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                {
72965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                case PT_PXGRAPH:
73065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                fprintf(f, "[:%sgraph:]", notch);
73165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                break;
73265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                case PT_PXPRINT:
73465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                fprintf(f, "[:%sprint:]", notch);
73565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                break;
73665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                case PT_PXPUNCT:
73865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                fprintf(f, "[:%spunct:]", notch);
73965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                break;
74065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
74165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                default:
74265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                fprintf(f, "\\%c{%s}", (not? 'P':'p'),
74365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                  get_ucpname(ptype, pvalue));
74465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                break;
74565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                }
74665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              }
74765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            break;
74865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
74965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            default:
75065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            ccode += 1 + print_char(f, ccode, utf);
75165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            if (ch == XCL_RANGE)
75265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              {
75365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              fprintf(f, "-");
75465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              ccode += 1 + print_char(f, ccode, utf);
75565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich              }
75665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            break;
75765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich            }
75865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          }
75965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
76065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
76165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      /* Indicate a non-UTF class which was created by negation */
76265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
76365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : "");
76465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
76565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      /* Handle repeats after a class or a back reference */
76665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
76765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      CLASS_REF_REPEAT:
76865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      switch(*ccode)
76965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        {
77065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRSTAR:
77165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRMINSTAR:
77265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRPLUS:
77365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRMINPLUS:
77465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRQUERY:
77565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRMINQUERY:
77665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRPOSSTAR:
77765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRPOSPLUS:
77865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRPOSQUERY:
77965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        fprintf(f, "%s", priv_OP_names[*ccode]);
78065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        extra += priv_OP_lengths[*ccode];
78165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        break;
78265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
78365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRRANGE:
78465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRMINRANGE:
78565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        case OP_CRPOSRANGE:
78665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        min = GET2(ccode,1);
78765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        max = GET2(ccode,1 + IMM2_SIZE);
78865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        if (max == 0) fprintf(f, "{%u,}", min);
78965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        else fprintf(f, "{%u,%u}", min, max);
79065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
79165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        else if (*ccode == OP_CRPOSRANGE) fprintf(f, "+");
79265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        extra += priv_OP_lengths[*ccode];
79365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        break;
79465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        /* Do nothing if it's not a repeat; this code stops picky compilers
79665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        warning about the lack of a default code path. */
79765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        default:
79965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        break;
80065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        }
80165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      }
80265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
80365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_MARK:
80565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_PRUNE_ARG:
80665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_SKIP_ARG:
80765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_THEN_ARG:
80865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    %s ", priv_OP_names[*code]);
80965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    print_puchar(f, code + 2);
81065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    extra += code[1];
81165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
81265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_THEN:
81465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, "    %s", priv_OP_names[*code]);
81565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
81665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_CIRCM:
81865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    case OP_DOLLM:
81965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    flag = "/m";
82065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Fall through */
82165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    /* Anything else is just an item with no data, but possibly a flag. */
82365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    default:
82565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    fprintf(f, " %s %s", flag, priv_OP_names[*code]);
82665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    break;
82765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
82865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  code += priv_OP_lengths[*code] + extra;
83065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  fprintf(f, "\n");
83165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
83265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
83365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
83465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* End of pcre_printint.src */
835