1f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* PCRE testing program * 3f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 4f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This program was hacked up as a tester for PCRE. I really should have 6f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwritten it more tidily in the first place. Will I ever learn? It has grown and 7f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichbeen extended and consequently is now rather, er, *very* untidy in places. The 8f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichaddition of 16-bit support has made it even worse. :-( 9f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 10f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich----------------------------------------------------------------------------- 11f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichRedistribution and use in source and binary forms, with or without 12f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmodification, are permitted provided that the following conditions are met: 13f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 14f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Redistributions of source code must retain the above copyright notice, 15f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich this list of conditions and the following disclaimer. 16f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 17f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Redistributions in binary form must reproduce the above copyright 18f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich notice, this list of conditions and the following disclaimer in the 19f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich documentation and/or other materials provided with the distribution. 20f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 21f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Neither the name of the University of Cambridge nor the names of its 22f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich contributors may be used to endorse or promote products derived from 23f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich this software without specific prior written permission. 24f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 25f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 26f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 29f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPOSSIBILITY OF SUCH DAMAGE. 36f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich----------------------------------------------------------------------------- 37f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 38f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 39f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This program now supports the testing of all of the 8-bit, 16-bit, and 40f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich32-bit PCRE libraries in a single program. This is different from the modules 41f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsuch as pcre_compile.c in the library itself, which are compiled separately for 42f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevicheach mode. If two modes are enabled, for example, pcre_compile.c is compiled 43f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichtwice. By contrast, pcretest.c is compiled only once. Therefore, it must not 44f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmake use of any of the macros from pcre_internal.h that depend on 45f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichCOMPILE_PCRE8, COMPILE_PCRE16, or COMPILE_PCRE32. It does, however, make use of 46f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSUPPORT_PCRE8, SUPPORT_PCRE16, and SUPPORT_PCRE32 to ensure that it calls only 47f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsupported library functions. */ 48f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 49f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef HAVE_CONFIG_H 50f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "config.h" 51f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 52f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 53f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <ctype.h> 54f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <stdio.h> 55f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <string.h> 56f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <stdlib.h> 57f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <time.h> 58f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <locale.h> 59f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <errno.h> 60f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 61f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Both libreadline and libedit are optionally supported. The user-supplied 62f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoriginal patch uses readline/readline.h for libedit, but in at least one system 63f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichit is installed as editline/readline.h, so the configuration code now looks for 64f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthat first, falling back to readline/readline.h. */ 65f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 66f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) 67f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef HAVE_UNISTD_H 68f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <unistd.h> 69f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 70f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_LIBREADLINE) 71f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <readline/readline.h> 72f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <readline/history.h> 73f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 74f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(HAVE_EDITLINE_READLINE_H) 75f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <editline/readline.h> 76f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 77f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <readline/readline.h> 78f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 79f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 80f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 81f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 82f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* A number of things vary for Windows builds. Originally, pcretest opened its 83f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichinput and output without "b"; then I was told that "b" was needed in some 84f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichenvironments, so it was added for release 5.0 to both the input and output. (It 85f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmakes no difference on Unix-like systems.) Later I was told that it is wrong 86f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor the input on Windows. I've now abstracted the modes into two macros that 87f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichare set here, to make it easier to fiddle with them, and removed "b" from the 88f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichinput mode under Windows. */ 89f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 90f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(_WIN32) || defined(WIN32) 91f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <io.h> /* For _setmode() */ 92f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <fcntl.h> /* For _O_BINARY */ 93f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define INPUT_MODE "r" 94f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define OUTPUT_MODE "wb" 95f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 96f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef isatty 97f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define isatty _isatty /* This is what Windows calls them, I'm told, */ 98f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* though in some environments they seem to */ 99f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* be already defined, hence the #ifndefs. */ 100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef fileno 101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define fileno _fileno 102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* A user sent this fix for Borland Builder 5 under Windows. */ 105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __BORLANDC__ 107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define _setmode(handle, mode) setmode(handle, mode) 108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Not Windows */ 111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <sys/time.h> /* These two includes are needed */ 114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <sys/resource.h> /* for setrlimit(). */ 115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined NATIVE_ZOS /* z/OS uses non-binary I/O */ 116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define INPUT_MODE "r" 117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define OUTPUT_MODE "w" 118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define INPUT_MODE "rb" 120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define OUTPUT_MODE "wb" 121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include <ssdef.h> 126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid vms_setsymbol( char *, char *, int ); 127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PRIV(name) name 131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* We have to include pcre_internal.h because we need the internal info for 133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdisplaying the results of pcre_study() and we also need to know about the 134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichinternal macros, structures, and other internal data values; pcretest has 135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich"inside information" compared to a program that strictly follows the PCRE API. 136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichAlthough pcre_internal.h does itself include pcre.h, we explicitly include it 138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichhere before pcre_internal.h so that the PCRE_EXP_xxx macros get set 139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichappropriately for an application, not for building PCRE. */ 140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcre.h" 142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcre_internal.h" 143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The pcre_printint() function, which prints the internal form of a compiled 145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregex, is held in a separate file so that (a) it can be compiled in either 146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich8-, 16- or 32-bit mode, and (b) it can be #included directly in pcre_compile.c 147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhen that is compiled in debug mode. */ 148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths); 151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid pcre16_printint(pcre *external_re, FILE *f, BOOL print_lengths); 154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid pcre32_printint(pcre *external_re, FILE *f, BOOL print_lengths); 157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* We need access to some of the data tables that PCRE uses. So as not to have 160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichto keep two copies, we include the source files here, changing the names of the 161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichexternal symbols to prevent clashes. */ 162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_INCLUDED 164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcre_tables.c" 166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcre_ucd.c" 167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The definition of the macro PRINTABLE, which determines whether to print an 169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoutput character as-is or as a hex value when showing compiled patterns, is 170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe same as in the printint.src file. We uses it here in cases when the locale 171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichhas not been explicitly changed, so as to get consistent output from systems 172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthat differ in their output from isprint() even in the "C" locale. */ 173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef EBCDIC 175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PRINTABLE(c) ((c) >= 64 && (c) < 255) 176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PRINTABLE(c) ((c) >= 32 && (c) < 127) 178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PRINTOK(c) (locale_set? isprint(c) : PRINTABLE(c)) 181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Posix support is disabled in 16 or 32 bit only mode. */ 183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined SUPPORT_PCRE8 && !defined NOPOSIX 184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define NOPOSIX 185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* It is possible to compile this test program without including support for 188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichtesting the POSIX interface, though this is not available via the standard 189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichMakefile. */ 190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcreposix.h" 193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* It is also possible, originally for the benefit of a version that was 196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichimported into Exim, to build pcretest without support for UTF8 or UTF16 (define 197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichNOUTF), without the interface to the DFA matcher (NODFA). In fact, we 198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichautomatically cut out the UTF support if PCRE is built without it. */ 199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef SUPPORT_UTF 201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef NOUTF 202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define NOUTF 203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* To make the code a bit tidier for 8/16/32-bit support, we define macros 207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor all the pcre[16]_xxx functions (except pcre16_fullinfo, which is called 208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichonly from one place and is handled differently). I couldn't dream up any way of 209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichusing a single macro to do this in a generic way, because of the many different 210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichargument requirements. We know that at least one of SUPPORT_PCRE8 and 211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSUPPORT_PCRE16 must be set. First define macros for each individual mode; then 212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichuse these in the definitions of generic macros. 213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich**** Special note about the PCHARSxxx macros: the address of the string to be 215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprinted is always given as two arguments: a base address followed by an offset. 216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichThe base address is cast to the correct data size for 8 or 16 bit data; the 217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoffset is in units of this size. If the string were given as base+offset in one 218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichargument, the casting might be incorrectly applied. */ 219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS8(lv, p, offset, len, f) \ 223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich lv = pchars((pcre_uint8 *)(p) + offset, len, f) 224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV8(p, offset, len, f) \ 226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pchars((pcre_uint8 *)(p) + offset, len, f) 227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) \ 229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = read_capture_name8(p, cn8, re) 230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN8(p) ((int)strlen((char *)p)) 232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT8(callout) \ 234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_callout = callout 235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD8(stack_guard) \ 237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_stack_guard = stack_guard 238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) \ 240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_assign_jit_stack(extra, callback, userdata) 241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE8(re, pat, options, error, erroffset, tables) \ 243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich re = pcre_compile((char *)pat, options, error, erroffset, tables) 244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ 246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) \ 247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_copy_named_substring(re, (char *)bptr, offsets, count, \ 248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (char *)namesptr, cbuffer, size) 249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) \ 251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_copy_substring((char *)bptr, offsets, count, i, cbuffer, size) 252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \ 254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) \ 255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre_dfa_exec(re, extra, (char *)bptr, len, start_offset, options, \ 256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) 257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \ 259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) \ 260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options, \ 261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) 262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY8(extra) \ 264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_free_study(extra) 265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING8(substring) \ 267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_free_substring(substring) 268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST8(listptr) \ 270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_free_substring_list(listptr) 271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ 273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) \ 274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_get_named_substring(re, (char *)bptr, offsets, count, \ 275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (char *)getnamesptr, subsptr) 276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER8(n, rc, ptr) \ 278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich n = pcre_get_stringnumber(re, (char *)ptr) 279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING8(rc, bptr, offsets, count, i, subsptr) \ 281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_get_substring((char *)bptr, offsets, count, i, subsptr) 282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) \ 284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_get_substring_list((const char *)bptr, offsets, count, listptr) 285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) \ 287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_pattern_to_host_byte_order(re, extra, tables) 288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT8(re, outfile, debug_lengths) \ 290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_printint(re, outfile, debug_lengths) 291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY8(extra, re, options, error) \ 293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = pcre_study(re, options, error) 294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC8(startsize, maxsize) \ 296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_jit_stack_alloc(startsize, maxsize) 297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE8(stack) \ 299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_jit_stack_free(stack) 300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define pcre8_maketables pcre_maketables 302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE8 */ 304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* -----------------------------------------------------------*/ 306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS16(lv, p, offset, len, f) \ 310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich lv = pchars16((PCRE_SPTR16)(p) + offset, len, f) 311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV16(p, offset, len, f) \ 313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pchars16((PCRE_SPTR16)(p) + offset, len, f) 314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re) \ 316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = read_capture_name16(p, cn16, re) 317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN16(p) ((int)strlen16((PCRE_SPTR16)p)) 319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT16(callout) \ 321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_callout = (int (*)(pcre16_callout_block *))callout 322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD16(stack_guard) \ 324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_stack_guard = (int (*)(void))stack_guard 325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata) \ 327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_assign_jit_stack((pcre16_extra *)extra, \ 328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre16_jit_callback)callback, userdata) 329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE16(re, pat, options, error, erroffset, tables) \ 331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich re = (pcre *)pcre16_compile((PCRE_SPTR16)pat, options, error, erroffset, \ 332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich tables) 333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ 335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) \ 336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_copy_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \ 337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count, (PCRE_SPTR16)namesptr, (PCRE_UCHAR16 *)cbuffer, size/2) 338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size) \ 340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_copy_substring((PCRE_SPTR16)bptr, offsets, count, i, \ 341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_UCHAR16 *)cbuffer, size/2) 342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \ 344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) \ 345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre16_dfa_exec((pcre16 *)re, (pcre16_extra *)extra, \ 346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR16)bptr, len, start_offset, options, offsets, size_offsets, \ 347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich workspace, size_workspace) 348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \ 350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) \ 351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre16_exec((pcre16 *)re, (pcre16_extra *)extra, (PCRE_SPTR16)bptr, \ 352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len, start_offset, options, offsets, size_offsets) 353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY16(extra) \ 355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_free_study((pcre16_extra *)extra) 356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING16(substring) \ 358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_free_substring((PCRE_SPTR16)substring) 359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST16(listptr) \ 361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_free_substring_list((PCRE_SPTR16 *)listptr) 362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ 364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) \ 365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_get_named_substring((pcre16 *)re, (PCRE_SPTR16)bptr, offsets, \ 366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count, (PCRE_SPTR16)getnamesptr, (PCRE_SPTR16 *)(void*)subsptr) 367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER16(n, rc, ptr) \ 369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich n = pcre16_get_stringnumber(re, (PCRE_SPTR16)ptr) 370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING16(rc, bptr, offsets, count, i, subsptr) \ 372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_get_substring((PCRE_SPTR16)bptr, offsets, count, i, \ 373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR16 *)(void*)subsptr) 374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr) \ 376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_get_substring_list((PCRE_SPTR16)bptr, offsets, count, \ 377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR16 **)(void*)listptr) 378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables) \ 380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_pattern_to_host_byte_order((pcre16 *)re, (pcre16_extra *)extra, \ 381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich tables) 382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT16(re, outfile, debug_lengths) \ 384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_printint(re, outfile, debug_lengths) 385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY16(extra, re, options, error) \ 387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)pcre16_study((pcre16 *)re, options, error) 388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \ 390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_jit_stack *)pcre16_jit_stack_alloc(startsize, maxsize) 391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE16(stack) \ 393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre16_jit_stack_free((pcre16_jit_stack *)stack) 394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* -----------------------------------------------------------*/ 398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS32(lv, p, offset, len, f) \ 402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich lv = pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f) 403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV32(p, offset, len, f) \ 405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pchars32((PCRE_SPTR32)(p) + offset, len, use_utf, f) 406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re) \ 408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = read_capture_name32(p, cn32, re) 409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN32(p) ((int)strlen32((PCRE_SPTR32)p)) 411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT32(callout) \ 413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_callout = (int (*)(pcre32_callout_block *))callout 414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD32(stack_guard) \ 416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_stack_guard = (int (*)(void))stack_guard 417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata) \ 419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_assign_jit_stack((pcre32_extra *)extra, \ 420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre32_jit_callback)callback, userdata) 421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE32(re, pat, options, error, erroffset, tables) \ 423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich re = (pcre *)pcre32_compile((PCRE_SPTR32)pat, options, error, erroffset, \ 424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich tables) 425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ 427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) \ 428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_copy_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \ 429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count, (PCRE_SPTR32)namesptr, (PCRE_UCHAR32 *)cbuffer, size/2) 430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size) \ 432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_copy_substring((PCRE_SPTR32)bptr, offsets, count, i, \ 433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_UCHAR32 *)cbuffer, size/2) 434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \ 436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) \ 437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre32_dfa_exec((pcre32 *)re, (pcre32_extra *)extra, \ 438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR32)bptr, len, start_offset, options, offsets, size_offsets, \ 439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich workspace, size_workspace) 440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \ 442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) \ 443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = pcre32_exec((pcre32 *)re, (pcre32_extra *)extra, (PCRE_SPTR32)bptr, \ 444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len, start_offset, options, offsets, size_offsets) 445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY32(extra) \ 447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_free_study((pcre32_extra *)extra) 448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING32(substring) \ 450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_free_substring((PCRE_SPTR32)substring) 451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST32(listptr) \ 453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_free_substring_list((PCRE_SPTR32 *)listptr) 454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ 456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) \ 457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_get_named_substring((pcre32 *)re, (PCRE_SPTR32)bptr, offsets, \ 458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count, (PCRE_SPTR32)getnamesptr, (PCRE_SPTR32 *)(void*)subsptr) 459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER32(n, rc, ptr) \ 461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich n = pcre32_get_stringnumber(re, (PCRE_SPTR32)ptr) 462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING32(rc, bptr, offsets, count, i, subsptr) \ 464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_get_substring((PCRE_SPTR32)bptr, offsets, count, i, \ 465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR32 *)(void*)subsptr) 466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr) \ 468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_get_substring_list((PCRE_SPTR32)bptr, offsets, count, \ 469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (PCRE_SPTR32 **)(void*)listptr) 470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables) \ 472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_pattern_to_host_byte_order((pcre32 *)re, (pcre32_extra *)extra, \ 473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich tables) 474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT32(re, outfile, debug_lengths) \ 476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_printint(re, outfile, debug_lengths) 477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY32(extra, re, options, error) \ 479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)pcre32_study((pcre32 *)re, options, error) 480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \ 482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_jit_stack *)pcre32_jit_stack_alloc(startsize, maxsize) 483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE32(stack) \ 485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre32_jit_stack_free((pcre32_jit_stack *)stack) 486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- More than one mode is supported; a runtime test is needed, except for 491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_config(), and the JIT stack functions, when it doesn't matter which 492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichavailable version is called. ----- */ 493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichenum { 495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE8_MODE, 496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE16_MODE, 497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE32_MODE 498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich}; 499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \ 501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich defined (SUPPORT_PCRE32)) >= 2 502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CHAR_SIZE (1 << pcre_mode) 504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* There doesn't seem to be an easy way of writing these macros that can cope 506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwith the 3 pairs of bit sizes plus all three bit sizes. So just handle all the 507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcases separately. */ 508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- All three modes supported ----- */ 510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_PCRE8) && defined(SUPPORT_PCRE16) && defined(SUPPORT_PCRE32) 512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS(lv, p, offset, len, f) \ 514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARS32(lv, p, offset, len, f); \ 516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARS16(lv, p, offset, len, f); \ 518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARS8(lv, p, offset, len, f) 520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV(p, offset, len, f) \ 522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV32(p, offset, len, f); \ 524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV16(p, offset, len, f); \ 526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV8(p, offset, len, f) 528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \ 530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich READ_CAPTURE_NAME32(p, cn8, cn16, cn32, re); \ 532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich READ_CAPTURE_NAME16(p, cn8, cn16, cn32, re); \ 534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich READ_CAPTURE_NAME8(p, cn8, cn16, cn32, re) 536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT(callout) \ 538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_CALLOUT32(callout); \ 540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_CALLOUT16(callout); \ 542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_CALLOUT8(callout) 544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD(stack_guard) \ 546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_STACK_GUARD32(stack_guard); \ 548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_STACK_GUARD16(stack_guard); \ 550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_STACK_GUARD8(stack_guard) 552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN(p) (pcre_mode == PCRE32_MODE ? STRLEN32(p) : pcre_mode == PCRE16_MODE ? STRLEN16(p) : STRLEN8(p)) 554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \ 556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ASSIGN_JIT_STACK32(extra, callback, userdata); \ 558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ASSIGN_JIT_STACK16(extra, callback, userdata); \ 560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ASSIGN_JIT_STACK8(extra, callback, userdata) 562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \ 564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COMPILE32(re, pat, options, error, erroffset, tables); \ 566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COMPILE16(re, pat, options, error, erroffset, tables); \ 568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COMPILE8(re, pat, options, error, erroffset, tables) 570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_CONFIG pcre_config 572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ 574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) \ 575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ 577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size); \ 578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ 580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size); \ 581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ 583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) 584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \ 586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_SUBSTRING32(rc, bptr, offsets, count, i, cbuffer, size); \ 588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_SUBSTRING16(rc, bptr, offsets, count, i, cbuffer, size); \ 590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_SUBSTRING8(rc, bptr, offsets, count, i, cbuffer, size) 592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \ 594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) \ 595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_DFA_EXEC32(count, re, extra, bptr, len, start_offset, options, \ 597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace); \ 598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_DFA_EXEC16(count, re, extra, bptr, len, start_offset, options, \ 600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace); \ 601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_DFA_EXEC8(count, re, extra, bptr, len, start_offset, options, \ 603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) 604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \ 606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) \ 607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC32(count, re, extra, bptr, len, start_offset, options, \ 609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets); \ 610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC16(count, re, extra, bptr, len, start_offset, options, \ 612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets); \ 613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC8(count, re, extra, bptr, len, start_offset, options, \ 615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) 616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY(extra) \ 618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY32(extra); \ 620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY16(extra); \ 622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY8(extra) 624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING(substring) \ 626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING32(substring); \ 628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING16(substring); \ 630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING8(substring) 632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST(listptr) \ 634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING_LIST32(listptr); \ 636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING_LIST16(listptr); \ 638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING_LIST8(listptr) 640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ 642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) \ 643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_NAMED_SUBSTRING32(rc, re, bptr, offsets, count, \ 645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr); \ 646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_NAMED_SUBSTRING16(rc, re, bptr, offsets, count, \ 648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr); \ 649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_NAMED_SUBSTRING8(rc, re, bptr, offsets, count, \ 651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) 652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \ 654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_STRINGNUMBER32(n, rc, ptr); \ 656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_STRINGNUMBER16(n, rc, ptr); \ 658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_STRINGNUMBER8(n, rc, ptr) 660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \ 662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING32(rc, bptr, use_offsets, count, i, subsptr); \ 664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING16(rc, bptr, use_offsets, count, i, subsptr); \ 666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING8(rc, bptr, use_offsets, count, i, subsptr) 668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \ 670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING_LIST32(rc, bptr, offsets, count, listptr); \ 672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING_LIST16(rc, bptr, offsets, count, listptr); \ 674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING_LIST8(rc, bptr, offsets, count, listptr) 676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \ 678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == PCRE32_MODE ? \ 679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_ALLOC32(startsize, maxsize) \ 680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich : pcre_mode == PCRE16_MODE ? \ 681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_ALLOC16(startsize, maxsize) \ 682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich : PCRE_JIT_STACK_ALLOC8(startsize, maxsize)) 683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE(stack) \ 685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_FREE32(stack); \ 687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_FREE16(stack); \ 689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_FREE8(stack) 691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_MAKETABLES \ 693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == PCRE32_MODE ? pcre32_maketables() : pcre_mode == PCRE16_MODE ? pcre16_maketables() : pcre_maketables()) 694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \ 696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PATTERN_TO_HOST_BYTE_ORDER32(rc, re, extra, tables); \ 698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PATTERN_TO_HOST_BYTE_ORDER16(rc, re, extra, tables); \ 700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PATTERN_TO_HOST_BYTE_ORDER8(rc, re, extra, tables) 702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT(re, outfile, debug_lengths) \ 704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PRINTINT32(re, outfile, debug_lengths); \ 706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PRINTINT16(re, outfile, debug_lengths); \ 708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PRINTINT8(re, outfile, debug_lengths) 710f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 711f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY(extra, re, options, error) \ 712f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) \ 713f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY32(extra, re, options, error); \ 714f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (pcre_mode == PCRE16_MODE) \ 715f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY16(extra, re, options, error); \ 716f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 717f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY8(extra, re, options, error) 718f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 719f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 720f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- Two out of three modes are supported ----- */ 721f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 722f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 723f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 724f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* We can use some macro trickery to make a single set of definitions work in 725f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe three different cases. */ 726f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 727f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- 32-bit and 16-bit but not 8-bit supported ----- */ 728f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 729f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE16) 730f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITONE 32 731f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITTWO 16 732f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 733f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- 32-bit and 8-bit but not 16-bit supported ----- */ 734f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 735f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined(SUPPORT_PCRE32) && defined(SUPPORT_PCRE8) 736f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITONE 32 737f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITTWO 8 738f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 739f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- 16-bit and 8-bit but not 32-bit supported ----- */ 740f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 741f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 742f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITONE 16 743f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define BITTWO 8 744f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 745f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 746f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define glue(a,b) a##b 747f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define G(a,b) glue(a,b) 748f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 749f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 750f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- Common macros for two-mode cases ----- */ 751f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 752f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS(lv, p, offset, len, f) \ 753f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 754f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCHARS,BITONE)(lv, p, offset, len, f); \ 755f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 756f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCHARS,BITTWO)(lv, p, offset, len, f) 757f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 758f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV(p, offset, len, f) \ 759f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 760f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCHARSV,BITONE)(p, offset, len, f); \ 761f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 762f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCHARSV,BITTWO)(p, offset, len, f) 763f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 764f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME(p, cn8, cn16, cn32, re) \ 765f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 766f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(READ_CAPTURE_NAME,BITONE)(p, cn8, cn16, cn32, re); \ 767f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 768f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(READ_CAPTURE_NAME,BITTWO)(p, cn8, cn16, cn32, re) 769f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 770f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT(callout) \ 771f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 772f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(SET_PCRE_CALLOUT,BITONE)(callout); \ 773f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 774f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(SET_PCRE_CALLOUT,BITTWO)(callout) 775f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 776f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD(stack_guard) \ 777f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 778f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(SET_PCRE_STACK_GUARD,BITONE)(stack_guard); \ 779f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 780f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(SET_PCRE_STACK_GUARD,BITTWO)(stack_guard) 781f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 782f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN(p) ((pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ 783f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(STRLEN,BITONE)(p) : G(STRLEN,BITTWO)(p)) 784f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 785f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK(extra, callback, userdata) \ 786f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 787f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_ASSIGN_JIT_STACK,BITONE)(extra, callback, userdata); \ 788f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 789f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_ASSIGN_JIT_STACK,BITTWO)(extra, callback, userdata) 790f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 791f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE(re, pat, options, error, erroffset, tables) \ 792f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 793f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COMPILE,BITONE)(re, pat, options, error, erroffset, tables); \ 794f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 795f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COMPILE,BITTWO)(re, pat, options, error, erroffset, tables) 796f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 797f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_CONFIG G(G(pcre,BITONE),_config) 798f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 799f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ 800f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) \ 801f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 802f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COPY_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \ 803f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size); \ 804f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 805f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COPY_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \ 806f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich namesptr, cbuffer, size) 807f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 808f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING(rc, bptr, offsets, count, i, cbuffer, size) \ 809f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 810f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COPY_SUBSTRING,BITONE)(rc, bptr, offsets, count, i, cbuffer, size); \ 811f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 812f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_COPY_SUBSTRING,BITTWO)(rc, bptr, offsets, count, i, cbuffer, size) 813f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 814f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, options, \ 815f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) \ 816f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 817f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_DFA_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \ 818f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace); \ 819f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 820f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_DFA_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \ 821f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets, workspace, size_workspace) 822f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 823f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, \ 824f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) \ 825f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 826f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_EXEC,BITONE)(count, re, extra, bptr, len, start_offset, options, \ 827f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets); \ 828f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 829f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_EXEC,BITTWO)(count, re, extra, bptr, len, start_offset, options, \ 830f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich offsets, size_offsets) 831f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 832f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY(extra) \ 833f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 834f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_STUDY,BITONE)(extra); \ 835f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 836f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_STUDY,BITTWO)(extra) 837f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 838f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING(substring) \ 839f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 840f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_SUBSTRING,BITONE)(substring); \ 841f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 842f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_SUBSTRING,BITTWO)(substring) 843f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 844f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST(listptr) \ 845f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 846f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_SUBSTRING_LIST,BITONE)(listptr); \ 847f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 848f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_FREE_SUBSTRING_LIST,BITTWO)(listptr) 849f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 850f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, offsets, count, \ 851f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) \ 852f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 853f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_NAMED_SUBSTRING,BITONE)(rc, re, bptr, offsets, count, \ 854f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr); \ 855f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 856f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_NAMED_SUBSTRING,BITTWO)(rc, re, bptr, offsets, count, \ 857f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getnamesptr, subsptr) 858f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 859f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER(n, rc, ptr) \ 860f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 861f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_STRINGNUMBER,BITONE)(n, rc, ptr); \ 862f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 863f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_STRINGNUMBER,BITTWO)(n, rc, ptr) 864f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 865f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, subsptr) \ 866f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 867f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_SUBSTRING,BITONE)(rc, bptr, use_offsets, count, i, subsptr); \ 868f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 869f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_SUBSTRING,BITTWO)(rc, bptr, use_offsets, count, i, subsptr) 870f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 871f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST(rc, bptr, offsets, count, listptr) \ 872f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 873f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_SUBSTRING_LIST,BITONE)(rc, bptr, offsets, count, listptr); \ 874f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 875f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_GET_SUBSTRING_LIST,BITTWO)(rc, bptr, offsets, count, listptr) 876f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 877f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC(startsize, maxsize) \ 878f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ 879f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_JIT_STACK_ALLOC,BITONE)(startsize, maxsize) \ 880f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich : G(PCRE_JIT_STACK_ALLOC,BITTWO)(startsize, maxsize) 881f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 882f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE(stack) \ 883f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 884f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_JIT_STACK_FREE,BITONE)(stack); \ 885f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 886f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_JIT_STACK_FREE,BITTWO)(stack) 887f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 888f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_MAKETABLES \ 889f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == G(G(PCRE,BITONE),_MODE)) ? \ 890f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(G(pcre,BITONE),_maketables)() : G(G(pcre,BITTWO),_maketables)() 891f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 892f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, tables) \ 893f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 894f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITONE)(rc, re, extra, tables); \ 895f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 896f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_PATTERN_TO_HOST_BYTE_ORDER,BITTWO)(rc, re, extra, tables) 897f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 898f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT(re, outfile, debug_lengths) \ 899f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 900f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_PRINTINT,BITONE)(re, outfile, debug_lengths); \ 901f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 902f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_PRINTINT,BITTWO)(re, outfile, debug_lengths) 903f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 904f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY(extra, re, options, error) \ 905f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == G(G(PCRE,BITONE),_MODE)) \ 906f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_STUDY,BITONE)(extra, re, options, error); \ 907f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else \ 908f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich G(PCRE_STUDY,BITTWO)(extra, re, options, error) 909f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 910f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* Two out of three modes */ 911f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 912f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- End of cases where more than one mode is supported ----- */ 913f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 914f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 915f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- Only 8-bit mode is supported ----- */ 916f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 917f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE8 918f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CHAR_SIZE 1 919f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS PCHARS8 920f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV PCHARSV8 921f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME READ_CAPTURE_NAME8 922f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT8 923f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD8 924f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN STRLEN8 925f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK8 926f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE PCRE_COMPILE8 927f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_CONFIG pcre_config 928f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING8 929f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING8 930f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC PCRE_DFA_EXEC8 931f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC PCRE_EXEC8 932f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY PCRE_FREE_STUDY8 933f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING8 934f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST8 935f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING8 936f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER8 937f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING8 938f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST8 939f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC8 940f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE8 941f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_MAKETABLES pcre_maketables() 942f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER8 943f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT PCRE_PRINTINT8 944f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY PCRE_STUDY8 945f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 946f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- Only 16-bit mode is supported ----- */ 947f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 948f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE16 949f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CHAR_SIZE 2 950f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS PCHARS16 951f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV PCHARSV16 952f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME READ_CAPTURE_NAME16 953f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT16 954f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD16 955f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN STRLEN16 956f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK16 957f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE PCRE_COMPILE16 958f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_CONFIG pcre16_config 959f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING16 960f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING16 961f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC PCRE_DFA_EXEC16 962f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC PCRE_EXEC16 963f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY PCRE_FREE_STUDY16 964f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING16 965f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST16 966f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING16 967f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER16 968f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING16 969f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST16 970f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC16 971f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE16 972f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_MAKETABLES pcre16_maketables() 973f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER16 974f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT PCRE_PRINTINT16 975f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY PCRE_STUDY16 976f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 977f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- Only 32-bit mode is supported ----- */ 978f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 979f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE32 980f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CHAR_SIZE 4 981f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARS PCHARS32 982f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCHARSV PCHARSV32 983f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define READ_CAPTURE_NAME READ_CAPTURE_NAME32 984f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_CALLOUT SET_PCRE_CALLOUT32 985f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define SET_PCRE_STACK_GUARD SET_PCRE_STACK_GUARD32 986f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRLEN STRLEN32 987f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_ASSIGN_JIT_STACK PCRE_ASSIGN_JIT_STACK32 988f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COMPILE PCRE_COMPILE32 989f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_CONFIG pcre32_config 990f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_NAMED_SUBSTRING PCRE_COPY_NAMED_SUBSTRING32 991f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_COPY_SUBSTRING PCRE_COPY_SUBSTRING32 992f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_DFA_EXEC PCRE_DFA_EXEC32 993f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_EXEC PCRE_EXEC32 994f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_STUDY PCRE_FREE_STUDY32 995f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING PCRE_FREE_SUBSTRING32 996f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_FREE_SUBSTRING_LIST PCRE_FREE_SUBSTRING_LIST32 997f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_NAMED_SUBSTRING PCRE_GET_NAMED_SUBSTRING32 998f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_STRINGNUMBER PCRE_GET_STRINGNUMBER32 999f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING PCRE_GET_SUBSTRING32 1000f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_GET_SUBSTRING_LIST PCRE_GET_SUBSTRING_LIST32 1001f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_ALLOC PCRE_JIT_STACK_ALLOC32 1002f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_JIT_STACK_FREE PCRE_JIT_STACK_FREE32 1003f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_MAKETABLES pcre32_maketables() 1004f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PATTERN_TO_HOST_BYTE_ORDER PCRE_PATTERN_TO_HOST_BYTE_ORDER32 1005f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_PRINTINT PCRE_PRINTINT32 1006f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY PCRE_STUDY32 1007f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1008f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1009f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1010f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* ----- End of mode-specific function call macros ----- */ 1011f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1012f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1013f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Other parameters */ 1014f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1015f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef CLOCKS_PER_SEC 1016f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef CLK_TCK 1017f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CLOCKS_PER_SEC CLK_TCK 1018f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 1019f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define CLOCKS_PER_SEC 100 1020f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1021f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1022f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1023f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 1024f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define DFA_WS_DIMENSION 1000 1025f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1026f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1027f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This is the default loop count for timing. */ 1028f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1029f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define LOOPREPEAT 500000 1030f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1031f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Static variables */ 1032f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1033f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic FILE *outfile; 1034f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int log_store = 0; 1035f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int callout_count; 1036f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int callout_extra; 1037f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int callout_fail_count; 1038f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int callout_fail_id; 1039f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int debug_lengths; 1040f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int first_callout; 1041f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int jit_was_used; 1042f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int locale_set = 0; 1043f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int show_malloc; 1044f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int stack_guard_return; 1045f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int use_utf; 1046f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const unsigned char *last_callout_mark = NULL; 1047f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1048f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The buffers grow automatically if very long input lines are encountered. */ 1049f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1050f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int buffer_size = 50000; 1051f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 *buffer = NULL; 1052f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 *pbuffer = NULL; 1053f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1054f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Just as a safety check, make sure that COMPILE_PCRE[16|32] are *not* set. */ 1055f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1056f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef COMPILE_PCRE16 1057f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#error COMPILE_PCRE16 must not be set when compiling pcretest.c 1058f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1059f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1060f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef COMPILE_PCRE32 1061f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#error COMPILE_PCRE32 must not be set when compiling pcretest.c 1062f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1063f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1064f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* We need buffers for building 16/32-bit strings, and the tables of operator 1065f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichlengths that are used for 16/32-bit compiling, in order to swap bytes in a 1066f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpattern for saving/reloading testing. Luckily, the data for these tables is 1067f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdefined as a macro. However, we must ensure that LINK_SIZE and IMM2_SIZE (which 1068f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichare used in the tables) are adjusted appropriately for the 16/32-bit world. 1069f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichLINK_SIZE is also used later in this program. */ 1070f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1071f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 1072f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#undef IMM2_SIZE 1073f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define IMM2_SIZE 1 1074f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1075f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if LINK_SIZE == 2 1076f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#undef LINK_SIZE 1077f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define LINK_SIZE 1 1078f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif LINK_SIZE == 3 || LINK_SIZE == 4 1079f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#undef LINK_SIZE 1080f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define LINK_SIZE 2 1081f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 1082f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#error LINK_SIZE must be either 2, 3, or 4 1083f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1084f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1085f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int buffer16_size = 0; 1086f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint16 *buffer16 = NULL; 1087f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const pcre_uint16 OP_lengths16[] = { OP_LENGTHS }; 1088f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 1089f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1090f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 1091f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#undef IMM2_SIZE 1092f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define IMM2_SIZE 1 1093f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#undef LINK_SIZE 1094f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define LINK_SIZE 1 1095f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1096f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int buffer32_size = 0; 1097f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint32 *buffer32 = NULL; 1098f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const pcre_uint32 OP_lengths32[] = { OP_LENGTHS }; 1099f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 1100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* If we have 8-bit support, default to it; if there is also 16-or 32-bit 1102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsupport, it can be changed by an option. If there is no 8-bit support, there 1103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmust be 16-or 32-bit support, so default it to 1. */ 1104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE8 1106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pcre_mode = PCRE8_MODE; 1107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE16 1108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pcre_mode = PCRE16_MODE; 1109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE32 1110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pcre_mode = PCRE32_MODE; 1111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* JIT study options for -s+n and /S+n where '1' <= n <= '7'. */ 1114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int jit_study_bits[] = 1116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_COMPILE, 1118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE, 1119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE, 1120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, 1121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, 1122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE, 1123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_COMPILE + PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + 1124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 1125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich}; 1126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define PCRE_STUDY_ALLJIT (PCRE_STUDY_JIT_COMPILE | \ 1128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE | PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) 1129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Textual explanations for runtime error codes */ 1131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const char *errtexts[] = { 1133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* 0 is no error */ 1134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* NOMATCH is handled specially */ 1135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "NULL argument passed", 1136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "bad option value", 1137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "magic number missing", 1138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "unknown opcode - pattern overwritten?", 1139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "no more memory", 1140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* never returned by pcre_exec() or pcre_dfa_exec() */ 1141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "match limit exceeded", 1142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "callout error code", 1143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* BADUTF8/16 is handled specially */ 1144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* BADUTF8/16 offset is handled specially */ 1145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* PARTIAL is handled specially */ 1146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "not used - internal error", 1147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "internal error - pattern overwritten?", 1148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "bad count value", 1149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "item unsupported for DFA matching", 1150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "backreference condition or recursion test not supported for DFA matching", 1151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "match limit not supported for DFA matching", 1152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "workspace size exceeded in DFA matching", 1153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "too much recursion for DFA matching", 1154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "recursion limit exceeded", 1155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "not used - internal error", 1156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "invalid combination of newline options", 1157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "bad offset value", 1158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL, /* SHORTUTF8/16 is handled specially */ 1159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "nested recursion at the same subject position", 1160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "JIT stack limit reached", 1161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "pattern compiled in wrong mode: 8-bit/16-bit error", 1162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "pattern compiled with other endianness", 1163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "invalid data in workspace for DFA restart", 1164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "bad JIT option", 1165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "bad length" 1166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich}; 1167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Alternate character tables * 1171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* By default, the "tables" pointer when calling PCRE is set to NULL, thereby 1174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichusing the default tables of the library. However, the T option can be used to 1175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichselect alternate sets of tables, for different kinds of testing. Note also that 1176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe L (locale) option also adjusts the tables. */ 1177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This is the set of tables distributed as default with PCRE. It recognizes 1179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichonly ASCII characters. */ 1180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const pcre_uint8 tables0[] = { 1182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This table is a lower casing table. */ 1184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0, 1, 2, 3, 4, 5, 6, 7, 1186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8, 9, 10, 11, 12, 13, 14, 15, 1187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 16, 17, 18, 19, 20, 21, 22, 23, 1188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 24, 25, 26, 27, 28, 29, 30, 31, 1189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 32, 33, 34, 35, 36, 37, 38, 39, 1190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 40, 41, 42, 43, 44, 45, 46, 47, 1191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 48, 49, 50, 51, 52, 53, 54, 55, 1192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 56, 57, 58, 59, 60, 61, 62, 63, 1193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 64, 97, 98, 99,100,101,102,103, 1194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 104,105,106,107,108,109,110,111, 1195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 112,113,114,115,116,117,118,119, 1196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 120,121,122, 91, 92, 93, 94, 95, 1197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 96, 97, 98, 99,100,101,102,103, 1198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 104,105,106,107,108,109,110,111, 1199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 112,113,114,115,116,117,118,119, 1200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 120,121,122,123,124,125,126,127, 1201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 128,129,130,131,132,133,134,135, 1202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 136,137,138,139,140,141,142,143, 1203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 144,145,146,147,148,149,150,151, 1204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 152,153,154,155,156,157,158,159, 1205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 160,161,162,163,164,165,166,167, 1206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 168,169,170,171,172,173,174,175, 1207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 176,177,178,179,180,181,182,183, 1208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 184,185,186,187,188,189,190,191, 1209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 192,193,194,195,196,197,198,199, 1210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 200,201,202,203,204,205,206,207, 1211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 208,209,210,211,212,213,214,215, 1212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 216,217,218,219,220,221,222,223, 1213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 224,225,226,227,228,229,230,231, 1214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 232,233,234,235,236,237,238,239, 1215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 240,241,242,243,244,245,246,247, 1216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 248,249,250,251,252,253,254,255, 1217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This table is a case flipping table. */ 1219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0, 1, 2, 3, 4, 5, 6, 7, 1221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8, 9, 10, 11, 12, 13, 14, 15, 1222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 16, 17, 18, 19, 20, 21, 22, 23, 1223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 24, 25, 26, 27, 28, 29, 30, 31, 1224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 32, 33, 34, 35, 36, 37, 38, 39, 1225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 40, 41, 42, 43, 44, 45, 46, 47, 1226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 48, 49, 50, 51, 52, 53, 54, 55, 1227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 56, 57, 58, 59, 60, 61, 62, 63, 1228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 64, 97, 98, 99,100,101,102,103, 1229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 104,105,106,107,108,109,110,111, 1230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 112,113,114,115,116,117,118,119, 1231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 120,121,122, 91, 92, 93, 94, 95, 1232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 96, 65, 66, 67, 68, 69, 70, 71, 1233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 72, 73, 74, 75, 76, 77, 78, 79, 1234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 80, 81, 82, 83, 84, 85, 86, 87, 1235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 88, 89, 90,123,124,125,126,127, 1236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 128,129,130,131,132,133,134,135, 1237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 136,137,138,139,140,141,142,143, 1238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 144,145,146,147,148,149,150,151, 1239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 152,153,154,155,156,157,158,159, 1240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 160,161,162,163,164,165,166,167, 1241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 168,169,170,171,172,173,174,175, 1242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 176,177,178,179,180,181,182,183, 1243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 184,185,186,187,188,189,190,191, 1244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 192,193,194,195,196,197,198,199, 1245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 200,201,202,203,204,205,206,207, 1246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 208,209,210,211,212,213,214,215, 1247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 216,217,218,219,220,221,222,223, 1248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 224,225,226,227,228,229,230,231, 1249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 232,233,234,235,236,237,238,239, 1250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 240,241,242,243,244,245,246,247, 1251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 248,249,250,251,252,253,254,255, 1252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This table contains bit maps for various character classes. Each map is 32 1254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichbytes long and the bits run from the least significant end of each byte. The 1255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichclasses that have their own maps are: space, xdigit, digit, upper, lower, word, 1256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichgraph, print, punct, and cntrl. Other classes are built from combinations. */ 1257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, 1259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 1264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 1265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 1269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 1275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, 1280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 1284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, 1285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, 1289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 1290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 1294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 1295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, 1299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, 1300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 1304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 1305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 1307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This table identifies various classes of character by individual bits: 1309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x01 white space character 1310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x02 letter 1311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x04 decimal digit 1312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x08 hexadecimal digit 1313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x10 alphanumeric or '_' 1314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x80 regular expression metacharacter or binary zero 1315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 1318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ 1319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 1320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 1321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ 1322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ 1323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 1324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ 1325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ 1326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 1327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 1328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ 1329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ 1330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ 1331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ 1332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ 1333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 1334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 1335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 1336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 1337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 1338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 1339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 1340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 1341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 1342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 1343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 1344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 1345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 1346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 1347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 1348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ 1349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This is a set of tables that came originally from a Windows user. It seems 1351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichto be at least an approximation of ISO 8859. In particular, there are 1352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcharacters greater than 128 that are marked as spaces, letters, etc. */ 1353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic const pcre_uint8 tables1[] = { 1355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,1,2,3,4,5,6,7, 1356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich8,9,10,11,12,13,14,15, 1357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich16,17,18,19,20,21,22,23, 1358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich24,25,26,27,28,29,30,31, 1359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich32,33,34,35,36,37,38,39, 1360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich40,41,42,43,44,45,46,47, 1361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich48,49,50,51,52,53,54,55, 1362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich56,57,58,59,60,61,62,63, 1363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich64,97,98,99,100,101,102,103, 1364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich104,105,106,107,108,109,110,111, 1365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich112,113,114,115,116,117,118,119, 1366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich120,121,122,91,92,93,94,95, 1367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich96,97,98,99,100,101,102,103, 1368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich104,105,106,107,108,109,110,111, 1369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich112,113,114,115,116,117,118,119, 1370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich120,121,122,123,124,125,126,127, 1371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich128,129,130,131,132,133,134,135, 1372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich136,137,138,139,140,141,142,143, 1373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich144,145,146,147,148,149,150,151, 1374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich152,153,154,155,156,157,158,159, 1375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich160,161,162,163,164,165,166,167, 1376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich168,169,170,171,172,173,174,175, 1377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich176,177,178,179,180,181,182,183, 1378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich184,185,186,187,188,189,190,191, 1379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich224,225,226,227,228,229,230,231, 1380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich232,233,234,235,236,237,238,239, 1381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich240,241,242,243,244,245,246,215, 1382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich248,249,250,251,252,253,254,223, 1383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich224,225,226,227,228,229,230,231, 1384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich232,233,234,235,236,237,238,239, 1385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich240,241,242,243,244,245,246,247, 1386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich248,249,250,251,252,253,254,255, 1387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,1,2,3,4,5,6,7, 1388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich8,9,10,11,12,13,14,15, 1389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich16,17,18,19,20,21,22,23, 1390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich24,25,26,27,28,29,30,31, 1391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich32,33,34,35,36,37,38,39, 1392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich40,41,42,43,44,45,46,47, 1393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich48,49,50,51,52,53,54,55, 1394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich56,57,58,59,60,61,62,63, 1395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich64,97,98,99,100,101,102,103, 1396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich104,105,106,107,108,109,110,111, 1397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich112,113,114,115,116,117,118,119, 1398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich120,121,122,91,92,93,94,95, 1399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich96,65,66,67,68,69,70,71, 1400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich72,73,74,75,76,77,78,79, 1401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich80,81,82,83,84,85,86,87, 1402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich88,89,90,123,124,125,126,127, 1403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich128,129,130,131,132,133,134,135, 1404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich136,137,138,139,140,141,142,143, 1405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich144,145,146,147,148,149,150,151, 1406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich152,153,154,155,156,157,158,159, 1407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich160,161,162,163,164,165,166,167, 1408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich168,169,170,171,172,173,174,175, 1409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich176,177,178,179,180,181,182,183, 1410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich184,185,186,187,188,189,190,191, 1411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich224,225,226,227,228,229,230,231, 1412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich232,233,234,235,236,237,238,239, 1413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich240,241,242,243,244,245,246,215, 1414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich248,249,250,251,252,253,254,223, 1415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich192,193,194,195,196,197,198,199, 1416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich200,201,202,203,204,205,206,207, 1417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich208,209,210,211,212,213,214,247, 1418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich216,217,218,219,220,221,222,255, 1419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,62,0,0,1,0,0,0, 1420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich32,0,0,0,1,0,0,0, 1422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,255,3, 1424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich126,0,0,0,126,0,0,0, 1425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,255,3, 1428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,12,2, 1430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich254,255,255,7,0,0,0,0, 1433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,127,127,0,0,0,0, 1435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,254,255,255,7, 1437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,4,32,4, 1438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,128,255,255,127,255, 1439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,255,3, 1440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich254,255,255,135,254,255,255,7, 1441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,4,44,6, 1442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,127,255,255,255,127,255, 1443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,254,255,255,255, 1444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,255,255,255,127, 1445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,254,255,255,255, 1446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,255,255,255,255, 1447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,2,0,0,255,255,255,255, 1448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,255,255,255,127, 1449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,255,255,255,255, 1450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,255,255,255,255, 1451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,254,255,0,252, 1452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich1,0,0,248,1,0,0,120, 1453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,254,255,255,255, 1454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,128,0,0,0,128,0, 1455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,0,0,0,0, 1456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,128, 1457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich255,255,255,255,0,0,0,0, 1458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich128,0,0,0,0,0,0,0, 1460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,1,1,0,1,1,0,0, 1461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich1,0,0,0,128,0,0,0, 1464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich128,128,128,128,0,0,128,0, 1465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich28,28,28,28,28,28,28,28, 1466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich28,28,0,0,0,0,0,128, 1467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,26,26,26,26,26,26,18, 1468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,128,128,0,128,16, 1471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,26,26,26,26,26,26,18, 1472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,128,128,0,0,0, 1475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,1,0,0, 1476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,0,0,0,0,0,0, 1479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich1,0,0,0,0,0,0,0, 1480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,18,0,0,0,0,0, 1481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,0,20,20,0,18,0,0, 1482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich0,20,18,0,0,0,0,0, 1483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,0, 1486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18, 1489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,0, 1490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich18,18,18,18,18,18,18,18 1491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich}; 1492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef HAVE_STRERROR 1497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Provide strerror() for non-ANSI libraries * 1499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() 1502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin their libraries, but can provide the same facility by this simple 1503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichalternative function. */ 1504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichextern int sys_nerr; 1506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichextern char *sys_errlist[]; 1507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichchar * 1509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstrerror(int n) 1510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (n < 0 || n >= sys_nerr) return "unknown error number"; 1512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn sys_errlist[n]; 1513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* HAVE_STRERROR */ 1515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Print newline configuration * 1520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* 1523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc the return code from PCRE_CONFIG_NEWLINE 1525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich isc TRUE if called from "-C newline" 1526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: nothing 1527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void 1530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprint_newline_config(int rc, BOOL isc) 1531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichconst char *s = NULL; 1533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (!isc) printf(" Newline sequence is "); 1534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichswitch(rc) 1535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case CHAR_CR: s = "CR"; break; 1537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case CHAR_LF: s = "LF"; break; 1538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case (CHAR_CR<<8 | CHAR_LF): s = "CRLF"; break; 1539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -1: s = "ANY"; break; 1540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -2: s = "ANYCRLF"; break; 1541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 1543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("a non-standard value: 0x%04x\n", rc); 1544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return; 1545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("%s\n", s); 1548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* JIT memory callback * 1554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_jit_stack* jit_callback(void *arg) 1557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichjit_was_used = TRUE; 1559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (pcre_jit_stack *)arg; 1560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOUTF || defined SUPPORT_PCRE16 || defined SUPPORT_PCRE32 1564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Convert UTF-8 string to value * 1566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This function takes one or more bytes that represents a UTF-8 character, 1569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichand returns the value of the character. 1570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArgument: 1572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich utf8bytes a pointer to the byte vector 1573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vptr a pointer to an int to receive the value 1574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: > 0 => the number of bytes consumed 1576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich -6 to 0 => malformed UTF-8 character at offset = (-return) 1577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 1580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichutf82ord(pcre_uint8 *utf8bytes, pcre_uint32 *vptr) 1581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 c = *utf8bytes++; 1583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 d = c; 1584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint i, j, s; 1585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (i = -1; i < 6; i++) /* i is number of additional bytes */ 1587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((d & 0x80) == 0) break; 1589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich d <<= 1; 1590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (i == -1) { *vptr = c; return 1; } /* ascii character */ 1593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (i == 0 || i == 6) return 0; /* invalid UTF-8 */ 1594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* i now has a value in the range 1-5 */ 1596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichs = 6*i; 1598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichd = (c & utf8_table3[i]) << s; 1599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (j = 0; j < i; j++) 1601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = *utf8bytes++; 1603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((c & 0xc0) != 0x80) return -(j+1); 1604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich s -= 6; 1605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich d |= (c & 0x3f) << s; 1606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Check that encoding was the correct unique one */ 1609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (j = 0; j < utf8_table1_size; j++) 1611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (d <= (pcre_uint32)utf8_table1[j]) break; 1612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (j != i) return -(i+1); 1613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Valid value */ 1615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*vptr = d; 1617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn i+1; 1618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* NOUTF || SUPPORT_PCRE16 */ 1620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE8 && !defined NOUTF 1624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Convert character value to UTF-8 * 1626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This function takes an integer value in the range 0 - 0x7fffffff 1629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichand encodes it as a UTF-8 character in 0 to 6 bytes. 1630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cvalue the character value 1633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich utf8bytes pointer to buffer for result - at least 6 bytes long 1634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: number of characters placed in the buffer 1636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 1639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichord2utf8(pcre_uint32 cvalue, pcre_uint8 *utf8bytes) 1640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregister int i, j; 1642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (cvalue > 0x7fffffffu) 1643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return -1; 1644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (i = 0; i < utf8_table1_size; i++) 1645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (cvalue <= (pcre_uint32)utf8_table1[i]) break; 1646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichutf8bytes += i; 1647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (j = i; j > 0; j--) 1648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *utf8bytes-- = 0x80 | (cvalue & 0x3f); 1650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cvalue >>= 6; 1651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*utf8bytes = utf8_table2[i] | cvalue; 1653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn i + 1; 1654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 1659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Convert a string to 16-bit * 1661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* In non-UTF mode, the space needed for a 16-bit string is exactly double the 1664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich8-bit size. For a UTF-8 string, the size needed for UTF-16 is no more than 1665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdouble, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4 1666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin UTF-16. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-16. The 1667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichresult is always left in buffer16. 1668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichNote that this function does not object to surrogate values. This is 1670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdeliberate; it makes it possible to construct UTF-16 strings that are invalid, 1671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor the purpose of testing that they are correctly faulted. 1672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPatterns to be converted are either plain ASCII or UTF-8; data lines are always 1674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin UTF-8 so that values greater than 255 can be handled. 1675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich data TRUE if converting a data line; FALSE for a regex 1678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p points to a byte string 1679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich utf true if UTF-8 (to be converted to UTF-16) 1680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len number of bytes in the string (excluding trailing zero) 1681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: number of 16-bit data items used (excluding trailing zero) 1683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -1 if a UTF-8 string is malformed 1684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -2 if a value > 0x10ffff is encountered 1685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -3 if a value > 0xffff is encountered when not in UTF mode 1686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 1689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichto16(int data, pcre_uint8 *p, int utf, int len) 1690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *pp; 1692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (buffer16_size < 2*len + 2) 1694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (buffer16 != NULL) free(buffer16); 1696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer16_size = 2*len + 2; 1697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer16 = (pcre_uint16 *)malloc(buffer16_size); 1698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (buffer16 == NULL) 1699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(stderr, "pcretest: malloc(%d) failed for buffer16\n", buffer16_size); 1701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 1702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpp = buffer16; 1706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (!utf && !data) 1708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len-- > 0) *pp++ = *p++; 1710f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1711f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1712f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichelse 1713f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1714f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 c = 0; 1715f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len > 0) 1716f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1717f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int chlen = utf82ord(p, &c); 1718f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (chlen <= 0) return -1; 1719f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0x10ffff) return -2; 1720f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p += chlen; 1721f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len -= chlen; 1722f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c < 0x10000) *pp++ = c; else 1723f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1724f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (!utf) return -3; 1725f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c -= 0x10000; 1726f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp++ = 0xD800 | (c >> 10); 1727f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp++ = 0xDC00 | (c & 0x3ff); 1728f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1729f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1730f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1731f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1732f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*pp = 0; 1733f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn pp - buffer16; 1734f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1735f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1736f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1737f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 1738f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1739f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Convert a string to 32-bit * 1740f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1741f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1742f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* In non-UTF mode, the space needed for a 32-bit string is exactly four times the 1743f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich8-bit size. For a UTF-8 string, the size needed for UTF-32 is no more than four 1744f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichtimes, because up to 0xffff uses no more than 3 bytes in UTF-8 but possibly 4 1745f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin UTF-32. Higher values use 4 bytes in UTF-8 and up to 4 bytes in UTF-32. The 1746f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichresult is always left in buffer32. 1747f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1748f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichNote that this function does not object to surrogate values. This is 1749f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdeliberate; it makes it possible to construct UTF-32 strings that are invalid, 1750f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor the purpose of testing that they are correctly faulted. 1751f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1752f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPatterns to be converted are either plain ASCII or UTF-8; data lines are always 1753f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin UTF-8 so that values greater than 255 can be handled. 1754f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1755f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1756f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich data TRUE if converting a data line; FALSE for a regex 1757f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p points to a byte string 1758f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich utf true if UTF-8 (to be converted to UTF-32) 1759f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len number of bytes in the string (excluding trailing zero) 1760f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1761f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: number of 32-bit data items used (excluding trailing zero) 1762f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -1 if a UTF-8 string is malformed 1763f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -2 if a value > 0x10ffff is encountered 1764f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich OR -3 if an ill-formed value is encountered (i.e. a surrogate) 1765f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1766f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1767f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 1768f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichto32(int data, pcre_uint8 *p, int utf, int len) 1769f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1770f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 *pp; 1771f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1772f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (buffer32_size < 4*len + 4) 1773f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1774f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (buffer32 != NULL) free(buffer32); 1775f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer32_size = 4*len + 4; 1776f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer32 = (pcre_uint32 *)malloc(buffer32_size); 1777f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (buffer32 == NULL) 1778f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1779f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(stderr, "pcretest: malloc(%d) failed for buffer32\n", buffer32_size); 1780f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 1781f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1782f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1783f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1784f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpp = buffer32; 1785f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1786f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (!utf && !data) 1787f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1788f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len-- > 0) *pp++ = *p++; 1789f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1790f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1791f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichelse 1792f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1793f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 c = 0; 1794f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len > 0) 1795f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1796f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int chlen = utf82ord(p, &c); 1797f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (chlen <= 0) return -1; 1798f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (utf) 1799f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1800f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0x10ffff) return -2; 1801f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (!data && (c & 0xfffff800u) == 0xd800u) return -3; 1802f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1803f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1804f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p += chlen; 1805f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len -= chlen; 1806f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp++ = c; 1807f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1808f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1809f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1810f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*pp = 0; 1811f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn pp - buffer32; 1812f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1813f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1814f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Check that a 32-bit character string is valid UTF-32. 1815f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1816f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1817f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich string points to the string 1818f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length length of string, or -1 if the string is zero-terminated 1819f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1820f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: TRUE if the string is a valid UTF-32 string 1821f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FALSE otherwise 1822f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1823f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1824f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef NEVER /* Not used */ 1825f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_UTF 1826f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic BOOL 1827f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvalid_utf32(pcre_uint32 *string, int length) 1828f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1829f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregister pcre_uint32 *p; 1830f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregister pcre_uint32 c; 1831f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1832f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (p = string; length-- > 0; p++) 1833f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1834f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = *p; 1835f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0x10ffffu) return FALSE; /* Too big */ 1836f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((c & 0xfffff800u) == 0xd800u) return FALSE; /* Surrogate */ 1837f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1838f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1839f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn TRUE; 1840f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1841f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_UTF */ 1842f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* NEVER */ 1843f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 1844f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1845f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1846f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1847f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Read or extend an input line * 1848f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1849f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1850f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Input lines are read into buffer, but both patterns and data lines can be 1851f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcontinued over multiple input lines. In addition, if the buffer fills up, we 1852f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwant to automatically expand it so as to be able to handle extremely large 1853f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichlines that are needed for certain stress tests. When the input buffer is 1854f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichexpanded, the other two buffers must also be expanded likewise, and the 1855f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcontents of pbuffer, which are a copy of the input for callouts, must be 1856f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpreserved (for when expansion happens for a data line). This is not the most 1857f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoptimal way of handling this, but hey, this is just a test program! 1858f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1859f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1860f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich f the file to read 1861f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start where in buffer to start (this *must* be within buffer) 1862f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich prompt for stdin or readline() 1863f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1864f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: pointer to the start of new data 1865f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich could be a copy of start, or could be moved 1866f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NULL if no data read and EOF reached 1867f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1868f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1869f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 * 1870f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichextend_inputline(FILE *f, pcre_uint8 *start, const char *prompt) 1871f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1872f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *here = start; 1873f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1874f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (;;) 1875f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1876f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_t rlen = (size_t)(buffer_size - (here - buffer)); 1877f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1878f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rlen > 1000) 1879f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1880f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int dlen; 1881f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1882f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If libreadline or libedit support is required, use readline() to read a 1883f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich line if the input is a terminal. Note that readline() removes the trailing 1884f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich newline, so we must put it back again, to be compatible with fgets(). */ 1885f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1886f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) 1887f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (isatty(fileno(f))) 1888f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1889f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_t len; 1890f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich char *s = readline(prompt); 1891f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (s == NULL) return (here == start)? NULL : start; 1892f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = strlen(s); 1893f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (len > 0) add_history(s); 1894f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (len > rlen - 1) len = rlen - 1; 1895f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich memcpy(here, s, len); 1896f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich here[len] = '\n'; 1897f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich here[len+1] = 0; 1898f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(s); 1899f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1900f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 1901f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 1902f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1903f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Read the next line by normal means, prompting if the file is stdin. */ 1904f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1905f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1906f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f == stdin) printf("%s", prompt); 1907f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fgets((char *)here, rlen, f) == NULL) 1908f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return (here == start)? NULL : start; 1909f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1910f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1911f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dlen = (int)strlen((char *)here); 1912f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dlen > 0 && here[dlen - 1] == '\n') return start; 1913f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich here += dlen; 1914f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1915f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1916f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 1917f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1918f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int new_buffer_size = 2*buffer_size; 1919f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *new_buffer = (pcre_uint8 *)malloc(new_buffer_size); 1920f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *new_pbuffer = (pcre_uint8 *)malloc(new_buffer_size); 1921f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1922f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_buffer == NULL || new_pbuffer == NULL) 1923f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1924f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(stderr, "pcretest: malloc(%d) failed\n", new_buffer_size); 1925f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 1926f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1927f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1928f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich memcpy(new_buffer, buffer, buffer_size); 1929f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich memcpy(new_pbuffer, pbuffer, buffer_size); 1930f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1931f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer_size = new_buffer_size; 1932f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1933f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start = new_buffer + (start - buffer); 1934f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich here = new_buffer + (here - buffer); 1935f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1936f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(buffer); 1937f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(pbuffer); 1938f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1939f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer = new_buffer; 1940f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pbuffer = new_pbuffer; 1941f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1942f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1943f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1944f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Control never gets here */ 1945f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1946f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1947f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1948f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1949f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1950f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Read number from string * 1951f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1952f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1953f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess 1954f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevicharound with conditional compilation, just do the job by hand. It is only used 1955f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor unpicking arguments, so just keep it simple. 1956f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1957f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 1958f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich str string to be converted 1959f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich endptr where to put the end pointer 1960f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1961f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: the unsigned long 1962f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 1963f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1964f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 1965f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichget_value(pcre_uint8 *str, pcre_uint8 **endptr) 1966f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1967f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint result = 0; 1968f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile(*str != 0 && isspace(*str)) str++; 1969f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (isdigit(*str)) result = result * 10 + (int)(*str++ - '0'); 1970f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*endptr = str; 1971f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn(result); 1972f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 1973f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1974f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1975f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1976f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 1977f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Print one character * 1978f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 1979f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1980f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Print a single character either literally, or as a hex escape. */ 1981f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1982f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pchar(pcre_uint32 c, FILE *f) 1983f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 1984f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint n = 0; 1985f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (PRINTOK(c)) 1986f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1987f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f != NULL) fprintf(f, "%c", c); 1988f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return 1; 1989f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1990f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 1991f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (c < 0x100) 1992f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1993f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf) 1994f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 1995f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f != NULL) fprintf(f, "\\x{%02x}", c); 1996f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return 6; 1997f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 1998f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 1999f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2000f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f != NULL) fprintf(f, "\\x%02x", c); 2001f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return 4; 2002f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2003f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2004f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2005f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (f != NULL) n = fprintf(f, "\\x{%02x}", c); 2006f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn n >= 0 ? n : 0; 2007f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2008f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2009f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2010f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2011f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 2012f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2013f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Print 8-bit character string * 2014f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2015f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2016f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Must handle UTF-8 strings in utf8 mode. Yields number of characters printed. 2017f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIf handed a NULL file, just counts chars without printing. */ 2018f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2019f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pchars(pcre_uint8 *p, int length, FILE *f) 2020f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2021f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 c = 0; 2022f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint yield = 0; 2023f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2024f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (length < 0) 2025f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = strlen((char *)p); 2026f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2027f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (length-- > 0) 2028f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2029f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOUTF 2030f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf) 2031f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2032f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc = utf82ord(p, &c); 2033f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc > 0 && rc <= length + 1) /* Mustn't run over the end */ 2034f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2035f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length -= rc - 1; 2036f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p += rc; 2037f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield += pchar(c, f); 2038f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 2039f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2040f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2041f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2042f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = *p++; 2043f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield += pchar(c, f); 2044f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2045f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2046f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn yield; 2047f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2048f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2049f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2050f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2051f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2052f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2053f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2054f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Find length of 0-terminated 16-bit string * 2055f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2056f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2057f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int strlen16(PCRE_SPTR16 p) 2058f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2059f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCRE_SPTR16 pp = p; 2060f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (*pp != 0) pp++; 2061f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (int)(pp - p); 2062f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2063f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 2064f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2065f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2066f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2067f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 2068f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2069f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Find length of 0-terminated 32-bit string * 2070f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2071f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2072f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int strlen32(PCRE_SPTR32 p) 2073f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2074f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCRE_SPTR32 pp = p; 2075f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (*pp != 0) pp++; 2076f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (int)(pp - p); 2077f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2078f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 2079f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2080f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2081f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2082f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2083f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2084f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Print 16-bit character string * 2085f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2086f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2087f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Must handle UTF-16 strings in utf mode. Yields number of characters printed. 2088f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIf handed a NULL file, just counts chars without printing. */ 2089f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2090f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pchars16(PCRE_SPTR16 p, int length, FILE *f) 2091f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2092f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint yield = 0; 2093f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2094f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (length < 0) 2095f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = strlen16(p); 2096f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2097f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (length-- > 0) 2098f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2099f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 c = *p++ & 0xffff; 2100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOUTF 2101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf && c >= 0xD800 && c < 0xDC00 && length > 0) 2102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int d = *p & 0xffff; 2104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (d >= 0xDC00 && d <= 0xDFFF) 2105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = ((c & 0x3ff) << 10) + (d & 0x3ff) + 0x10000; 2107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length--; 2108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 2109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield += pchar(c, f); 2113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn yield; 2116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 2118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 2122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Print 32-bit character string * 2124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Must handle UTF-32 strings in utf mode. Yields number of characters printed. 2127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIf handed a NULL file, just counts chars without printing. */ 2128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int pchars32(PCRE_SPTR32 p, int length, BOOL utf, FILE *f) 2130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint yield = 0; 2132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich(void)(utf); /* Avoid compiler warning */ 2134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (length < 0) 2136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = strlen32(p); 2137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (length-- > 0) 2139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 c = *p++; 2141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield += pchar(c, f); 2142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn yield; 2145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 2147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 2151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Read a capture name (8-bit) and check it * 2153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 * 2156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichread_capture_name8(pcre_uint8 *p, pcre_uint8 **pp, pcre *re) 2157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *npp = *pp; 2159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (isalnum(*p)) *npp++ = *p++; 2160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp++ = 0; 2161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp = 0; 2162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (pcre_get_stringnumber(re, (char *)(*pp)) < 0) 2163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "no parentheses with name \""); 2165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(*pp, 0, -1, outfile); 2166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\"\n"); 2167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*pp = npp; 2170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn p; 2171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE8 */ 2173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Read a capture name (16-bit) and check it * 2179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Note that the text being read is 8-bit. */ 2182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 * 2184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichread_capture_name16(pcre_uint8 *p, pcre_uint16 **pp, pcre *re) 2185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *npp = *pp; 2187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (isalnum(*p)) *npp++ = *p++; 2188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp++ = 0; 2189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp = 0; 2190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (pcre16_get_stringnumber((pcre16 *)re, (PCRE_SPTR16)(*pp)) < 0) 2191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "no parentheses with name \""); 2193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(*pp, 0, -1, outfile); 2194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\"\n"); 2195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*pp = npp; 2197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn p; 2198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 2200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 2204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Read a capture name (32-bit) and check it * 2206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Note that the text being read is 8-bit. */ 2209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint8 * 2211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichread_capture_name32(pcre_uint8 *p, pcre_uint32 **pp, pcre *re) 2212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 *npp = *pp; 2214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (isalnum(*p)) *npp++ = *p++; 2215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp++ = 0; 2216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*npp = 0; 2217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (pcre32_get_stringnumber((pcre32 *)re, (PCRE_SPTR32)(*pp)) < 0) 2218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "no parentheses with name \""); 2220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(*pp, 0, -1, outfile); 2221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\"\n"); 2222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*pp = npp; 2224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn p; 2225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 2227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Stack guard function * 2232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Called from PCRE when set in pcre_stack_guard. We give an error (non-zero) 2235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn when a count overflows. */ 2236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int stack_guard(void) 2238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn stack_guard_return; 2240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Callout function * 2244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Called from PCRE as a result of the (?C) item. We print out where we are in 2247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe match. Yield zero unless more callouts than the fail count, or the callout 2248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdata is not zero. */ 2249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int callout(pcre_callout_block *cb) 2251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichFILE *f = (first_callout | callout_extra)? outfile : NULL; 2253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint i, pre_start, post_start, subject_length; 2254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (callout_extra) 2256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(f, "Callout %d: last capture = %d\n", 2258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cb->callout_number, cb->capture_last); 2259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < cb->capture_top * 2; i += 2) 2261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (cb->offset_vector[i] < 0) 2263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(f, "%2d: <unset>\n", i/2); 2264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 2265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(f, "%2d: ", i/2); 2267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(cb->subject, cb->offset_vector[i], 2268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cb->offset_vector[i+1] - cb->offset_vector[i], f); 2269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(f, "\n"); 2270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Re-print the subject in canonical form, the first time or if giving full 2275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdatails. On subsequent calls in the same match, we use pchars just to find the 2276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprinted lengths of the substrings. */ 2277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (f != NULL) fprintf(f, "--->"); 2279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCHARS(pre_start, cb->subject, 0, cb->start_match, f); 2281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCHARS(post_start, cb->subject, cb->start_match, 2282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cb->current_position - cb->start_match, f); 2283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL); 2285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCHARSV(cb->subject, cb->current_position, 2287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cb->subject_length - cb->current_position, f); 2288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (f != NULL) fprintf(f, "\n"); 2290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Always print appropriate indicators, with callout number if not already 2292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichshown. For automatic callouts, show the pattern offset. */ 2293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (cb->callout_number == 255) 2295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%+3d ", cb->pattern_position); 2297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (cb->pattern_position > 99) fprintf(outfile, "\n "); 2298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichelse 2300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (callout_extra) fprintf(outfile, " "); 2302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else fprintf(outfile, "%3d ", cb->callout_number); 2303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (i = 0; i < pre_start; i++) fprintf(outfile, " "); 2306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfprintf(outfile, "^"); 2307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (post_start > 0) 2309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < post_start - 1; i++) fprintf(outfile, " "); 2311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "^"); 2312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (i = 0; i < subject_length - pre_start - post_start + 4; i++) 2315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " "); 2316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfprintf(outfile, "%.*s", (cb->next_item_length == 0)? 1 : cb->next_item_length, 2318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pbuffer + cb->pattern_position); 2319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfprintf(outfile, "\n"); 2321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfirst_callout = 0; 2322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (cb->mark != last_callout_mark) 2324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (cb->mark == NULL) 2326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Latest Mark: <unset>\n"); 2327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 2328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Latest Mark: "); 2330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(cb->mark, 0, -1, outfile); 2331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich putc('\n', outfile); 2332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich last_callout_mark = cb->mark; 2334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (cb->callout_data != NULL) 2337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int callout_data = *((int *)(cb->callout_data)); 2339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (callout_data != 0) 2340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Callout data = %d\n", callout_data); 2342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return callout_data; 2343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (cb->callout_number != callout_fail_id)? 0 : 2347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (++callout_count >= callout_fail_count)? 1 : 0; 2348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Local malloc functions * 2353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Alternative malloc function, to test functionality and save the size of a 2356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcompiled re, which is the first store request that pcre_compile() makes. The 2357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichshow_malloc variable is set only during matching. */ 2358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void *new_malloc(size_t size) 2360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid *block = malloc(size); 2362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (show_malloc) 2363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "malloc %3d %p\n", (int)size, block); 2364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn block; 2365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void new_free(void *block) 2368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (show_malloc) 2370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "free %p\n", block); 2371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(block); 2372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* For recursion malloc/free, to test stacking calls */ 2375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void *stack_malloc(size_t size) 2377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvoid *block = malloc(size); 2379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (show_malloc) 2380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "stack_malloc %3d %p\n", (int)size, block); 2381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn block; 2382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void stack_free(void *block) 2385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (show_malloc) 2387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "stack_free %p\n", block); 2388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(block); 2389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Call pcre_fullinfo() * 2394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Get one piece of information from the pcre_fullinfo() function. When only 2397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichone of 8-, 16- or 32-bit is supported, pcre_mode should always have the correct 2398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvalue, but the code is defensive. 2399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 2401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich re compiled regex 2402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study study data 2403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich option PCRE_INFO_xxx option 2404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr where to put the data 2405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: 0 when OK, < 0 on error 2407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 2408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 2410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichnew_info(pcre *re, pcre_extra *study, int option, void *ptr) 2411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint rc; 2413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (pcre_mode == PCRE32_MODE) 2415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 2416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre32_fullinfo((pcre32 *)re, (pcre32_extra *)study, option, ptr); 2417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 2418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = PCRE_ERROR_BADMODE; 2419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichelse if (pcre_mode == PCRE16_MODE) 2421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre16_fullinfo((pcre16 *)re, (pcre16_extra *)study, option, ptr); 2423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 2424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = PCRE_ERROR_BADMODE; 2425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichelse 2427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 2428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = pcre_fullinfo(re, study, option, ptr); 2429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 2430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = PCRE_ERROR_BADMODE; 2431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (rc < 0 && rc != PCRE_ERROR_UNSET) 2434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc, 2436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "", option); 2437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc == PCRE_ERROR_BADMODE) 2438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Running in %d-bit mode but pattern was compiled in " 2439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "%d-bit mode\n", 8 * CHAR_SIZE, 2440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8 * (REAL_PCRE_FLAGS(re) & PCRE_MODE_MASK)); 2441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn rc; 2444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Swap byte functions * 2450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The following functions swap the bytes of a pcre_uint16 and pcre_uint32 2453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichvalue, respectively. 2454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 2456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich value any number 2457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: the byte swapped value 2459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 2460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint32 2462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichswap_uint32(pcre_uint32 value) 2463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn ((value & 0x000000ff) << 24) | 2465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((value & 0x0000ff00) << 8) | 2466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((value & 0x00ff0000) >> 8) | 2467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (value >> 24); 2468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic pcre_uint16 2471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichswap_uint16(pcre_uint16 value) 2472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (value >> 8) | (value << 8); 2474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Flip bytes in a compiled pattern * 2480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This function is called if the 'F' option was present on a pattern that is 2483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichto be written to a file. We flip the bytes of all the integer fields in the 2484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregex data block and the study block. In 16-bit mode this also flips relevant 2485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichbytes in the pattern itself. This is to make it possible to test PCRE's 2486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichability to reload byte-flipped patterns, e.g. those compiled on a different 2487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevicharchitecture. */ 2488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16 2490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void 2491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregexflip8_or_16(pcre *ere, pcre_extra *extra) 2492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreal_pcre8_or_16 *re = (real_pcre8_or_16 *)ere; 2494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint op; 2496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *ptr = (pcre_uint16 *)re + re->name_table_offset; 2497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint length = re->name_count * re->name_entry_size; 2498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_UTF 2499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichBOOL utf = (re->options & PCRE_UTF16) != 0; 2500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichBOOL utf16_char = FALSE; 2501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_UTF */ 2502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 2503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Always flip the bytes in the main data block and study blocks. */ 2505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->magic_number = REVERSED_MAGIC_NUMBER; 2507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->size = swap_uint32(re->size); 2508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->options = swap_uint32(re->options); 2509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->flags = swap_uint32(re->flags); 2510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->limit_match = swap_uint32(re->limit_match); 2511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->limit_recursion = swap_uint32(re->limit_recursion); 2512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->first_char = swap_uint16(re->first_char); 2513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->req_char = swap_uint16(re->req_char); 2514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->max_lookbehind = swap_uint16(re->max_lookbehind); 2515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->top_bracket = swap_uint16(re->top_bracket); 2516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->top_backref = swap_uint16(re->top_backref); 2517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_table_offset = swap_uint16(re->name_table_offset); 2518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_entry_size = swap_uint16(re->name_entry_size); 2519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_count = swap_uint16(re->name_count); 2520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->ref_count = swap_uint16(re->ref_count); 2521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (extra != NULL) 2523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_study_data *rsd = (pcre_study_data *)(extra->study_data); 2525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->size = swap_uint32(rsd->size); 2526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->flags = swap_uint32(rsd->flags); 2527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->minlength = swap_uint32(rsd->minlength); 2528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* In 8-bit mode, that is all we need to do. In 16-bit mode we must swap bytes 2531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichin the name table, if present, and then in the pattern itself. */ 2532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (pcre_mode != PCRE16_MODE) return; 2535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile(TRUE) 2537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Swap previous characters. */ 2539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (length-- > 0) 2540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint16(*ptr); 2542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_UTF 2545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (utf16_char) 2546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((ptr[-1] & 0xfc00) == 0xd800) 2548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* We know that there is only one extra character in UTF-16. */ 2550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint16(*ptr); 2551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich utf16_char = FALSE; 2555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_UTF */ 2556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Get next opcode. */ 2558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = 0; 2560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op = *ptr; 2561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr++ = swap_uint16(op); 2562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (op) 2564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_END: 2566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return; 2567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_UTF 2569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_CHAR: 2570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_CHARI: 2571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOT: 2572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTI: 2573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_STAR: 2574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINSTAR: 2575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_PLUS: 2576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINPLUS: 2577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_QUERY: 2578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINQUERY: 2579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_UPTO: 2580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINUPTO: 2581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_EXACT: 2582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSSTAR: 2583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSPLUS: 2584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSQUERY: 2585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSUPTO: 2586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_STARI: 2587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINSTARI: 2588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_PLUSI: 2589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINPLUSI: 2590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_QUERYI: 2591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINQUERYI: 2592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_UPTOI: 2593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_MINUPTOI: 2594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_EXACTI: 2595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSSTARI: 2596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSPLUSI: 2597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSQUERYI: 2598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_POSUPTOI: 2599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTSTAR: 2600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINSTAR: 2601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPLUS: 2602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINPLUS: 2603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTQUERY: 2604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINQUERY: 2605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTUPTO: 2606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINUPTO: 2607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTEXACT: 2608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSSTAR: 2609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSPLUS: 2610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSQUERY: 2611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSUPTO: 2612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTSTARI: 2613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINSTARI: 2614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPLUSI: 2615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINPLUSI: 2616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTQUERYI: 2617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINQUERYI: 2618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTUPTOI: 2619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTMINUPTOI: 2620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTEXACTI: 2621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSSTARI: 2622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSPLUSI: 2623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSQUERYI: 2624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NOTPOSUPTOI: 2625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (utf) utf16_char = TRUE; 2626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Fall through. */ 2628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 2630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = OP_lengths16[op] - 1; 2631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_CLASS: 2634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NCLASS: 2635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Skip the character bit map. */ 2636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr += 32/sizeof(pcre_uint16); 2637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = 0; 2638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_XCLASS: 2641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* LINK_SIZE can be 1 or 2 in 16 bit mode. */ 2642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (LINK_SIZE > 1) 2643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = (int)((((unsigned int)(ptr[0]) << 16) | (unsigned int)(ptr[1])) 2644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich - (1 + LINK_SIZE + 1)); 2645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 2646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1)); 2647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Reverse the size of the XCLASS instance. */ 2649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint16(*ptr); 2650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (LINK_SIZE > 1) 2652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint16(*ptr); 2654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op = *ptr; 2658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint16(op); 2659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((op & XCL_MAP) != 0) 2661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Skip the character bit map. */ 2663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr += 32/sizeof(pcre_uint16); 2664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length -= 32/sizeof(pcre_uint16); 2665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Control should never reach here in 16 bit mode. */ 2670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE16 */ 2671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE[8|16] */ 2673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE32 2677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void 2678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregexflip_32(pcre *ere, pcre_extra *extra) 2679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreal_pcre32 *re = (real_pcre32 *)ere; 2681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint op; 2682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 *ptr = (pcre_uint32 *)re + re->name_table_offset; 2683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint length = re->name_count * re->name_entry_size; 2684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Always flip the bytes in the main data block and study blocks. */ 2686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->magic_number = REVERSED_MAGIC_NUMBER; 2688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->size = swap_uint32(re->size); 2689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->options = swap_uint32(re->options); 2690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->flags = swap_uint32(re->flags); 2691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->limit_match = swap_uint32(re->limit_match); 2692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->limit_recursion = swap_uint32(re->limit_recursion); 2693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->first_char = swap_uint32(re->first_char); 2694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->req_char = swap_uint32(re->req_char); 2695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->max_lookbehind = swap_uint16(re->max_lookbehind); 2696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->top_bracket = swap_uint16(re->top_bracket); 2697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->top_backref = swap_uint16(re->top_backref); 2698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_table_offset = swap_uint16(re->name_table_offset); 2699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_entry_size = swap_uint16(re->name_entry_size); 2700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->name_count = swap_uint16(re->name_count); 2701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichre->ref_count = swap_uint16(re->ref_count); 2702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (extra != NULL) 2704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_study_data *rsd = (pcre_study_data *)(extra->study_data); 2706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->size = swap_uint32(rsd->size); 2707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->flags = swap_uint32(rsd->flags); 2708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rsd->minlength = swap_uint32(rsd->minlength); 2709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2710f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2711f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* In 32-bit mode we must swap bytes in the name table, if present, and then in 2712f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe pattern itself. */ 2713f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2714f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile(TRUE) 2715f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2716f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Swap previous characters. */ 2717f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (length-- > 0) 2718f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2719f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint32(*ptr); 2720f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2721f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2722f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2723f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Get next opcode. */ 2724f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2725f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = 0; 2726f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op = *ptr; 2727f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr++ = swap_uint32(op); 2728f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2729f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (op) 2730f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2731f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_END: 2732f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return; 2733f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2734f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 2735f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = OP_lengths32[op] - 1; 2736f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2737f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2738f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_CLASS: 2739f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_NCLASS: 2740f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Skip the character bit map. */ 2741f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr += 32/sizeof(pcre_uint32); 2742f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = 0; 2743f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2744f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2745f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case OP_XCLASS: 2746f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* LINK_SIZE can only be 1 in 32-bit mode. */ 2747f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length = (int)((unsigned int)(ptr[0]) - (1 + LINK_SIZE + 1)); 2748f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2749f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Reverse the size of the XCLASS instance. */ 2750f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint32(*ptr); 2751f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2752f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2753f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op = *ptr; 2754f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ptr = swap_uint32(op); 2755f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr++; 2756f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((op & XCL_MAP) != 0) 2757f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2758f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Skip the character bit map. */ 2759f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ptr += 32/sizeof(pcre_uint32); 2760f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich length -= 32/sizeof(pcre_uint32); 2761f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2762f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2763f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2764f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2765f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Control should never reach here in 32 bit mode. */ 2766f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2767f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2768f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* SUPPORT_PCRE32 */ 2769f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2770f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2771f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2772f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void 2773f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichregexflip(pcre *ere, pcre_extra *extra) 2774f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2775f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE32 2776f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_FLAGS(ere) & PCRE_MODE32) 2777f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich regexflip_32(ere, extra); 2778f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2779f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE8 || defined SUPPORT_PCRE16 2780f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_FLAGS(ere) & (PCRE_MODE8 | PCRE_MODE16)) 2781f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich regexflip8_or_16(ere, extra); 2782f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2783f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2784f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2785f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2786f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2787f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2788f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Check match or recursion limit * 2789f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2790f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2791f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 2792f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcheck_match_limit(pcre *re, pcre_extra *extra, pcre_uint8 *bptr, int len, 2793f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int start_offset, int options, int *use_offsets, int use_size_offsets, 2794f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int flag, unsigned long int *limit, int errnumber, const char *msg) 2795f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2796f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint count; 2797f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint min = 0; 2798f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint mid = 64; 2799f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint max = -1; 2800f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2801f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichextra->flags |= flag; 2802f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2803f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor (;;) 2804f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2805f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *limit = mid; 2806f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2807f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC(count, re, extra, bptr, len, start_offset, options, 2808f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets, use_size_offsets); 2809f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2810f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count == errnumber) 2811f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2812f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ 2813f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich min = mid; 2814f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2; 2815f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2816f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2817f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (count >= 0 || count == PCRE_ERROR_NOMATCH || 2818f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count == PCRE_ERROR_PARTIAL) 2819f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2820f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (mid == min + 1) 2821f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2822f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Minimum %s limit = %d\n", msg, mid); 2823f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 2824f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2825f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ 2826f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich max = mid; 2827f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich mid = (min + mid)/2; 2828f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2829f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else break; /* Some other error */ 2830f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2831f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2832f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichextra->flags &= ~flag; 2833f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn count; 2834f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2835f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2836f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2837f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2838f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2839f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Case-independent strncmp() function * 2840f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2841f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2842f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* 2843f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 2844f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich s first string 2845f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich t second string 2846f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich n number of characters to compare 2847f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2848f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: < 0, = 0, or > 0, according to the comparison 2849f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 2850f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2851f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 2852f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstrncmpic(pcre_uint8 *s, pcre_uint8 *t, int n) 2853f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2854f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (n--) 2855f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2856f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int c = tolower(*s++) - tolower(*t++); 2857f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c) return c; 2858f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2859f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn 0; 2860f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2861f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2862f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2863f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2864f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2865f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Check multicharacter option * 2866f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2867f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2868f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This is used both at compile and run-time to check for <xxx> escapes. Print 2869f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevicha message and return 0 if there is no match. 2870f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2871f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichArguments: 2872f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p points after the leading '<' 2873f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich f file for error message 2874f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich nl TRUE to check only for newline settings 2875f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich stype "modifier" or "escape sequence" 2876f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2877f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichReturns: appropriate PCRE_NEWLINE_xxx flags, or 0 2878f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 2879f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2880f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic int 2881f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichcheck_mc_option(pcre_uint8 *p, FILE *f, BOOL nl, const char *stype) 2882f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2883f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"cr>", 3) == 0) return PCRE_NEWLINE_CR; 2884f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"lf>", 3) == 0) return PCRE_NEWLINE_LF; 2885f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF; 2886f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF; 2887f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"any>", 4) == 0) return PCRE_NEWLINE_ANY; 2888f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"bsr_anycrlf>", 12) == 0) return PCRE_BSR_ANYCRLF; 2889f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (strncmpic(p, (pcre_uint8 *)"bsr_unicode>", 12) == 0) return PCRE_BSR_UNICODE; 2890f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2891f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (!nl) 2892f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 2893f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (strncmpic(p, (pcre_uint8 *)"JS>", 3) == 0) return PCRE_JAVASCRIPT_COMPAT; 2894f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 2895f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2896f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfprintf(f, "Unknown %s at: <%s\n", stype, p); 2897f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn 0; 2898f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2899f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2900f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2901f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2902f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2903f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Usage function * 2904f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2905f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2906f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstatic void 2907f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichusage(void) 2908f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2909f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("Usage: pcretest [options] [<input file> [<output file>]]\n\n"); 2910f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("Input and output default to stdin and stdout.\n"); 2911f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(SUPPORT_LIBREADLINE) || defined(SUPPORT_LIBEDIT) 2912f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("If input is a terminal, readline() is used to read from it.\n"); 2913f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 2914f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("This version of pcretest is not linked with readline().\n"); 2915f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2916f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf("\nOptions:\n"); 2917f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 2918f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -16 use the 16-bit library\n"); 2919f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2920f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 2921f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -32 use the 32-bit library\n"); 2922f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2923f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -b show compiled code\n"); 2924f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -C show PCRE compile-time options and exit\n"); 2925f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -C arg show a specific compile-time option and exit\n"); 2926f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" with its value if numeric (else 0). The arg can be:\n"); 2927f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" linksize internal link size [2, 3, 4]\n"); 2928f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" pcre8 8 bit library support enabled [0, 1]\n"); 2929f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" pcre16 16 bit library support enabled [0, 1]\n"); 2930f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" pcre32 32 bit library support enabled [0, 1]\n"); 2931f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" utf Unicode Transformation Format supported [0, 1]\n"); 2932f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" ucp Unicode Properties supported [0, 1]\n"); 2933f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" jit Just-in-time compiler supported [0, 1]\n"); 2934f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" newline Newline type [CR, LF, CRLF, ANYCRLF, ANY]\n"); 2935f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" bsr \\R type [ANYCRLF, ANY]\n"); 2936f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -d debug: show compiled code and information (-b and -i)\n"); 2937f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 2938f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -dfa force DFA matching for all subjects\n"); 2939f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2940f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -help show usage information\n"); 2941f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -i show information about compiled patterns\n" 2942f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -M find MATCH_LIMIT minimum for each subject\n" 2943f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -m output memory used information\n" 2944f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -O set PCRE_NO_AUTO_POSSESS on each pattern\n" 2945f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -o <n> set size of offsets vector to <n>\n"); 2946f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 2947f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -p use POSIX interface\n"); 2948f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 2949f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -q quiet: do not output PCRE version number at start\n"); 2950f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -S <n> set stack size to <n> megabytes\n"); 2951f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -s force each pattern to be studied at basic level\n" 2952f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -s+ force each pattern to be studied, using JIT if available\n" 2953f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -s++ ditto, verifying when JIT was actually used\n" 2954f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -s+n force each pattern to be studied, using JIT if available,\n" 2955f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " where 1 <= n <= 7 selects JIT options\n" 2956f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -s++n ditto, verifying when JIT was actually used\n" 2957f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " -t time compilation and execution\n"); 2958f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -t <n> time compilation and execution, repeating <n> times\n"); 2959f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -tm time execution (matching) only\n"); 2960f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -tm <n> time execution (matching) only, repeating <n> times\n"); 2961f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -T same as -t, but show total times at the end\n"); 2962f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichprintf(" -TM same as -tm, but show total time at the end\n"); 2963f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 2964f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2965f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2966f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2967f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2968f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Main Program * 2969f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 2970f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2971f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Read lines from named file or stdin and write to named file or stdout; lines 2972f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichconsist of a regular expression, in delimiters and optionally followed by 2973f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoptions, followed by a set of test data, terminated by an empty line. */ 2974f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 2975f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint main(int argc, char **argv) 2976f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 2977f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichFILE *infile = stdin; 2978f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichconst char *version; 2979f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint options = 0; 2980f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint study_options = 0; 2981f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint default_find_match_limit = FALSE; 2982f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 default_options = 0; 2983f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint op = 1; 2984f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint timeit = 0; 2985f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint timeitm = 0; 2986f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint showtotaltimes = 0; 2987f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint showinfo = 0; 2988f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint showstore = 0; 2989f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint force_study = -1; 2990f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint force_study_options = 0; 2991f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint quiet = 0; 2992f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint size_offsets = 45; 2993f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint size_offsets_max; 2994f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint *offsets = NULL; 2995f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint debug = 0; 2996f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint done = 0; 2997f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint all_use_dfa = 0; 2998f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint verify_jit = 0; 2999f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint yield = 0; 3000f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint stack_size; 3001f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *dbuffer = NULL; 3002f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 lockout[24] = { 0 }; 3003f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsize_t dbuffer_size = 1u << 14; 3004f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichclock_t total_compile_time = 0; 3005f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichclock_t total_study_time = 0; 3006f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichclock_t total_match_time = 0; 3007f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3008f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 3009f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint posix = 0; 3010f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3011f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 3012f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichint *dfa_workspace = NULL; 3013f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3014f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3015f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_jit_stack *jit_stack = NULL; 3016f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3017f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* These vectors store, end-to-end, a list of zero-terminated captured 3018f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsubstring names, each list itself being terminated by an empty name. Assume 3019f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthat 1024 is plenty long enough for the few names we'll be testing. It is 3020f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevicheasiest to keep separate 8-, 16- and 32-bit versions, using the 32-bit version 3021f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfor the actual memory, to ensure alignment. */ 3022f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3023f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 copynames[1024]; 3024f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 getnames[1024]; 3025f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3026f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3027f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 *cn32ptr; 3028f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint32 *gn32ptr; 3029f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3030f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3031f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3032f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *copynames16 = (pcre_uint16 *)copynames; 3033f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *getnames16 = (pcre_uint16 *)getnames; 3034f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *cn16ptr; 3035f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint16 *gn16ptr; 3036f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3037f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3038f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3039f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *copynames8 = (pcre_uint8 *)copynames; 3040f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *getnames8 = (pcre_uint8 *)getnames; 3041f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *cn8ptr; 3042f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_uint8 *gn8ptr; 3043f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3044f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3045f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Get buffers from malloc() so that valgrind will check their misuse when 3046f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichdebugging. They grow automatically when very long lines are read. The 16- 3047f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichand 32-bit buffers (buffer16, buffer32) are obtained only if needed. */ 3048f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3049f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichbuffer = (pcre_uint8 *)malloc(buffer_size); 3050f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpbuffer = (pcre_uint8 *)malloc(buffer_size); 3051f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3052f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The outfile variable is static so that new_malloc can use it. */ 3053f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3054f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoutfile = stdout; 3055f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3056f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* The following _setmode() stuff is some Windows magic that tells its runtime 3057f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichlibrary to translate CRLF into a single LF character. At least, that's what 3058f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichI've been told: never having used Windows I take this all on trust. Originally 3059f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichit set 0x8000, but then I was advised that _O_BINARY was better. */ 3060f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3061f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(_WIN32) || defined(WIN32) 3062f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich_setmode( _fileno( stdout ), _O_BINARY ); 3063f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3064f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3065f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Get the version number: both pcre_version() and pcre16_version() give the 3066f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsame answer. We just need to ensure that we call one that is available. */ 3067f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3068f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined SUPPORT_PCRE8 3069f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichversion = pcre_version(); 3070f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE16 3071f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichversion = pcre16_version(); 3072f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined SUPPORT_PCRE32 3073f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichversion = pcre32_version(); 3074f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3075f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3076f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Scan options */ 3077f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3078f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (argc > 1 && argv[op][0] == '-') 3079f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3080f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *endptr; 3081f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich char *arg = argv[op]; 3082f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3083f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (strcmp(arg, "-m") == 0) showstore = 1; 3084f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-s") == 0) force_study = 0; 3085f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3086f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strncmp(arg, "-s+", 3) == 0) 3087f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3088f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich arg += 3; 3089f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*arg == '+') { arg++; verify_jit = TRUE; } 3090f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich force_study = 1; 3091f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*arg == 0) 3092f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich force_study_options = jit_study_bits[6]; 3093f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*arg >= '1' && *arg <= '7') 3094f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich force_study_options = jit_study_bits[*arg - '1']; 3095f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else goto BAD_ARG; 3096f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3097f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-8") == 0) 3098f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3099f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_mode = PCRE8_MODE; 3101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** This version of PCRE was built without 8-bit support\n"); 3103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 3104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-16") == 0) 3107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_mode = PCRE16_MODE; 3110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** This version of PCRE was built without 16-bit support\n"); 3112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 3113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-32") == 0) 3116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_mode = PCRE32_MODE; 3119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** This version of PCRE was built without 32-bit support\n"); 3121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 3122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-q") == 0) quiet = 1; 3125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-b") == 0) debug = 1; 3126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-i") == 0) showinfo = 1; 3127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-d") == 0) showinfo = debug = 1; 3128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-M") == 0) default_find_match_limit = TRUE; 3129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-O") == 0) default_options |= PCRE_NO_AUTO_POSSESS; 3130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 3131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-dfa") == 0) all_use_dfa = 1; 3132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-o") == 0 && argc > 2 && 3134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((size_offsets = get_value((pcre_uint8 *)argv[op+1], &endptr)), 3135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *endptr == 0)) 3136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op++; 3138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich argc--; 3139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-t") == 0 || strcmp(arg, "-tm") == 0 || 3141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich strcmp(arg, "-T") == 0 || strcmp(arg, "-TM") == 0) 3142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int temp; 3144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int both = arg[2] == 0; 3145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich showtotaltimes = arg[1] == 'T'; 3146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (argc > 2 && (temp = get_value((pcre_uint8 *)argv[op+1], &endptr), 3147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *endptr == 0)) 3148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich timeitm = temp; 3150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op++; 3151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich argc--; 3152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else timeitm = LOOPREPEAT; 3154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (both) timeit = timeitm; 3155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-S") == 0 && argc > 2 && 3157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((stack_size = get_value((pcre_uint8 *)argv[op+1], &endptr)), 3158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *endptr == 0)) 3159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(_WIN32) || defined(WIN32) || defined(__minix) || defined(NATIVE_ZOS) || defined(__VMS) 3161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("PCRE: -S not supported on this OS\n"); 3162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 3163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 3165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich struct rlimit rlim; 3166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getrlimit(RLIMIT_STACK, &rlim); 3167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rlim.rlim_cur = stack_size * 1024 * 1024; 3168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = setrlimit(RLIMIT_STACK, &rlim); 3169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc != 0) 3170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("PCRE: setrlimit() failed with error %d\n", rc); 3172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 3173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op++; 3175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich argc--; 3176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 3179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-p") == 0) posix = 1; 3180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-C") == 0) 3182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 3184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unsigned long int lrc; 3185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (argc > 2) 3187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (strcmp(argv[op + 1], "linksize") == 0) 3189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc); 3191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("%d\n", rc); 3192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = rc; 3193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 3195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vms_setsymbol("LINKSIZE",0,yield ); 3196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "pcre8") == 0) 3199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("1\n"); 3202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0\n"); 3205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 0; 3206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 3208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vms_setsymbol("PCRE8",0,yield ); 3209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "pcre16") == 0) 3212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("1\n"); 3215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0\n"); 3218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 0; 3219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 3221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vms_setsymbol("PCRE16",0,yield ); 3222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "pcre32") == 0) 3225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("1\n"); 3228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0\n"); 3231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 0; 3232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 3234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vms_setsymbol("PCRE32",0,yield ); 3235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "utf") == 0) 3238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 3241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre_config(PCRE_CONFIG_UTF8, &rc); 3242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 3245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre16_config(PCRE_CONFIG_UTF16, &rc); 3246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 3249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre32_config(PCRE_CONFIG_UTF32, &rc); 3250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("%d\n", rc); 3252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = rc; 3253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef __VMS 3254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich vms_setsymbol("UTF",0,yield ); 3255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "ucp") == 0) 3258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); 3260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("%d\n", rc); 3261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = rc; 3262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "jit") == 0) 3264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc); 3266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("%d\n", rc); 3267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = rc; 3268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "newline") == 0) 3270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc); 3272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich print_newline_config(rc, TRUE); 3273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "bsr") == 0) 3275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc); 3277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("%s\n", rc? "ANYCRLF" : "ANY"); 3278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "ebcdic") == 0) 3280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef EBCDIC 3282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("1\n"); 3283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0\n"); 3286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(argv[op + 1], "ebcdic-nl") == 0) 3289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef EBCDIC 3291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0x%02x\n", CHAR_LF); 3292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 3293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("0\n"); 3294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("Unknown -C option: %s\n", argv[op + 1]); 3299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* No argument for -C: output all configuration information. */ 3304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("PCRE version %s\n", version); 3306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("Compiled with\n"); 3307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef EBCDIC 3309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" EBCDIC code support: LF is 0x%02x\n", CHAR_LF); 3310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* At least one of SUPPORT_PCRE8 and SUPPORT_PCRE16 will be set. If both 3313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichare set, either both UTFs are supported or both are not supported. */ 3314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" 8-bit support\n"); 3317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre_config(PCRE_CONFIG_UTF8, &rc); 3318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf (" %sUTF-8 support\n", rc ? "" : "No "); 3319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" 16-bit support\n"); 3322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre16_config(PCRE_CONFIG_UTF16, &rc); 3323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf (" %sUTF-16 support\n", rc ? "" : "No "); 3324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" 32-bit support\n"); 3327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)pcre32_config(PCRE_CONFIG_UTF32, &rc); 3328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf (" %sUTF-32 support\n", rc ? "" : "No "); 3329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); 3332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" %sUnicode properties support\n", rc? "" : "No "); 3333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_JIT, &rc); 3334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc) 3335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *arch; 3337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_JITTARGET, (void *)(&arch)); 3338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Just-in-time compiler support: %s\n", arch); 3339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" No just-in-time compiler support\n"); 3342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &rc); 3343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich print_newline_config(rc, FALSE); 3344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_BSR, &rc); 3345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" \\R matches %s\n", rc? "CR, LF, or CRLF only" : 3346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "all Unicode newlines"); 3347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_LINK_SIZE, &rc); 3348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Internal link size = %d\n", rc); 3349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc); 3350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" POSIX malloc threshold = %d\n", rc); 3351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_PARENS_LIMIT, &lrc); 3352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Parentheses nest limit = %ld\n", lrc); 3353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT, &lrc); 3354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Default match limit = %ld\n", lrc); 3355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &lrc); 3356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Default recursion depth limit = %ld\n", lrc); 3357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_STACKRECURSE, &rc); 3358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(" Match recursion uses %s", rc? "stack" : "heap"); 3359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (showstore) 3360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC(stack_size, NULL, NULL, NULL, -999, -999, 0, NULL, 0); 3362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf(": %sframe size = %d bytes", rc? "approximate " : "", -stack_size); 3363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("\n"); 3365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (strcmp(arg, "-help") == 0 || 3368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich strcmp(arg, "--help") == 0) 3369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich usage(); 3371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich BAD_ARG: 3376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Unknown or malformed option %s\n", arg); 3377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich usage(); 3378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich op++; 3382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich argc--; 3383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Get the store for the offsets vector, and remember what it was */ 3386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichsize_offsets_max = size_offsets; 3388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichoffsets = (int *)malloc(size_offsets_max * sizeof(int)); 3389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (offsets == NULL) 3390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Failed to get %d bytes of memory for offsets vector\n", 3392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (int)(size_offsets_max * sizeof(int))); 3393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Sort out the input and output files */ 3398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (argc > 1) 3400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich infile = fopen(argv[op], INPUT_MODE); 3402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (infile == NULL) 3403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Failed to open %s\n", argv[op]); 3405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (argc > 2) 3411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich outfile = fopen(argv[op+1], OUTPUT_MODE); 3413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (outfile == NULL) 3414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Failed to open %s\n", argv[op+1]); 3416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Set alternative malloc function */ 3422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 3424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_malloc = new_malloc; 3425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_free = new_free; 3426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_stack_malloc = stack_malloc; 3427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_stack_free = stack_free; 3428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre16_malloc = new_malloc; 3432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre16_free = new_free; 3433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre16_stack_malloc = stack_malloc; 3434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre16_stack_free = stack_free; 3435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre32_malloc = new_malloc; 3439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre32_free = new_free; 3440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre32_stack_malloc = stack_malloc; 3441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre32_stack_free = stack_free; 3442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Heading line unless quiet */ 3445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (!quiet) fprintf(outfile, "PCRE version %s\n\n", version); 3447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* Main loop */ 3449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichwhile (!done) 3451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre *re = NULL; 3453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_extra *extra = NULL; 3454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX /* There are still compilers that require no indent */ 3456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich regex_t preg; 3457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_posix = 0; 3458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *error; 3461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *markptr; 3462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *p, *pp, *ppp; 3463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *to_file = NULL; 3464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const pcre_uint8 *tables = NULL; 3465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unsigned long int get_options; 3466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unsigned long int true_size, true_study_size = 0; 3467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_t size; 3468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_allcaps = 0; 3469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_mark = 0; 3470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_study = 0; 3471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int no_force_study = 0; 3472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_debug = debug; 3473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_G = 0; 3474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_g = 0; 3475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_showinfo = showinfo; 3476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_showrest = 0; 3477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_showcaprest = 0; 3478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int do_flip = 0; 3479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int erroroffset, len, delimiter, poffset; 3480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 3482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int dfa_matched = 0; 3483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_utf = 0; 3486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich debug_lengths = 1; 3487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_STACK_GUARD(NULL); 3488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extend_inputline(infile, buffer, " re> ") == NULL) break; 3490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); 3491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fflush(outfile); 3492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = buffer; 3494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(*p)) p++; 3495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == 0) continue; 3496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle option lock-out setting */ 3498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '<' && p[1] == ' ') 3500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p += 2; 3502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(*p)) p++; 3503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (strncmp((char *)p, "forbid ", 7) == 0) 3504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p += 7; 3506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(*p)) p++; 3507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp = lockout; 3508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (!isspace(*p) && pp < lockout + sizeof(lockout) - 1) 3509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp++ = *p++; 3510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp = 0; 3511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Unrecognized special command '%s'\n", p); 3515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* See if the pattern is to be loaded pre-compiled from a file. */ 3522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '<' && strchr((char *)(p+1), '<') == NULL) 3524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 magic; 3526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 sbuf[8]; 3527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FILE *f; 3528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 3530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '!') 3531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_debug = TRUE; 3533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_showinfo = TRUE; 3534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 3535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp = p + (int)strlen((char *)p); 3538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(pp[-1])) pp--; 3539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp = 0; 3540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich f = fopen((char *)p, "rb"); 3542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f == NULL) 3543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Failed to open %s: %s\n", p, strerror(errno)); 3545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ; 3548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich true_size = 3550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3]; 3551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich true_study_size = 3552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7]; 3553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich re = (pcre *)new_malloc(true_size); 3555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (re == NULL) 3556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Failed to get %d bytes of memory for pcre object\n", 3558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (int)true_size); 3559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ; 3563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich magic = REAL_PCRE_MAGIC(re); 3565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (magic != MAGIC_NUMBER) 3566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (swap_uint32(magic) == MAGIC_NUMBER) 3568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_flip = 1; 3570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p); 3574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free(re); 3575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 3576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* We hide the byte-invert info for little and big endian tests. */ 3581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Compiled pattern%s loaded from %s\n", 3582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_flip && (p[-1] == '<') ? " (byte-inverted)" : "", p); 3583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Now see if there is any following study data. */ 3585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (true_study_size != 0) 3587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_study_data *psd; 3589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size); 3591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = PCRE_EXTRA_STUDY_DATA; 3592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra)); 3594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->study_data = psd; 3595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fread(psd, 1, true_study_size, f) != true_study_size) 3597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FAIL_READ: 3599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Failed to read data from %s\n", p); 3600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) 3601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY(extra); 3603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free(re); 3605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 3606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Study data loaded from %s\n", p); 3609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_study = 1; /* To get the data output if requested */ 3610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else fprintf(outfile, "No study data\n"); 3612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Flip the necessary bytes. */ 3614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_flip) 3615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 3617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PATTERN_TO_HOST_BYTE_ORDER(rc, re, extra, NULL); 3618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc == PCRE_ERROR_BADMODE) 3619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 flags_in_host_byte_order; 3621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_MAGIC(re) == MAGIC_NUMBER) 3622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich flags_in_host_byte_order = REAL_PCRE_FLAGS(re); 3623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich flags_in_host_byte_order = swap_uint32(REAL_PCRE_FLAGS(re)); 3625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Simulate the result of the function call below. */ 3626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d from pcre%s_fullinfo(%d)\n", rc, 3627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_mode == PCRE32_MODE ? "32" : pcre_mode == PCRE16_MODE ? "16" : "", 3628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_INFO_OPTIONS); 3629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Running in %d-bit mode but pattern was compiled in " 3630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "%d-bit mode\n", 8 * CHAR_SIZE, 8 * (flags_in_host_byte_order & PCRE_MODE_MASK)); 3631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free(re); 3632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 3633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Need to know if UTF-8 for printing data strings. */ 3638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0) 3640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free(re); 3642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 3643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 3644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_utf = (get_options & PCRE_UTF8) != 0; 3646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 3648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SHOW_INFO; 3649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* In-line pattern (the usual case). Get the delimiter and seek the end of 3652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the pattern; if it isn't complete, read more. */ 3653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich delimiter = *p++; 3655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (isalnum(delimiter) || delimiter == '\\') 3657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Delimiter must not be alphanumeric or \\\n"); 3659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp = p; 3663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich poffset = (int)(p - buffer); 3664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for(;;) 3666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*pp != 0) 3668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pp == '\\' && pp[1] != 0) pp++; 3670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*pp == delimiter) break; 3671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp++; 3672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pp != 0) break; 3674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((pp = extend_inputline(infile, pp, " > ")) == NULL) 3675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Unexpected EOF\n"); 3677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich done = 1; 3678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto CONTINUE; 3679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (infile != stdin) fprintf(outfile, "%s", (char *)pp); 3681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The buffer may have moved while being extended; reset the start of data 3684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pointer to the correct relative point in the buffer. */ 3685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = buffer + poffset; 3687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If the first character after the delimiter is backslash, make 3689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the pattern end with backslash. This is purely to provide a way 3690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich of testing for the error message when a pattern ends with backslash. */ 3691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pp[1] == '\\') *pp++ = '\\'; 3693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Terminate the pattern at the delimiter, and save a copy of the pattern 3695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for callouts. */ 3696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp++ = 0; 3698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich strcpy((char *)pbuffer, (char *)p); 3699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Look for modifiers and options after the final delimiter. */ 3701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options = default_options; 3703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study_options = force_study_options; 3704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich log_store = showstore; /* default from command line */ 3705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*pp != 0) 3707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Check to see whether this modifier has been locked out for this file. 3709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich This is complicated for the multi-character options that begin with '<'. 3710f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich If there is no '>' in the lockout string, all multi-character modifiers are 3711f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich locked out. */ 3712f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3713f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (strchr((char *)lockout, *pp) != NULL) 3714f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3715f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pp == '<' && strchr((char *)lockout, '>') != NULL) 3716f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3717f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int x = check_mc_option(pp+1, outfile, FALSE, "modifier"); 3718f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (x == 0) goto SKIP_DATA; 3719f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3720f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (ppp = lockout; *ppp != 0; ppp++) 3721f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3722f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*ppp == '<') 3723f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3724f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int y = check_mc_option(ppp+1, outfile, FALSE, "modifier"); 3725f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (y == 0) 3726f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3727f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Error in modifier forbid data - giving up.\n"); 3728f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3729f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3730f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3731f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (x == y) 3732f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3733f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ppp = pp; 3734f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*ppp != '>') ppp++; 3735f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** The %.*s modifier is locked out - giving up.\n", 3736f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (int)(ppp - pp + 1), pp); 3737f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3738f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3739f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3740f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3741f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3742f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3743f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3744f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The single-character modifiers are straightforward. */ 3745f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3746f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3747f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3748f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** The /%c modifier is locked out - giving up.\n", *pp); 3749f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 3750f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 3751f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3752f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3753f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3754f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The modifier is not locked out; handle it. */ 3755f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3756f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (*pp++) 3757f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3758f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'f': options |= PCRE_FIRSTLINE; break; 3759f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'g': do_g = 1; break; 3760f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'i': options |= PCRE_CASELESS; break; 3761f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'm': options |= PCRE_MULTILINE; break; 3762f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 's': options |= PCRE_DOTALL; break; 3763f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'x': options |= PCRE_EXTENDED; break; 3764f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3765f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '+': 3766f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_showrest) do_showcaprest = 1; else do_showrest = 1; 3767f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3768f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3769f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '=': do_allcaps = 1; break; 3770f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'A': options |= PCRE_ANCHORED; break; 3771f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'B': do_debug = 1; break; 3772f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'C': options |= PCRE_AUTO_CALLOUT; break; 3773f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'D': do_debug = do_showinfo = 1; break; 3774f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'E': options |= PCRE_DOLLAR_ENDONLY; break; 3775f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'F': do_flip = 1; break; 3776f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'G': do_G = 1; break; 3777f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'I': do_showinfo = 1; break; 3778f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'J': options |= PCRE_DUPNAMES; break; 3779f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'K': do_mark = 1; break; 3780f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'M': log_store = 1; break; 3781f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'N': options |= PCRE_NO_AUTO_CAPTURE; break; 3782f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'O': options |= PCRE_NO_AUTO_POSSESS; break; 3783f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3784f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 3785f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'P': do_posix = 1; break; 3786f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3787f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3788f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Q': 3789f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (*pp) 3790f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3791f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '0': 3792f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '1': 3793f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich stack_guard_return = *pp++ - '0'; 3794f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3795f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3796f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3797f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Missing 0 or 1 after /Q\n"); 3798f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3799f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3800f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_STACK_GUARD(stack_guard); 3801f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3802f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3803f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'S': 3804f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_study = 1; 3805f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 3806f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3807f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (*pp++) 3808f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3809f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'S': 3810f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_study = 0; 3811f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich no_force_study = 1; 3812f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3813f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3814f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '!': 3815f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study_options |= PCRE_STUDY_EXTRA_NEEDED; 3816f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3817f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3818f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '+': 3819f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pp == '+') 3820f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3821f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich verify_jit = TRUE; 3822f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp++; 3823f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3824f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pp >= '1' && *pp <= '7') 3825f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study_options |= jit_study_bits[*pp++ - '1']; 3826f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3827f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study_options |= jit_study_bits[6]; 3828f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3829f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3830f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '-': 3831f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich study_options &= ~PCRE_STUDY_ALLJIT; 3832f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3833f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3834f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3835f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp--; 3836f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto ENDLOOP; 3837f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3838f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3839f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ENDLOOP: 3840f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3841f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3842f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'U': options |= PCRE_UNGREEDY; break; 3843f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'W': options |= PCRE_UCP; break; 3844f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'X': options |= PCRE_EXTRA; break; 3845f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Y': options |= PCRE_NO_START_OPTIMISE; break; 3846f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Z': debug_lengths = 0; break; 3847f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '8': options |= PCRE_UTF8; use_utf = 1; break; 3848f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '9': options |= PCRE_NEVER_UTF; break; 3849f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '?': options |= PCRE_NO_UTF8_CHECK; break; 3850f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3851f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'T': 3852f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (*pp++) 3853f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3854f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '0': tables = tables0; break; 3855f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '1': tables = tables1; break; 3856f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3857f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '\r': 3858f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '\n': 3859f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case ' ': 3860f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 0: 3861f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Missing table number after /T\n"); 3862f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3863f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3864f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3865f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Bad table number \"%c\" after /T\n", pp[-1]); 3866f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3867f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3868f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3869f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3870f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'L': 3871f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ppp = pp; 3872f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The '\r' test here is so that it works on Windows. */ 3873f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The '0' test is just in case this is an unterminated line. */ 3874f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*ppp != 0 && *ppp != '\n' && *ppp != '\r' && *ppp != ' ') ppp++; 3875f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *ppp = 0; 3876f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (setlocale(LC_CTYPE, (const char *)pp) == NULL) 3877f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3878f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Failed to set locale \"%s\"\n", pp); 3879f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3880f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3881f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich locale_set = 1; 3882f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich tables = PCRE_MAKETABLES; 3883f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pp = ppp; 3884f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3885f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3886f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '>': 3887f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich to_file = pp; 3888f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*pp != 0) pp++; 3889f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(pp[-1])) pp--; 3890f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *pp = 0; 3891f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3892f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3893f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '<': 3894f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3895f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int x = check_mc_option(pp, outfile, FALSE, "modifier"); 3896f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (x == 0) goto SKIP_DATA; 3897f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= x; 3898f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*pp++ != '>'); 3899f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3900f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3901f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3902f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '\r': /* So that it works in Windows */ 3903f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '\n': 3904f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case ' ': 3905f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3906f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3907f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3908f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Unknown modifier '%c'\n", pp[-1]); 3909f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3910f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3911f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3912f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3913f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle compiling via the POSIX interface, which doesn't support the 3914f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich timing, showing, or debugging options, nor the ability to pass over 3915f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich local character tables. Neither does it have 16-bit support. */ 3916f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3917f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 3918f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (posix || do_posix) 3919f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3920f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 3921f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int cflags = 0; 3922f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3923f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; 3924f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; 3925f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL; 3926f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB; 3927f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8; 3928f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_UCP) != 0) cflags |= REG_UCP; 3929f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_UNGREEDY) != 0) cflags |= REG_UNGREEDY; 3930f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3931f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = regcomp(&preg, (char *)p, cflags); 3932f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3933f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Compilation failed; go back for another re, skipping to blank line 3934f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if non-interactive. */ 3935f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3936f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc != 0) 3937f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3938f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)regerror(rc, &preg, (char *)buffer, buffer_size); 3939f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); 3940f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3941f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3942f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3943f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3944f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle compiling via the native interface */ 3945f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3946f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 3947f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* !defined NOPOSIX */ 3948f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3949f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3950f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* In 16- or 32-bit mode, convert the input. */ 3951f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3952f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 3953f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 3954f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3955f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch(to16(FALSE, p, options & PCRE_UTF8, (int)strlen((char *)p))) 3956f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3957f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -1: 3958f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: invalid UTF-8 string cannot be " 3959f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "converted to UTF-16\n"); 3960f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3961f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3962f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -2: 3963f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: character value greater than 0x10ffff " 3964f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "cannot be converted to UTF-16\n"); 3965f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3966f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3967f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -3: /* "Impossible error" when to16 is called arg1 FALSE */ 3968f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: character value greater than 0xffff " 3969f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "cannot be converted to 16-bit in non-UTF mode\n"); 3970f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3971f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3972f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3973f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 3974f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3975f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = (pcre_uint8 *)buffer16; 3976f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 3977f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 3978f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3979f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 3980f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 3981f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3982f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch(to32(FALSE, p, options & PCRE_UTF32, (int)strlen((char *)p))) 3983f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 3984f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -1: 3985f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: invalid UTF-8 string cannot be " 3986f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "converted to UTF-32\n"); 3987f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3988f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3989f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -2: 3990f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: character value greater than 0x10ffff " 3991f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "cannot be converted to UTF-32\n"); 3992f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3993f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3994f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case -3: 3995f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: character value is ill-formed UTF-32\n"); 3996f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 3997f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 3998f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 3999f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4000f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4001f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = (pcre_uint8 *)buffer32; 4002f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4003f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4004f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4005f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Compile many times when timing */ 4006f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4007f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (timeit > 0) 4008f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4009f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich register int i; 4010f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t time_taken; 4011f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t start_time = clock(); 4012f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < timeit; i++) 4013f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4014f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COMPILE(re, p, options, &error, &erroroffset, tables); 4015f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (re != NULL) free(re); 4016f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4017f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich total_compile_time += (time_taken = clock() - start_time); 4018f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Compile time %.4f milliseconds\n", 4019f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)time_taken * 1000.0) / (double)timeit) / 4020f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 4021f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4022f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4023f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COMPILE(re, p, options, &error, &erroroffset, tables); 4024f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4025f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Compilation failed; go back for another re, skipping to blank line 4026f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if non-interactive. */ 4027f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4028f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (re == NULL) 4029f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4030f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); 4031f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SKIP_DATA: 4032f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (infile != stdin) 4033f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4034f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 4035f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4036f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extend_inputline(infile, buffer, NULL) == NULL) 4037f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4038f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich done = 1; 4039f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto CONTINUE; 4040f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4041f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = (int)strlen((char *)buffer); 4042f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len > 0 && isspace(buffer[len-1])) len--; 4043f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (len == 0) break; 4044f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4045f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 4046f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4047f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto CONTINUE; 4048f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4049f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4050f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Compilation succeeded. It is now possible to set the UTF-8 option from 4051f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich within the regex; check for this so that we know how to process the data 4052f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich lines. */ 4053f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4054f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options) < 0) 4055f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 4056f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((get_options & PCRE_UTF8) != 0) use_utf = 1; 4057f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4058f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Extract the size for possible writing before possibly flipping it, 4059f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich and remember the store that was got. */ 4060f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4061f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich true_size = REAL_PCRE_SIZE(re); 4062f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4063f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Output code size information if requested */ 4064f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4065f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (log_store) 4066f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4067f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int name_count, name_entry_size, real_pcre_size; 4068f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4069f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_NAMECOUNT, &name_count); 4070f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &name_entry_size); 4071f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich real_pcre_size = 0; 4072f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4073f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_FLAGS(re) & PCRE_MODE8) 4074f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich real_pcre_size = sizeof(real_pcre); 4075f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4076f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4077f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_FLAGS(re) & PCRE_MODE16) 4078f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich real_pcre_size = sizeof(real_pcre16); 4079f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4080f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4081f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (REAL_PCRE_FLAGS(re) & PCRE_MODE32) 4082f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich real_pcre_size = sizeof(real_pcre32); 4083f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4084f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_SIZE, &size); 4085f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Memory allocation (code space): %d\n", 4086f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (int)(size - real_pcre_size - name_count * name_entry_size)); 4087f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4088f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4089f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If -s or /S was present, study the regex to generate additional info to 4090f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich help with the matching, unless the pattern has the SS option, which 4091f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich suppresses the effect of /S (used for a few test patterns where studying is 4092f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich never sensible). */ 4093f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4094f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_study || (force_study >= 0 && !no_force_study)) 4095f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4096f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (timeit > 0) 4097f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4098f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich register int i; 4099f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t time_taken; 4100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t start_time = clock(); 4101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < timeit; i++) 4102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY(extra, re, study_options, &error); 4104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich total_study_time = (time_taken = clock() - start_time); 4106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) 4107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY(extra); 4109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " Study time %.4f milliseconds\n", 4111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)time_taken * 1000.0) / (double)timeit) / 4112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 4113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_STUDY(extra, re, study_options, &error); 4115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (error != NULL) 4116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Failed to study: %s\n", error); 4117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (extra != NULL) 4118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich true_study_size = ((pcre_study_data *)(extra->study_data))->size; 4120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (log_store) 4121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_t jitsize; 4123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, extra, PCRE_INFO_JITSIZE, &jitsize) == 0 && 4124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich jitsize != 0) 4125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Memory allocation (JIT code): %d\n", (int)jitsize); 4126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If /K was present, we set up for handling MARK data. */ 4131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_mark) 4133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra == NULL) 4135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)malloc(sizeof(pcre_extra)); 4137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = 0; 4138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->mark = &markptr; 4140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags |= PCRE_EXTRA_MARK; 4141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Extract and display information from the compiled data if required. */ 4144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SHOW_INFO: 4146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_debug) 4148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "------------------------------------------------------------------\n"); 4150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PRINTINT(re, outfile, debug_lengths); 4151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* We already have the options in get_options (see above) */ 4154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_showinfo) 4156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unsigned long int all_options; 4158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 first_char, need_char; 4159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 match_limit, recursion_limit; 4160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int count, backrefmax, first_char_set, need_char_set, okpartial, jchanged, 4161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich hascrorlf, maxlookbehind, match_empty; 4162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int nameentrysize, namecount; 4163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const pcre_uint8 *nametable; 4164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) + 4166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax) + 4167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_FIRSTCHARACTER, &first_char) + 4168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_FIRSTCHARACTERFLAGS, &first_char_set) + 4169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_REQUIREDCHAR, &need_char) + 4170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_REQUIREDCHARFLAGS, &need_char_set) + 4171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize) + 4172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount) + 4173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable) + 4174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial) + 4175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged) + 4176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf) + 4177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_MATCH_EMPTY, &match_empty) + 4178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_info(re, NULL, PCRE_INFO_MAXLOOKBEHIND, &maxlookbehind) 4179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich != 0) 4180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 4181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Capturing subpattern count = %d\n", count); 4183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (backrefmax > 0) 4185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Max back reference = %d\n", backrefmax); 4186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (maxlookbehind > 0) 4188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Max lookbehind = %d\n", maxlookbehind); 4189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_MATCHLIMIT, &match_limit) == 0) 4191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Match limit = %u\n", match_limit); 4192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_RECURSIONLIMIT, &recursion_limit) == 0) 4194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Recursion limit = %u\n", recursion_limit); 4195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (namecount > 0) 4197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Named capturing subpatterns:\n"); 4199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (namecount-- > 0) 4200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int imm2_size = pcre_mode == PCRE8_MODE ? 2 : 1; 4202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int length = (int)STRLEN(nametable + imm2_size); 4203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " "); 4204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(nametable, imm2_size, length, outfile); 4205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (length++ < nameentrysize - imm2_size) putc(' ', outfile); 4206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 4208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR32)nametable)[0])); 4209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 4212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%3d\n", (int)(((PCRE_SPTR16)nametable)[0])); 4213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 4216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%3d\n", ((int)nametable[0] << 8) | (int)nametable[1]); 4217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich nametable += nameentrysize * CHAR_SIZE; 4219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (!okpartial) fprintf(outfile, "Partial matching not supported\n"); 4223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n"); 4224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (match_empty) fprintf(outfile, "May match empty string\n"); 4225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich all_options = REAL_PCRE_OPTIONS(re); 4227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_flip) all_options = swap_uint32(all_options); 4228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (get_options == 0) fprintf(outfile, "No options\n"); 4230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", 4231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "", 4232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_CASELESS) != 0)? " caseless" : "", 4233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_EXTENDED) != 0)? " extended" : "", 4234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "", 4235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "", 4236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_DOTALL) != 0)? " dotall" : "", 4237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_BSR_ANYCRLF) != 0)? " bsr_anycrlf" : "", 4238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_BSR_UNICODE) != 0)? " bsr_unicode" : "", 4239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", 4240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_EXTRA) != 0)? " extra" : "", 4241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", 4242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "", 4243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_NO_AUTO_POSSESS) != 0)? " no_auto_possessify" : "", 4244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_UTF8) != 0)? " utf" : "", 4245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_UCP) != 0)? " ucp" : "", 4246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf_check" : "", 4247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_NO_START_OPTIMIZE) != 0)? " no_start_optimize" : "", 4248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : "", 4249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((get_options & PCRE_NEVER_UTF) != 0)? " never_utf" : ""); 4250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (jchanged) fprintf(outfile, "Duplicate name status changes\n"); 4252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch (get_options & PCRE_NEWLINE_BITS) 4254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_NEWLINE_CR: 4256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Forced newline sequence: CR\n"); 4257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_NEWLINE_LF: 4260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Forced newline sequence: LF\n"); 4261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_NEWLINE_CRLF: 4264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Forced newline sequence: CRLF\n"); 4265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_NEWLINE_ANYCRLF: 4268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Forced newline sequence: ANYCRLF\n"); 4269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_NEWLINE_ANY: 4272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Forced newline sequence: ANY\n"); 4273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 4276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (first_char_set == 2) 4280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "First char at start or follows newline\n"); 4282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (first_char_set == 1) 4284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *caseless = 4286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((REAL_PCRE_FLAGS(re) & PCRE_FCH_CASELESS) == 0)? 4287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "" : " (caseless)"; 4288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (PRINTOK(first_char)) 4290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "First char = \'%c\'%s\n", first_char, caseless); 4291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "First char = "); 4294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pchar(first_char, outfile); 4295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%s\n", caseless); 4296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No first char\n"); 4301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (need_char_set == 0) 4304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No need char\n"); 4306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *caseless = 4310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((REAL_PCRE_FLAGS(re) & PCRE_RCH_CASELESS) == 0)? 4311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "" : " (caseless)"; 4312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (PRINTOK(need_char)) 4314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Need char = \'%c\'%s\n", need_char, caseless); 4315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Need char = "); 4318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pchar(need_char, outfile); 4319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%s\n", caseless); 4320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Don't output study size; at present it is in any case a fixed 4324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich value, but it varies, depending on the computer architecture, and 4325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich so messes up the test suite. (And with the /F option, it might be 4326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich flipped.) If study was forced by an external -s, don't show this 4327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich information unless -i or -d was also present. This means that, except 4328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich when auto-callouts are involved, the output from runs with and without 4329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich -s should be identical. */ 4330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_study || (force_study >= 0 && showinfo && !no_force_study)) 4332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra == NULL) 4334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Study returned NULL\n"); 4335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *start_bits = NULL; 4338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int minlength; 4339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, extra, PCRE_INFO_MINLENGTH, &minlength) == 0) 4341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Subject length lower bound = %d\n", minlength); 4342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits) == 0) 4344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (start_bits == NULL) 4346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No starting char list\n"); 4347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int i; 4350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int c = 24; 4351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Starting chars: "); 4352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < 256; i++) 4353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((start_bits[i/8] & (1<<(i&7))) != 0) 4355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 75) 4357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n "); 4359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = 2; 4360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (PRINTOK(i) && i != ' ') 4362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%c ", i); 4364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c += 2; 4365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\\x%02x ", i); 4369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c += 5; 4370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 4374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Show this only if the JIT was set by /S, not by -s. */ 4379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((study_options & PCRE_STUDY_ALLJIT) != 0 && 4381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (force_study_options & PCRE_STUDY_ALLJIT) == 0) 4382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int jit; 4384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, extra, PCRE_INFO_JIT, &jit) == 0) 4385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (jit) 4387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "JIT study was successful\n"); 4388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_JIT 4390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "JIT study was not successful\n"); 4391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 4392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "JIT support is not available in this version of PCRE\n"); 4393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If the '>' option was present, we write out the regex to a file, and 4400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich that is all. The first 8 bytes of the file are the regex length and then 4401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the study length, in big-endian order. */ 4402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (to_file != NULL) 4404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich FILE *f = fopen((char *)to_file, "wb"); 4406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (f == NULL) 4407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Unable to open %s: %s\n", to_file, strerror(errno)); 4409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 sbuf[8]; 4413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_flip) regexflip(re, extra); 4415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[0] = (pcre_uint8)((true_size >> 24) & 255); 4416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[1] = (pcre_uint8)((true_size >> 16) & 255); 4417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[2] = (pcre_uint8)((true_size >> 8) & 255); 4418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[3] = (pcre_uint8)((true_size) & 255); 4419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[4] = (pcre_uint8)((true_study_size >> 24) & 255); 4420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[5] = (pcre_uint8)((true_study_size >> 16) & 255); 4421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[6] = (pcre_uint8)((true_study_size >> 8) & 255); 4422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich sbuf[7] = (pcre_uint8)((true_study_size) & 255); 4423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fwrite(sbuf, 1, 8, f) < 8 || 4425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fwrite(re, 1, true_size, f) < true_size) 4426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno)); 4428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Compiled pattern written to %s\n", to_file); 4432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If there is study data, write it. */ 4434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) 4436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (fwrite(extra->study_data, 1, true_study_size, f) < 4438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich true_study_size) 4439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Write error on %s: %s\n", to_file, 4441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich strerror(errno)); 4442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else fprintf(outfile, "Study data written to %s\n", to_file); 4444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fclose(f); 4447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free(re); 4450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) 4451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY(extra); 4453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (locale_set) 4455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free((void *)tables); 4457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich setlocale(LC_CTYPE, "C"); 4458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich locale_set = 0; 4459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; /* With next regex */ 4461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } /* End of non-POSIX compile */ 4463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Read data lines and test them */ 4465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 4467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *q8; 4470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint16 *q16; 4473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 *q32; 4476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *bptr; 4478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int *use_offsets = offsets; 4479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int use_size_offsets = size_offsets; 4480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int callout_data = 0; 4481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int callout_data_set = 0; 4482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int count; 4483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 c; 4484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int copystrings = 0; 4485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int find_match_limit = default_find_match_limit; 4486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int getstrings = 0; 4487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int getlist = 0; 4488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int gmatched = 0; 4489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int start_offset = 0; 4490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int start_offset_sign = 1; 4491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int g_notempty = 0; 4492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int use_dfa = 0; 4493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *copynames = 0; 4495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *getnames = 0; 4496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cn32ptr = copynames; 4499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gn32ptr = getnames; 4500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cn16ptr = copynames16; 4503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gn16ptr = getnames16; 4504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cn8ptr = copynames8; 4507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gn8ptr = getnames8; 4508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_CALLOUT(callout); 4511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich first_callout = 1; 4512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich last_callout_mark = NULL; 4513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_extra = 0; 4514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_count = 0; 4515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_count = 999999; 4516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_id = -1; 4517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich show_malloc = 0; 4518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options = 0; 4519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) extra->flags &= 4521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ~(PCRE_EXTRA_MATCH_LIMIT|PCRE_EXTRA_MATCH_LIMIT_RECURSION); 4522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = 0; 4524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 4525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extend_inputline(infile, buffer + len, "data> ") == NULL) 4527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (len > 0) /* Reached EOF without hitting a newline */ 4529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 4531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich done = 1; 4534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto CONTINUE; 4535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); 4537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = (int)strlen((char *)buffer); 4538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (buffer[len-1] == '\n') break; 4539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (len > 0 && isspace(buffer[len-1])) len--; 4542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich buffer[len] = 0; 4543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (len == 0) break; 4544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = buffer; 4546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (isspace(*p)) p++; 4547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef NOUTF 4549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Check that the data is well-formed UTF-8 if we're in UTF mode. To create 4550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich invalid input to pcre_exec, you must use \x?? or \x{} sequences. */ 4551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf) 4553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *q; 4555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint32 cc; 4556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int n = 1; 4557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (q = p; n > 0 && *q; q += n) n = utf82ord(q, &cc); 4559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (n <= 0) 4560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "**Failed: invalid UTF-8 string cannot be used as input in UTF mode\n"); 4562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto NEXT_DATA; 4563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_VALGRIND 4568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Mark the dbuffer as addressable but undefined again. */ 4569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dbuffer != NULL) 4571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich VALGRIND_MAKE_MEM_UNDEFINED(dbuffer, dbuffer_size * CHAR_SIZE); 4573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Allocate a buffer to hold the data line; len+1 is an upper bound on 4577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the number of pcre_uchar units that will be needed. */ 4578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (dbuffer == NULL || (size_t)len >= dbuffer_size) 4580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dbuffer_size *= 2; 4582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dbuffer = (pcre_uint8 *)realloc(dbuffer, dbuffer_size * CHAR_SIZE); 4583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dbuffer == NULL) 4584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(stderr, "pcretest: realloc(%d) failed\n", (int)dbuffer_size); 4586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich exit(1); 4587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich q8 = (pcre_uint8 *) dbuffer; 4592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich q16 = (pcre_uint16 *) dbuffer; 4595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich q32 = (pcre_uint32 *) dbuffer; 4598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while ((c = *p++) != 0) 4601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int i = 0; 4603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int n = 0; 4604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* In UTF mode, input can be UTF-8, so just copy all non-backslash bytes. 4606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich In non-UTF mode, allow the value of the byte to fall through to later, 4607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich where values greater than 127 are turned into UTF-8 when running in 4608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 16-bit or 32-bit mode. */ 4609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c != '\\') 4611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef NOUTF 4613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf && HASUTF8EXTRALEN(c)) { GETUTF8INC(c, p); } 4614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle backslash escapes */ 4618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else switch ((c = *p++)) 4620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'a': c = 7; break; 4622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'b': c = '\b'; break; 4623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'e': c = 27; break; 4624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'f': c = '\f'; break; 4625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'n': c = '\n'; break; 4626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'r': c = '\r'; break; 4627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 't': c = '\t'; break; 4628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'v': c = '\v'; break; 4629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '0': case '1': case '2': case '3': 4631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '4': case '5': case '6': case '7': 4632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c -= '0'; 4633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') 4634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = c * 8 + *p++ - '0'; 4635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'o': 4638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '{') 4639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *pt = p; 4641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = 0; 4642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (pt++; isdigit(*pt) && *pt != '8' && *pt != '9'; pt++) 4643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (++i == 12) 4645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Too many octal digits in \\o{...} item; " 4646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "using only the first twelve.\n"); 4647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else c = c * 8 + *pt - '0'; 4648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pt == '}') p = pt + 1; 4650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else fprintf(outfile, "** Missing } after \\o{ (assumed)\n"); 4651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'x': 4655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '{') 4656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_uint8 *pt = p; 4658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = 0; 4659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* We used to have "while (isxdigit(*(++pt)))" here, but it fails 4661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich when isxdigit() is a macro that refers to its argument more than 4662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich once. This is banned by the C Standard, but apparently happens in at 4663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich least one MacOS environment. */ 4664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (pt++; isxdigit(*pt); pt++) 4666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (++i == 9) 4668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Too many hex digits in \\x{...} item; " 4669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "using only the first eight.\n"); 4670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'a' - 10); 4671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*pt == '}') 4673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p = pt + 1; 4675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Not correct form for \x{...}; fall through */ 4678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* \x without {} always defines just one byte in 8-bit mode. This 4681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich allows UTF-8 characters to be constructed byte by byte, and also allows 4682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich invalid UTF-8 sequences to be made. Just copy the byte in UTF mode. 4683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Otherwise, pass it down to later code so that it can be turned into 4684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich UTF-8 when running in 16/32-bit mode. */ 4685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = 0; 4687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (i++ < 2 && isxdigit(*p)) 4688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'a' - 10); 4690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOUTF && defined SUPPORT_PCRE8 4693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf && (pcre_mode == PCRE8_MODE)) 4694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q8++ = c; 4696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 4700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 0: /* \ followed by EOF allows for an empty line */ 4702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p--; 4703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '>': 4706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '-') 4707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start_offset_sign = -1; 4709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4710f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4711f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0'; 4712f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start_offset *= start_offset_sign; 4713f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4714f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4715f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'A': /* Option setting */ 4716f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_ANCHORED; 4717f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4718f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4719f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'B': 4720f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_NOTBOL; 4721f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4722f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4723f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'C': 4724f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (isdigit(*p)) /* Set copy string */ 4725f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4726f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4727f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich copystrings |= 1 << n; 4728f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4729f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (isalnum(*p)) 4730f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4731f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich READ_CAPTURE_NAME(p, &cn8ptr, &cn16ptr, &cn32ptr, re); 4732f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4733f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*p == '+') 4734f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4735f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_extra = 1; 4736f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4737f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4738f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*p == '-') 4739f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4740f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich SET_PCRE_CALLOUT(NULL); 4741f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4742f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4743f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*p == '!') 4744f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4745f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_id = 0; 4746f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4747f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) 4748f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_id = callout_fail_id * 10 + *p++ - '0'; 4749f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_count = 0; 4750f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*p == '!') 4751f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4752f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich p++; 4753f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) 4754f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_fail_count = callout_fail_count * 10 + *p++ - '0'; 4755f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4756f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4757f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (*p == '*') 4758f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4759f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int sign = 1; 4760f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_data = 0; 4761f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(++p) == '-') { sign = -1; p++; } 4762f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) 4763f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_data = callout_data * 10 + *p++ - '0'; 4764f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_data *= sign; 4765f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich callout_data_set = 1; 4766f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4767f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4768f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4769f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 4770f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'D': 4771f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 4772f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (posix || do_posix) 4773f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Can't use dfa matching in POSIX mode: \\D ignored\n"); 4774f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4775f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4776f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_dfa = 1; 4777f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4778f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4779f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4780f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 4781f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'F': 4782f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_DFA_SHORTEST; 4783f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4784f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4785f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4786f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'G': 4787f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (isdigit(*p)) 4788f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4789f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4790f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getstrings |= 1 << n; 4791f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4792f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (isalnum(*p)) 4793f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4794f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich READ_CAPTURE_NAME(p, &gn8ptr, &gn16ptr, &gn32ptr, re); 4795f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4796f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4797f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4798f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'J': 4799f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4800f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL 4801f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 4802f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich && extra->executable_jit != NULL) 4803f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4804f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (jit_stack != NULL) { PCRE_JIT_STACK_FREE(jit_stack); } 4805f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich jit_stack = PCRE_JIT_STACK_ALLOC(1, n * 1024); 4806f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); 4807f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4808f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4809f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4810f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'L': 4811f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich getlist = 1; 4812f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4813f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4814f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'M': 4815f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich find_match_limit = 1; 4816f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4817f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4818f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'N': 4819f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_NOTEMPTY) != 0) 4820f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options = (options & ~PCRE_NOTEMPTY) | PCRE_NOTEMPTY_ATSTART; 4821f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4822f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_NOTEMPTY; 4823f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4824f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4825f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'O': 4826f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4827f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (n > size_offsets_max) 4828f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4829f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_offsets_max = n; 4830f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(offsets); 4831f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int)); 4832f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (offsets == NULL) 4833f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4834f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("** Failed to get %d bytes of memory for offsets vector\n", 4835f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (int)(size_offsets_max * sizeof(int))); 4836f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = 1; 4837f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto EXIT; 4838f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4839f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4840f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_size_offsets = n; 4841f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (n == 0) use_offsets = NULL; /* Ensures it can't write to it */ 4842f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else use_offsets = offsets + size_offsets_max - n; /* To catch overruns */ 4843f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4844f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4845f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'P': 4846f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= ((options & PCRE_PARTIAL_SOFT) == 0)? 4847f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_PARTIAL_SOFT : PCRE_PARTIAL_HARD; 4848f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4849f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4850f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Q': 4851f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4852f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra == NULL) 4853f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4854f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)malloc(sizeof(pcre_extra)); 4855f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = 0; 4856f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4857f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; 4858f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->match_limit_recursion = n; 4859f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4860f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4861f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'q': 4862f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while(isdigit(*p)) n = n * 10 + *p++ - '0'; 4863f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra == NULL) 4864f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4865f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)malloc(sizeof(pcre_extra)); 4866f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = 0; 4867f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4868f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags |= PCRE_EXTRA_MATCH_LIMIT; 4869f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->match_limit = n; 4870f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4871f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4872f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 4873f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'R': 4874f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_DFA_RESTART; 4875f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4876f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4877f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4878f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'S': 4879f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich show_malloc = 1; 4880f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4881f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4882f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Y': 4883f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_NO_START_OPTIMIZE; 4884f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4885f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4886f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case 'Z': 4887f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_NOTEOL; 4888f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4889f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4890f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '?': 4891f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= PCRE_NO_UTF8_CHECK; 4892f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4893f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4894f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case '<': 4895f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4896f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int x = check_mc_option(p, outfile, TRUE, "escape sequence"); 4897f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (x == 0) goto NEXT_DATA; 4898f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options |= x; 4899f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (*p++ != '>'); 4900f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4901f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich continue; 4902f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4903f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4904f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* We now have a character value in c that may be greater than 255. 4905f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich In 8-bit mode we convert to UTF-8 if we are in UTF mode. Values greater 4906f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich than 127 in UTF mode must have come from \x{...} or octal constructs 4907f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich because values from \x.. get this far only in non-UTF mode. */ 4908f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4909f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4910f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 4911f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4912f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef NOUTF 4913f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf) 4914f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4915f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0x7fffffff) 4916f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4917f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Character \\x{%x} is greater than 0x7fffffff " 4918f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "and so cannot be converted to UTF-8\n", c); 4919f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto NEXT_DATA; 4920f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4921f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich q8 += ord2utf8(c, q8); 4922f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4923f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4924f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4925f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4926f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0xffu) 4927f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4928f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Character \\x{%x} is greater than 255 " 4929f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "and UTF-8 mode is not enabled.\n", c); 4930f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Truncation will probably give the wrong " 4931f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "result.\n"); 4932f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4933f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q8++ = c; 4934f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4935f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4936f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4937f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4938f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 4939f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4940f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifndef NOUTF 4941f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_utf) 4942f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4943f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0x10ffffu) 4944f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4945f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Failed: character \\x{%x} is greater than " 4946f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "0x10ffff and so cannot be converted to UTF-16\n", c); 4947f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto NEXT_DATA; 4948f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4949f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (c >= 0x10000u) 4950f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4951f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich c-= 0x10000u; 4952f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q16++ = 0xD800 | (c >> 10); 4953f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q16++ = 0xDC00 | (c & 0x3ff); 4954f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4955f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4956f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q16++ = c; 4957f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4958f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 4959f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4960f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4961f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (c > 0xffffu) 4962f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4963f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Character \\x{%x} is greater than 0xffff " 4964f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "and UTF-16 mode is not enabled.\n", c); 4965f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** Truncation will probably give the wrong " 4966f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "result.\n"); 4967f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4968f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4969f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q16++ = c; 4970f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4971f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4972f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4973f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4974f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 4975f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4976f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q32++ = c; 4977f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4978f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4979f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4980f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4981f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4982f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Reached end of subject string */ 4983f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 4984f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 4985f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 4986f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4987f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q8 = 0; 4988f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = (int)(q8 - (pcre_uint8 *)dbuffer); 4989f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4990f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4991f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 4992f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 4993f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 4994f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q16 = 0; 4995f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = (int)(q16 - (pcre_uint16 *)dbuffer); 4996f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 4997f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 4998f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 4999f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 5000f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5001f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich *q32 = 0; 5002f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len = (int)(q32 - (pcre_uint32 *)dbuffer); 5003f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5004f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5005f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5006f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If we're compiling with explicit valgrind support, Mark the data from after 5007f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich its end to the end of the buffer as unaddressable, so that a read over the end 5008f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich of the buffer will be seen by valgrind, even if it doesn't cause a crash. 5009f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich If we're not building with valgrind support, at least move the data to the end 5010f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich of the buffer so that it might at least cause a crash. 5011f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich If we are using the POSIX interface, we must include the terminating zero. */ 5012f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5013f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr = dbuffer; 5014f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5015f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 5016f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (posix || do_posix) 5017f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5018f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_VALGRIND 5019f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len + 1, dbuffer_size - (len + 1)); 5020f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 5021f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich memmove(bptr + dbuffer_size - len - 1, bptr, len + 1); 5022f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr += dbuffer_size - len - 1; 5023f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5024f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5025f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5026f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5027f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5028f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_VALGRIND 5029f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich VALGRIND_MAKE_MEM_NOACCESS(dbuffer + len * CHAR_SIZE, (dbuffer_size - len) * CHAR_SIZE); 5030f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#else 5031f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr = memmove(bptr + (dbuffer_size - len) * CHAR_SIZE, bptr, len * CHAR_SIZE); 5032f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5033f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5034f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5035f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((all_use_dfa || use_dfa) && find_match_limit) 5036f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5037f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich printf("**Match limit not relevant for DFA matching: ignored\n"); 5038f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich find_match_limit = 0; 5039f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5040f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5041f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle matching via the POSIX interface, which does not 5042f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich support timing or playing with the match limit or callout data. */ 5043f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5044f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 5045f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (posix || do_posix) 5046f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5047f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5048f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int eflags = 0; 5049f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich regmatch_t *pmatch = NULL; 5050f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_size_offsets > 0) 5051f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets); 5052f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; 5053f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; 5054f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_NOTEMPTY) != 0) eflags |= REG_NOTEMPTY; 5055f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5056f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags); 5057f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5058f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc != 0) 5059f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5060f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)regerror(rc, &preg, (char *)buffer, buffer_size); 5061f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); 5062f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5063f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if ((REAL_PCRE_OPTIONS(preg.re_pcre) & PCRE_NO_AUTO_CAPTURE) != 0) 5064f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5065f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Matched with REG_NOSUB\n"); 5066f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5067f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5068f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5069f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich size_t i; 5070f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < (size_t)use_size_offsets; i++) 5071f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5072f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pmatch[i].rm_so >= 0) 5073f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5074f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2d: ", (int)i); 5075f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(dbuffer, pmatch[i].rm_so, 5076f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pmatch[i].rm_eo - pmatch[i].rm_so, outfile); 5077f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5078f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_showcaprest || (i == 0 && do_showrest)) 5079f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5080f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2d+ ", (int)i); 5081f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(dbuffer, pmatch[i].rm_eo, len - pmatch[i].rm_eo, 5082f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich outfile); 5083f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5084f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5085f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5086f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5087f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5088f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(pmatch); 5089f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto NEXT_DATA; 5090f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5091f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5092f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif /* !defined NOPOSIX */ 5093f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5094f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Handle matching via the native interface - repeats for /g and /G */ 5095f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5096f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Ensure that there is a JIT callback if we want to verify that JIT was 5097f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich actually used. If jit_stack == NULL, no stack has yet been assigned. */ 5098f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5099f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (verify_jit && jit_stack == NULL && extra != NULL) 5100f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { PCRE_ASSIGN_JIT_STACK(extra, jit_callback, jit_stack); } 5101f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5102f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;; gmatched++) /* Loop for /g or /G */ 5103f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5104f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich markptr = NULL; 5105f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich jit_was_used = FALSE; 5106f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5107f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (timeitm > 0) 5108f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5109f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich register int i; 5110f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t time_taken; 5111f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich clock_t start_time = clock(); 5112f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5113f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 5114f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (all_use_dfa || use_dfa) 5115f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5116f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((options & PCRE_DFA_RESTART) != 0) 5117f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5118f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Timing DFA restarts is not supported\n"); 5119f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 5120f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5121f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dfa_workspace == NULL) 5122f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int)); 5123f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < timeitm; i++) 5124f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5125f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, 5126f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (options | g_notempty), use_offsets, use_size_offsets, 5127f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dfa_workspace, DFA_WS_DIMENSION); 5128f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5129f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5130f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5131f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5132f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5133f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < timeitm; i++) 5134f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5135f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC(count, re, extra, bptr, len, start_offset, 5136f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (options | g_notempty), use_offsets, use_size_offsets); 5137f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5138f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich total_match_time += (time_taken = clock() - start_time); 5139f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Execute time %.4f milliseconds\n", 5140f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)time_taken * 1000.0) / (double)timeitm) / 5141f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 5142f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5143f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5144f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If find_match_limit is set, we want to do repeated matches with 5145f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich varying limits in order to find the minimum value for the match limit and 5146f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for the recursion limit. The match limits are relevant only to the normal 5147f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich running of pcre_exec(), so disable the JIT optimization. This makes it 5148f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich possible to run the same set of tests with and without JIT externally 5149f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich requested. */ 5150f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5151f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (find_match_limit) 5152f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5153f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) { PCRE_FREE_STUDY(extra); } 5154f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)malloc(sizeof(pcre_extra)); 5155f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = 0; 5156f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5157f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)check_match_limit(re, extra, bptr, len, start_offset, 5158f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options|g_notempty, use_offsets, use_size_offsets, 5159f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit), 5160f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ERROR_MATCHLIMIT, "match()"); 5161f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5162f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = check_match_limit(re, extra, bptr, len, start_offset, 5163f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options|g_notempty, use_offsets, use_size_offsets, 5164f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXTRA_MATCH_LIMIT_RECURSION, &(extra->match_limit_recursion), 5165f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_ERROR_RECURSIONLIMIT, "match() recursion"); 5166f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5167f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5168f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If callout_data is set, use the interface with additional data */ 5169f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5170f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (callout_data_set) 5171f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5172f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra == NULL) 5173f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5174f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra = (pcre_extra *)malloc(sizeof(pcre_extra)); 5175f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags = 0; 5176f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5177f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags |= PCRE_EXTRA_CALLOUT_DATA; 5178f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->callout_data = &callout_data; 5179f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC(count, re, extra, bptr, len, start_offset, 5180f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options | g_notempty, use_offsets, use_size_offsets); 5181f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA; 5182f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5183f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5184f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* The normal case is just to do the match once, with the default 5185f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich value of match_limit. */ 5186f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5187f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 5188f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (all_use_dfa || use_dfa) 5189f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5190f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dfa_workspace == NULL) 5191f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dfa_workspace = (int *)malloc(DFA_WS_DIMENSION*sizeof(int)); 5192f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (dfa_matched++ == 0) 5193f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich dfa_workspace[0] = -1; /* To catch bad restart */ 5194f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_DFA_EXEC(count, re, extra, bptr, len, start_offset, 5195f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (options | g_notempty), use_offsets, use_size_offsets, dfa_workspace, 5196f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich DFA_WS_DIMENSION); 5197f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count == 0) 5198f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5199f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Matched, but offsets vector is too small to show all matches\n"); 5200f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = use_size_offsets/2; 5201f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5202f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5203f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5204f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5205f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5206f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5207f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_EXEC(count, re, extra, bptr, len, start_offset, 5208f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich options | g_notempty, use_offsets, use_size_offsets); 5209f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count == 0) 5210f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5211f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Matched, but too many substrings\n"); 5212f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* 2 is a special case; match can be returned */ 5213f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = (use_size_offsets == 2)? 1 : use_size_offsets/3; 5214f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5215f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5216f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5217f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Matched */ 5218f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5219f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count >= 0) 5220f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5221f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int i, maxcount; 5222f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich void *cnptr, *gnptr; 5223f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5224f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 5225f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (all_use_dfa || use_dfa) maxcount = use_size_offsets/2; else 5226f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5227f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* 2 is a special case; match can be returned */ 5228f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich maxcount = (use_size_offsets == 2)? 1 : use_size_offsets/3; 5229f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5230f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* This is a check against a lunatic return value. */ 5231f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5232f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count > maxcount) 5233f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5234f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, 5235f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "** PCRE error: returned count %d is too big for offset size %d\n", 5236f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count, use_size_offsets); 5237f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count = use_size_offsets/3; 5238f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_g || do_G) 5239f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5240f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "** /%c loop abandoned\n", do_g? 'g' : 'G'); 5241f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich do_g = do_G = FALSE; /* Break g/G loop */ 5242f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5243f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5244f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5245f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* do_allcaps requests showing of all captures in the pattern, to check 5246f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unset ones at the end. */ 5247f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5248f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_allcaps) 5249f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5250f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count) < 0) 5251f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich goto SKIP_DATA; 5252f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich count++; /* Allow for full match */ 5253f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count * 2 > use_size_offsets) count = use_size_offsets/2; 5254f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5255f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5256f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Output the captured substrings. Note that, for the matched string, 5257f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the use of \K in an assertion can make the start later than the end. */ 5258f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5259f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < count * 2; i += 2) 5260f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5261f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_offsets[i] < 0) 5262f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5263f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_offsets[i] != -1) 5264f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", 5265f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets[i], i); 5266f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_offsets[i+1] != -1) 5267f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "ERROR: bad negative value %d for offset %d\n", 5268f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets[i+1], i+1); 5269f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2d: <unset>\n", i/2); 5270f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5271f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5272f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5273f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int start = use_offsets[i]; 5274f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int end = use_offsets[i+1]; 5275f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5276f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (start > end) 5277f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5278f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start = use_offsets[i+1]; 5279f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich end = use_offsets[i]; 5280f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Start of matched string is beyond its end - " 5281f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "displaying from end to start.\n"); 5282f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5283f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5284f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2d: ", i/2); 5285f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(bptr, start, end - start, outfile); 5286f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); 5287f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5288f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5289f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Note: don't use the start/end variables here because we want to 5290f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich show the text from what is reported as the end. */ 5291f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5292f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_showcaprest || (i == 0 && do_showrest)) 5293f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5294f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2d+ ", i/2); 5295f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(bptr, use_offsets[i+1], len - use_offsets[i+1], 5296f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich outfile); 5297f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5298f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5299f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5300f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5301f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5302f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (markptr != NULL) 5303f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5304f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "MK: "); 5305f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(markptr, 0, -1, outfile); 5306f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5307f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5308f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5309f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < 32; i++) 5310f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5311f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((copystrings & (1 << i)) != 0) 5312f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5313f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5314f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich char copybuffer[256]; 5315f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_SUBSTRING(rc, bptr, use_offsets, count, i, 5316f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich copybuffer, sizeof(copybuffer)); 5317f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc < 0) 5318f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "copy substring %d failed %d\n", i, rc); 5319f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5320f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5321f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2dC ", i); 5322f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(copybuffer, 0, rc, outfile); 5323f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " (%d)\n", rc); 5324f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5325f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5326f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5327f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5328f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cnptr = copynames; 5329f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 5330f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5331f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5332f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich char copybuffer[256]; 5333f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5334f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 5335f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 5336f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5337f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint32 *)cnptr == 0) break; 5338f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5339f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5340f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 5341f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 5342f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5343f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint16 *)cnptr == 0) break; 5344f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5345f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5346f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 5347f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 5348f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5349f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint8 *)cnptr == 0) break; 5350f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5351f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5352f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5353f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_COPY_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count, 5354f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cnptr, copybuffer, sizeof(copybuffer)); 5355f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5356f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc < 0) 5357f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5358f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "copy substring "); 5359f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(cnptr, 0, -1, outfile); 5360f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " failed %d\n", rc); 5361f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5362f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5363f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5364f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " C "); 5365f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(copybuffer, 0, rc, outfile); 5366f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " (%d) ", rc); 5367f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(cnptr, 0, -1, outfile); 5368f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich putc('\n', outfile); 5369f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5370f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5371f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich cnptr = (char *)cnptr + (STRLEN(cnptr) + 1) * CHAR_SIZE; 5372f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5373f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5374f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < 32; i++) 5375f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5376f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((getstrings & (1 << i)) != 0) 5377f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5378f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5379f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *substring; 5380f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING(rc, bptr, use_offsets, count, i, &substring); 5381f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc < 0) 5382f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "get substring %d failed %d\n", i, rc); 5383f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5384f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5385f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2dG ", i); 5386f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(substring, 0, rc, outfile); 5387f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " (%d)\n", rc); 5388f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING(substring); 5389f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5390f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5391f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5392f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5393f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gnptr = getnames; 5394f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (;;) 5395f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5396f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5397f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char *substring; 5398f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5399f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 5400f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE32_MODE) 5401f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5402f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint32 *)gnptr == 0) break; 5403f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5404f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5405f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 5406f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE16_MODE) 5407f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5408f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint16 *)gnptr == 0) break; 5409f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5410f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5411f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 5412f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (pcre_mode == PCRE8_MODE) 5413f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5414f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (*(pcre_uint8 *)gnptr == 0) break; 5415f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5416f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5417f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5418f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_NAMED_SUBSTRING(rc, re, bptr, use_offsets, count, 5419f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gnptr, &substring); 5420f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc < 0) 5421f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5422f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "get substring "); 5423f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(gnptr, 0, -1, outfile); 5424f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " failed %d\n", rc); 5425f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5426f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5427f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5428f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " G "); 5429f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(substring, 0, rc, outfile); 5430f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " (%d) ", rc); 5431f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(gnptr, 0, -1, outfile); 5432f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING(substring); 5433f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich putc('\n', outfile); 5434f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5435f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5436f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich gnptr = (char *)gnptr + (STRLEN(gnptr) + 1) * CHAR_SIZE; 5437f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5438f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5439f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (getlist) 5440f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5441f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int rc; 5442f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich const char **stringlist; 5443f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_GET_SUBSTRING_LIST(rc, bptr, use_offsets, count, &stringlist); 5444f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (rc < 0) 5445f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "get substring list failed %d\n", rc); 5446f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5447f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5448f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich for (i = 0; i < count; i++) 5449f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5450f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "%2dL ", i); 5451f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(stringlist[i], 0, -1, outfile); 5452f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich putc('\n', outfile); 5453f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5454f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (stringlist[i] != NULL) 5455f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "string list not terminated by NULL\n"); 5456f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_SUBSTRING_LIST(stringlist); 5457f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5458f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5459f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5460f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5461f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* There was a partial match. If the bumpalong point is not the same as 5462f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the first inspected character, show the offset explicitly. */ 5463f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5464f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (count == PCRE_ERROR_PARTIAL) 5465f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5466f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Partial match"); 5467f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_size_offsets > 2 && use_offsets[0] != use_offsets[2]) 5468f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " at offset %d", use_offsets[2]); 5469f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (markptr != NULL) 5470f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5471f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, ", mark="); 5472f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(markptr, 0, -1, outfile); 5473f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5474f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_size_offsets > 1) 5475f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5476f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, ": "); 5477f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(bptr, use_offsets[0], use_offsets[1] - use_offsets[0], 5478f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich outfile); 5479f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5480f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); 5481f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5482f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; /* Out of the /g loop */ 5483f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5484f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5485f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Failed to match. If this is a /g or /G loop and we previously set 5486f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich g_notempty after a null match, this is not necessarily the end. We want 5487f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich to advance the start offset, and continue. We won't be at the end of the 5488f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich string - that was checked before setting g_notempty. 5489f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5490f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Complication arises in the case when the newline convention is "any", 5491f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "crlf", or "anycrlf". If the previous match was at the end of a line 5492f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich terminated by CRLF, an advance of one character just passes the \r, 5493f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich whereas we should prefer the longer newline sequence, as does the code in 5494f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich pcre_exec(). Fudge the offset value to achieve this. We check for a 5495f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich newline setting in the pattern; if none was set, use PCRE_CONFIG() to 5496f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich find the default. 5497f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5498f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Otherwise, in the case of UTF-8 matching, the advance must be one 5499f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich character, not one byte. */ 5500f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5501f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5502f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5503f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (g_notempty != 0) 5504f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5505f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int onechar = 1; 5506f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich unsigned int obits = REAL_PCRE_OPTIONS(re); 5507f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets[0] = start_offset; 5508f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((obits & PCRE_NEWLINE_BITS) == 0) 5509f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5510f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich int d; 5511f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (void)PCRE_CONFIG(PCRE_CONFIG_NEWLINE, &d); 5512f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* Note that these values are always the ASCII ones, even in 5513f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich EBCDIC environments. CR = 13, NL = 10. */ 5514f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich obits = (d == 13)? PCRE_NEWLINE_CR : 5515f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (d == 10)? PCRE_NEWLINE_LF : 5516f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : 5517f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (d == -2)? PCRE_NEWLINE_ANYCRLF : 5518f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (d == -1)? PCRE_NEWLINE_ANY : 0; 5519f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5520f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY || 5521f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_CRLF || 5522f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF) 5523f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich && 5524f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich start_offset < len - 1 && ( 5525f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE8 5526f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == PCRE8_MODE && 5527f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr[start_offset] == '\r' && 5528f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr[start_offset + 1] == '\n') || 5529f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5530f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 5531f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == PCRE16_MODE && 5532f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((PCRE_SPTR16)bptr)[start_offset] == '\r' && 5533f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((PCRE_SPTR16)bptr)[start_offset + 1] == '\n') || 5534f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5535f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 5536f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (pcre_mode == PCRE32_MODE && 5537f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((PCRE_SPTR32)bptr)[start_offset] == '\r' && 5538f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich ((PCRE_SPTR32)bptr)[start_offset + 1] == '\n') || 5539f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5540f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 0)) 5541f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich onechar++; 5542f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else if (use_utf) 5543f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5544f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich while (start_offset + onechar < len) 5545f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5546f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if ((bptr[start_offset+onechar] & 0xc0) != 0x80) break; 5547f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich onechar++; 5548f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5549f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5550f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets[1] = start_offset + onechar; 5551f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5552f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5553f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5554f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich switch(count) 5555f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5556f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_ERROR_NOMATCH: 5557f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (gmatched == 0) 5558f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5559f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (markptr == NULL) 5560f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5561f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No match"); 5562f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5563f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5564f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5565f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "No match, mark = "); 5566f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCHARSV(markptr, 0, -1, outfile); 5567f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5568f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (verify_jit && jit_was_used) fprintf(outfile, " (JIT)"); 5569f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich putc('\n', outfile); 5570f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5571f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 5572f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5573f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_ERROR_BADUTF8: 5574f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_ERROR_SHORTUTF8: 5575f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d (%s UTF-%d string)", count, 5576f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (count == PCRE_ERROR_BADUTF8)? "bad" : "short", 5577f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8 * CHAR_SIZE); 5578f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_size_offsets >= 2) 5579f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, " offset=%d reason=%d", use_offsets[0], 5580f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich use_offsets[1]); 5581f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "\n"); 5582f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 5583f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5584f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich case PCRE_ERROR_BADUTF8_OFFSET: 5585f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d (bad UTF-%d offset)\n", count, 5586f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8 * CHAR_SIZE); 5587f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 5588f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5589f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich default: 5590f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (count < 0 && 5591f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (-count) < (int)(sizeof(errtexts)/sizeof(const char *))) 5592f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d (%s)\n", count, errtexts[-count]); 5593f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5594f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Error %d (Unexpected value)\n", count); 5595f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; 5596f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5597f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5598f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich break; /* Out of the /g loop */ 5599f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5600f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5601f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5602f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If not /g or /G we are done */ 5603f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5604f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (!do_g && !do_G) break; 5605f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5606f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* If we have matched an empty string, first check to see if we are at 5607f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich the end of the subject. If so, the /g loop is over. Otherwise, mimic what 5608f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Perl's /g options does. This turns out to be rather cunning. First we set 5609f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED and try the match again at the 5610f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich same point. If this fails (picked up above) we advance to the next 5611f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich character. */ 5612f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5613f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich g_notempty = 0; 5614f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5615f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_offsets[0] == use_offsets[1]) 5616f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5617f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (use_offsets[0] == len) break; 5618f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; 5619f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5620f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5621f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* For /g, update the start offset, leaving the rest alone */ 5622f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5623f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (do_g) start_offset = use_offsets[1]; 5624f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5625f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich /* For /G, update the pointer and length */ 5626f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5627f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich else 5628f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5629f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich bptr += use_offsets[1] * CHAR_SIZE; 5630f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich len -= use_offsets[1]; 5631f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5632f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } /* End of loop for /g and /G */ 5633f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5634f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich NEXT_DATA: continue; 5635f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } /* End of loop for data lines */ 5636f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5637f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich CONTINUE: 5638f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5639f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NOPOSIX 5640f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (posix || do_posix) regfree(&preg); 5641f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5642f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5643f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (re != NULL) new_free(re); 5644f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (extra != NULL) 5645f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5646f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_FREE_STUDY(extra); 5647f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5648f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (locale_set) 5649f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5650f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich new_free((void *)tables); 5651f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich setlocale(LC_CTYPE, "C"); 5652f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich locale_set = 0; 5653f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5654f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (jit_stack != NULL) 5655f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5656f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich PCRE_JIT_STACK_FREE(jit_stack); 5657f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich jit_stack = NULL; 5658f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5659f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5660f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5661f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (infile == stdin) fprintf(outfile, "\n"); 5662f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5663f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (showtotaltimes) 5664f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5665f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "--------------------------------------\n"); 5666f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich if (timeit > 0) 5667f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich { 5668f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Total compile time %.4f milliseconds\n", 5669f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)total_compile_time * 1000.0) / (double)timeit) / 5670f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 5671f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Total study time %.4f milliseconds\n", 5672f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)total_study_time * 1000.0) / (double)timeit) / 5673f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 5674f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5675f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich fprintf(outfile, "Total execute time %.4f milliseconds\n", 5676f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (((double)total_match_time * 1000.0) / (double)timeitm) / 5677f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich (double)CLOCKS_PER_SEC); 5678f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich } 5679f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5680f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichEXIT: 5681f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5682f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (infile != NULL && infile != stdin) fclose(infile); 5683f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (outfile != NULL && outfile != stdout) fclose(outfile); 5684f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5685f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(buffer); 5686f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(dbuffer); 5687f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(pbuffer); 5688f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichfree(offsets); 5689f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5690f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE16 5691f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (buffer16 != NULL) free(buffer16); 5692f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5693f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef SUPPORT_PCRE32 5694f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (buffer32 != NULL) free(buffer32); 5695f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5696f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5697f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if !defined NODFA 5698f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichif (dfa_workspace != NULL) 5699f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich free(dfa_workspace); 5700f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5701f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5702f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined(__VMS) 5703f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich yield = SS$_NORMAL; /* Return values via DCL symbols */ 5704f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 5705f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5706f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn yield; 5707f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 5708f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5709f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* End of pcretest.c */ 5710