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