165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/*************************************************
265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*      Perl-Compatible Regular Expressions       *
365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/
465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is a library of functions to support regular expressions whose syntax
765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand semantics are as close as possible to those of the Perl 5 language.
865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                       Written by Philip Hazel
1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich           Copyright (c) 1997-2014 University of Cambridge
1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich-----------------------------------------------------------------------------
1365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichRedistribution and use in source and binary forms, with or without
1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodification, are permitted provided that the following conditions are met:
1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions of source code must retain the above copyright notice,
1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this list of conditions and the following disclaimer.
1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Redistributions in binary form must reproduce the above copyright
2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      notice, this list of conditions and the following disclaimer in the
2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      documentation and/or other materials provided with the distribution.
2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    * Neither the name of the University of Cambridge nor the names of its
2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      contributors may be used to endorse or promote products derived from
2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      this software without specific prior written permission.
2665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
2765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
3065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
3165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPOSSIBILITY OF SUCH DAMAGE.
3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich-----------------------------------------------------------------------------
3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This header contains definitions that are shared between the different
4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodules, but which are not relevant to the exported API. This includes some
4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunctions whose names all begin with "_pcre_", "_pcre16_" or "_pcre32_"
4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdepending on the PRIV macro. */
4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PCRE_INTERNAL_H
4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_INTERNAL_H
4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Define PCRE_DEBUG to get debugging output on stdout. */
5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if 0
5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_DEBUG
5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is compiled as an 8 bit library if it is not requested otherwise. */
5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if !defined COMPILE_PCRE16 && !defined COMPILE_PCRE32
5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define COMPILE_PCRE8
5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* If SUPPORT_UCP is defined, SUPPORT_UTF must also be defined. The
6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich"configure" script ensures this, but not everybody uses "configure". */
6365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined SUPPORT_UCP && !(defined SUPPORT_UTF)
6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define SUPPORT_UTF 1
6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
6765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* We define SUPPORT_UTF if SUPPORT_UTF8 is enabled for compatibility
6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreasons with existing code. */
7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined SUPPORT_UTF8 && !(defined SUPPORT_UTF)
7265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define SUPPORT_UTF 1
7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Fixme: SUPPORT_UTF8 should be eventually disappear from the code.
7665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUntil then we define it if SUPPORT_UTF is defined. */
7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
7865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined SUPPORT_UTF && !(defined SUPPORT_UTF8)
7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define SUPPORT_UTF8 1
8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* We do not support both EBCDIC and UTF-8/16/32 at the same time. The "configure"
8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichscript prevents both being selected, but not everybody uses "configure". */
8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined EBCDIC && defined SUPPORT_UTF
8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error The use of both EBCDIC and SUPPORT_UTF is not supported.
8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinline, and there are *still* stupid compilers about that don't like indented
9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpre-processor statements, or at least there were when I first wrote this. After
9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichall, it had only been about 10 years then...
9365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIt turns out that the Mac Debugging.h header also defines the macro DPRINTF, so
9565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbe absolutely sure we get our version. */
9665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
9765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#undef DPRINTF
9865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef PCRE_DEBUG
9965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define DPRINTF(p) printf p
10065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
10165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define DPRINTF(p) /* Nothing */
10265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
10365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Standard C headers plus the external interface definition. The only time
10665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsetjmp and stdarg are used is when NO_RECURSE is set. */
10765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
10865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <ctype.h>
10965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <limits.h>
11065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <stddef.h>
11165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <stdio.h>
11265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <stdlib.h>
11365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <string.h>
11465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Valgrind (memcheck) support */
11665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
11765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_VALGRIND
11865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <valgrind/memcheck.h>
11965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
12065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
12165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When compiling a DLL for Windows, the exported symbols have to be declared
12265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichusing some MS magic. I found some useful information on this web page:
12365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhttp://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the
12465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinformation there, using __declspec(dllexport) without "extern" we have a
12565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdefinition; with "extern" we have a declaration. The settings here override the
12665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsetting in pcre.h (which is included below); it defines only PCRE_EXP_DECL,
12765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhich is all that is needed for applications (they just import the symbols). We
12865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichuse:
12965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_EXP_DECL       for declarations
13165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_EXP_DEFN       for definitions of exported functions
13265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_EXP_DATA_DEFN  for definitions of exported variables
13365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe reason for the two DEFN macros is that in non-Windows environments, one
13565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdoes not want to have "extern" before variable definitions because it leads to
13665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompiler warnings. So we distinguish between functions and variables. In
13765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichWindows, the two should always be the same.
13865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
13965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest,
14065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhich is an application, but needs to import this file in order to "peek" at
14165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinternals, can #include pcre.h first to get an application's-eye view.
14265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon,
14465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichspecial-purpose environments) might want to stick other stuff in front of
14565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichexported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and
14665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DATA_DEFN only if they are not already set. */
14765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
14865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PCRE_EXP_DECL
14965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#  ifdef _WIN32
15065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    ifndef PCRE_STATIC
15165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DECL       extern __declspec(dllexport)
15265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DEFN       __declspec(dllexport)
15365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DATA_DEFN  __declspec(dllexport)
15465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    else
15565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DECL       extern
15665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DEFN
15765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DATA_DEFN
15865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    endif
15965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#  else
16065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    ifdef __cplusplus
16165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DECL       extern "C"
16265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    else
16365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DECL       extern
16465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    endif
16565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    ifndef PCRE_EXP_DEFN
16665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DEFN       PCRE_EXP_DECL
16765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    endif
16865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    ifndef PCRE_EXP_DATA_DEFN
16965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#      define PCRE_EXP_DATA_DEFN
17065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#    endif
17165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#  endif
17265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
17365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When compiling with the MSVC compiler, it is sometimes necessary to include
17565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevicha "calling convention" before exported function names. (This is secondhand
17665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinformation; I know nothing about MSVC myself). For example, something like
17765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
17865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void __cdecl function(....)
17965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmight be needed. In order so make this easy, all the exported functions have
18165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_CALL_CONVENTION just before their names. It is rarely needed; if not
18265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichset, we ensure here that it has no effect. */
18365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PCRE_CALL_CONVENTION
18565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_CALL_CONVENTION
18665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
18765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
18865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* We need to have types that specify unsigned 8, 16 and 32-bit integers. We
18965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcannot determine these outside the compilation (e.g. by running a program as
19065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpart of "configure") because PCRE is often cross-compiled for use on other
19165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsystems. Instead we make use of the maximum sizes that are available at
19265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpreprocessor time in standard C environments. */
19365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned char pcre_uint8;
19565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
19665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if USHRT_MAX == 65535
19765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned short pcre_uint16;
19865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef short pcre_int16;
19965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_UINT16_MAX USHRT_MAX
20065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_INT16_MAX SHRT_MAX
20165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif UINT_MAX == 65535
20265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned int pcre_uint16;
20365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef int pcre_int16;
20465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_UINT16_MAX UINT_MAX
20565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_INT16_MAX INT_MAX
20665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
20765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Cannot determine a type for 16-bit integers
20865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
20965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
21065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if UINT_MAX == 4294967295U
21165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned int pcre_uint32;
21265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef int pcre_int32;
21365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_UINT32_MAX UINT_MAX
21465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_INT32_MAX INT_MAX
21565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif ULONG_MAX == 4294967295UL
21665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned long int pcre_uint32;
21765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef long int pcre_int32;
21865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_UINT32_MAX ULONG_MAX
21965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_INT32_MAX LONG_MAX
22065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
22165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Cannot determine a type for 32-bit integers
22265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
22365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
22465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When checking for integer overflow in pcre_compile(), we need to handle
22565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlarge integers. If a 64-bit integer type is available, we can use that.
22665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOtherwise we have to cast to double, which of course requires floating point
22765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevicharithmetic. Handle this by defining a macro for the appropriate type. If
22865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstdint.h is available, include it; it may define INT64_MAX. Systems that do not
22965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhave stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set
23065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichby "configure". */
23165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
23265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined HAVE_STDINT_H
23365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <stdint.h>
23465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined HAVE_INTTYPES_H
23565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include <inttypes.h>
23665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
23765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
23865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined INT64_MAX || defined int64_t
23965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define INT64_OR_DOUBLE int64_t
24065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
24165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define INT64_OR_DOUBLE double
24265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
24365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
24465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* All character handling must be done as unsigned characters. Otherwise there
24565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichare problems with top-bit-set characters and functions such as isspace().
24665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichHowever, we leave the interface to the outside world as char * or short *,
24765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbecause that should make things easier for callers. This character type is
24865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcalled pcre_uchar.
24965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe IN_UCHARS macro multiply its argument with the byte size of the current
25165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_uchar type. Useful for memcpy and such operations, whose require the
25265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbyte size of their input/output buffers.
25365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe MAX_255 macro checks whether its pcre_uchar input is less than 256.
25565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
25665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe TABLE_GET macro is designed for accessing elements of tables whose contain
25765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichexactly 256 items. When the character is able to contain more than 256
25865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichitems, some check is needed before accessing these tables.
25965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
26065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
26265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef unsigned char pcre_uchar;
26465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IN_UCHARS(x) (x)
26565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_255(c) 1
26665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define TABLE_GET(c, table, default) ((table)[c])
26765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
26865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
26965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
27065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if USHRT_MAX != 65535
27165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This is a warning message. Change PCRE_UCHAR16 to a 16 bit data type in
27265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre.h(.in) and disable (comment out) this message. */
27365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Warning: PCRE_UCHAR16 is not a 16 bit data type.
27465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
27565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
27665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef pcre_uint16 pcre_uchar;
27765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR_SHIFT (1)
27865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
27965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_255(c) ((c) <= 255u)
28065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
28165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
28365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
28465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef pcre_uint32 pcre_uchar;
28565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR_SHIFT (2)
28665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
28765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_255(c) ((c) <= 255u)
28865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
28965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
29165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Unsupported compiling mode
29265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
29365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This is an unsigned int value that no character can ever have. UTF-8
29565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcharacters only go up to 0x7fffffff (though Unicode doesn't go beyond
29665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich0x0010ffff). */
29765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
29865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NOTACHAR 0xffffffff
29965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is able to support several different kinds of newline (CR, LF, CRLF,
30165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich"any" and "anycrlf" at present). The following macros are used to package up
30265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtesting for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various
30365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodules to indicate in which datablock the parameters exist, and what the
30465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstart/end of string field names are. */
30565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
30665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NLTYPE_FIXED    0     /* Newline is a fixed length string */
30765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NLTYPE_ANY      1     /* Newline is any Unicode line ending */
30865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NLTYPE_ANYCRLF  2     /* Newline is CR, LF, or CRLF */
30965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This macro checks for a newline at the given position */
31165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
31265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IS_NEWLINE(p) \
31365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
31465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ((p) < NLBLOCK->PSEND && \
31565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \
31665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       &(NLBLOCK->nllen), utf)) \
31765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    : \
31865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \
31965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     UCHAR21TEST(p) == NLBLOCK->nl[0] && \
32065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     (NLBLOCK->nllen == 1 || UCHAR21TEST(p+1) == NLBLOCK->nl[1])       \
32165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ) \
32265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  )
32365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This macro checks for a newline immediately preceding the given position */
32565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
32665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define WAS_NEWLINE(p) \
32765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  ((NLBLOCK->nltype != NLTYPE_FIXED)? \
32865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ((p) > NLBLOCK->PSSTART && \
32965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \
33065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       &(NLBLOCK->nllen), utf)) \
33165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    : \
33265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \
33365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     UCHAR21TEST(p - NLBLOCK->nllen) == NLBLOCK->nl[0] &&              \
33465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich     (NLBLOCK->nllen == 1 || UCHAR21TEST(p - NLBLOCK->nllen + 1) == NLBLOCK->nl[1]) \
33565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    ) \
33665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  )
33765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
33865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When PCRE is compiled as a C++ library, the subject pointer can be replaced
33965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwith a custom type. This makes it possible, for example, to allow pcre_exec()
34065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichto process subject strings that are discontinuous by using a smart pointer
34165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichclass. It must always be possible to inspect all of the subject string in
34265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_exec() because of the way it backtracks. Two macros are required in the
34365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnormal case, for sign-unspecified and unsigned char pointers. The former is
34465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichused for the external interface and appears in pcre.h, which is why its name
34565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmust begin with PCRE_. */
34665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
34765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef CUSTOM_SUBJECT_PTR
34865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_PUCHAR CUSTOM_SUBJECT_PTR
34965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
35065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_PUCHAR const pcre_uchar *
35165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
35265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Include the public PCRE header and the definitions of UCP character property
35465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvalues. */
35565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre.h"
35765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "ucp.h"
35865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
35965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE32
36065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Assert that the public PCRE_UCHAR32 is a 32-bit type */
36165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef int __assert_pcre_uchar32_size[sizeof(PCRE_UCHAR32) == 4 ? 1 : -1];
36265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
36365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When compiling for use with the Virtual Pascal compiler, these functions
36565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichneed to have their names changed. PCRE must be compiled with the -DVPCOMPAT
36665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichoption on the command line. */
36765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
36865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef VPCOMPAT
36965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define strlen(s)        _strlen(s)
37065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
37165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memcmp(s,c,n)    _memcmp(s,c,n)
37265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memcpy(d,s,n)    _memcpy(d,s,n)
37365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memmove(d,s,n)   _memmove(d,s,n)
37465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memset(s,c,n)    _memset(s,c,n)
37565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else  /* VPCOMPAT */
37665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
37765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
37865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdefine a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
37965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichis set. Otherwise, include an emulating function for those systems that have
38065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichneither (there some non-Unix environments where this is the case). */
38165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
38265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef HAVE_MEMMOVE
38365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#undef  memmove        /* some systems may have a macro */
38465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef HAVE_BCOPY
38565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memmove(a, b, c) bcopy(b, a, c)
38665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else  /* HAVE_BCOPY */
38765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstatic void *
38865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_memmove(void *d, const void *s, size_t n)
38965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{
39065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsize_t i;
39165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichunsigned char *dest = (unsigned char *)d;
39265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichconst unsigned char *src = (const unsigned char *)s;
39365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (dest > src)
39465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
39565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  dest += n;
39665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  src += n;
39765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  for (i = 0; i < n; ++i) *(--dest) = *(--src);
39865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return (void *)dest;
39965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
40065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichelse
40165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  {
40265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  for (i = 0; i < n; ++i) *dest++ = *src++;
40365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  return (void *)(dest - n);
40465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  }
40565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich}
40665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define memmove(a, b, c) pcre_memmove(a, b, c)
40765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif   /* not HAVE_BCOPY */
40865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif   /* not HAVE_MEMMOVE */
40965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif   /* not VPCOMPAT */
41065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
41265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored
41365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichin big-endian order) by default. These are used, for example, to link from the
41465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstart of a subpattern to its alternatives and its end. The use of 2 bytes per
41565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichoffset limits the size of the compiled regex to around 64K, which is big enough
41665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor almost everybody. However, I received a request for an even bigger limit.
41765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichFor this reason, and also to make the code easier to maintain, the storing and
41865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichloading of offsets from the byte string is now handled by the macros that are
41965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdefined here.
42065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe macros are controlled by the value of LINK_SIZE. This defaults to 2 in
42265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe config.h file, but can be overridden by using -D on the command line. This
42365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichis automated on Unix systems via the "configure" command. */
42465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
42665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if LINK_SIZE == 2
42865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
42965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)   \
43065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d) >> 8), \
43165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+1] = (d) & 255)
43265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
43465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (((a)[n] << 8) | (a)[(n)+1])
43565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 16)
43765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
43965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif LINK_SIZE == 3
44065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)       \
44265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d) >> 16),    \
44365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+1] = (d) >> 8), \
44465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+2] = (d) & 255)
44565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
44765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
44865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
44965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 24)
45065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif LINK_SIZE == 4
45365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
45465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)        \
45565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d) >> 24),     \
45665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+1] = (d) >> 16), \
45765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+2] = (d) >> 8),  \
45865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+3] = (d) & 255)
45965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
46165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
46265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Keep it positive */
46465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 30)
46565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
46665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
46765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error LINK_SIZE must be either 2, 3, or 4
46865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
46965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
47165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if LINK_SIZE == 2
47365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
47565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#undef LINK_SIZE
47665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define LINK_SIZE 1
47765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
47865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)   \
47965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d))
48065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
48265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n])
48365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 16)
48565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif LINK_SIZE == 3 || LINK_SIZE == 4
48765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
48865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
48965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#undef LINK_SIZE
49065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define LINK_SIZE 2
49165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)   \
49365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d) >> 16), \
49465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[(n)+1] = (d) & 65535)
49565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
49765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (((a)[n] << 16) | (a)[(n)+1])
49865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
49965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Keep it positive */
50065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 30)
50165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
50365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error LINK_SIZE must be either 2, 3, or 4
50465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
50565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
50765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
50865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Only supported LINK_SIZE is 4 */
50965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Redefine LINK_SIZE as a multiple of sizeof(pcre_uchar) */
51065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#undef LINK_SIZE
51165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define LINK_SIZE 1
51265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT(a,n,d)   \
51465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n] = (d))
51565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET(a,n) \
51765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (a[n])
51865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
51965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Keep it positive */
52065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_PATTERN_SIZE (1 << 30)
52165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
52365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Unsupported compiling mode
52465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
52565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Convenience macro defined in terms of the others */
52765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
52865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUTINC(a,n,d)   PUT(a,n,d), a += LINK_SIZE
52965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE uses some other 2-byte quantities that do not change when the size of
53265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichoffsets changes. There are used for repeat counts and for other things such as
53365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcapturing parenthesis numbers in back references. */
53465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
53665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IMM2_SIZE 2
53865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
53965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT2(a,n,d)   \
54065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  a[n] = (d) >> 8; \
54165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  a[(n)+1] = (d) & 255
54265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
54365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* For reasons that I do not understand, the expression in this GET2 macro is
54465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtreated by gcc as a signed expression, even when a is declared as unsigned. It
54565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichseems that any kind of arithmetic results in a signed value. */
54665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
54765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET2(a,n) \
54865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (unsigned int)(((a)[n] << 8) | (a)[(n)+1])
54965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
55165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IMM2_SIZE 1
55365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT2(a,n,d)   \
55565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   a[n] = d
55665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
55765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET2(a,n) \
55865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   a[n]
55965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
56165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define IMM2_SIZE 1
56365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT2(a,n,d)   \
56565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   a[n] = d
56665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
56765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET2(a,n) \
56865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   a[n]
56965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
57165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Unsupported compiling mode
57265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
57365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUT2INC(a,n,d)  PUT2(a,n,d), a += IMM2_SIZE
57565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The maximum length of a MARK name is currently one data unit; it may be
57765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichchanged in future to be a fixed number of bytes or to depend on LINK_SIZE. */
57865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
57965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE16 || defined COMPILE_PCRE32
58065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_MARK ((1u << 16) - 1)
58165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
58265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_MARK ((1u << 8) - 1)
58365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
58465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
58565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* There is a proposed future special "UTF-21" mode, in which only the lowest
58665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich21 bits of a 32-bit character are interpreted as UTF, with the remaining 11
58765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhigh-order bits available to the application for other uses. In preparation for
58865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe future implementation of this mode, there are macros that load a data item
58965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand, if in this special mode, mask it to 21 bits. These macros all have names
59065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichstarting with UCHAR21. In all other modes, including the normal 32-bit
59165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlibrary, the macros all have the same simple definitions. When the new mode is
59265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichimplemented, it is expected that these definitions will be varied appropriately
59365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichusing #ifdef when compiling the library that supports the special mode. */
59465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
59565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR21(eptr)        (*(eptr))
59665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR21TEST(eptr)    (*(eptr))
59765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR21INC(eptr)     (*(eptr)++)
59865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCHAR21INCTEST(eptr) (*(eptr)++)
59965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* When UTF encoding is being used, a character is no longer just a single
60165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbyte in 8-bit mode or a single short in 16-bit mode. The macros for character
60265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhandling generate simple sequences when used in the basic mode, and more
60365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcomplicated ones for UTF characters. GETCHARLENTEST and other macros are not
60465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichused when UTF is not supported. To make sure they can never even appear when
60565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUTF support is omitted, we don't even define them. */
60665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef SUPPORT_UTF
60865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
60965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define MAX_VALUE_FOR_SINGLE_CHAR */
61065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define HAS_EXTRALEN(c) */
61165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define GET_EXTRALEN(c) */
61265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define NOT_FIRSTCHAR(c) */
61365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHAR(c, eptr) c = *eptr;
61465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARTEST(c, eptr) c = *eptr;
61565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINC(c, eptr) c = *eptr++;
61665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINCTEST(c, eptr) c = *eptr++;
61765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLEN(c, eptr, len) c = *eptr;
61865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define GETCHARLENTEST(c, eptr, len) */
61965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define BACKCHAR(eptr) */
62065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define FORWARDCHAR(eptr) */
62165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* #define ACROSSCHAR(condition, eptr, action) */
62265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else   /* SUPPORT_UTF */
62465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tests whether the code point needs extra characters to decode. */
62665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HASUTF8EXTRALEN(c) ((c) >= 0xc0)
62865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
62965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the remaining bytes of a UTF-8 character, not
63065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichadvancing the pointer. */
63165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
63265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF8(c, eptr) \
63365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { \
63465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if ((c & 0x20) == 0) \
63565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
63665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x10) == 0) \
63765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
63865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x08) == 0) \
63965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
64065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
64165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x04) == 0) \
64265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
64365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
64465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          (eptr[4] & 0x3f); \
64565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else \
64665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
64765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
64865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
64965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
65065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
65165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing
65265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe pointer. */
65365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
65465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF8INC(c, eptr) \
65565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { \
65665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if ((c & 0x20) == 0) \
65765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \
65865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x10) == 0) \
65965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
66065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \
66165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      eptr += 2; \
66265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
66365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x08) == 0) \
66465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
66565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \
66665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
66765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      eptr += 3; \
66865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
66965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x04) == 0) \
67065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
67165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \
67265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \
67365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          (eptr[3] & 0x3f); \
67465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      eptr += 4; \
67565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
67665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else \
67765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
67865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \
67965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \
68065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \
68165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      eptr += 5; \
68265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
68365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
68465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
68565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
68665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
68765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* These macros were originally written in the form of loops that used data
68865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfrom the tables whose names start with PRIV(utf8_table). They were rewritten by
68965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevicha user so as not to use loops, because in some environments this gives a
69065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsignificant performance advantage, and it seems never to do any harm. */
69165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
69265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tells the biggest code point which can be encoded as a single character. */
69365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
69465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_VALUE_FOR_SINGLE_CHAR 127
69565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
69665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tests whether the code point needs extra characters to decode. */
69765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
69865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HAS_EXTRALEN(c) ((c) >= 0xc0)
69965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
70165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOtherwise it has an undefined behaviour. */
70265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f])
70465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Returns TRUE, if the given character is not the first character
70665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichof a UTF sequence. */
70765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
70865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NOT_FIRSTCHAR(c) (((c) & 0xc0) == 0x80)
70965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
71065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-8 character, not advancing the pointer. This is called when
71165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwe know we are in UTF-8 mode. */
71265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
71365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHAR(c, eptr) \
71465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
71565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c >= 0xc0) GETUTF8(c, eptr);
71665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
71765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the
71865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer. */
71965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
72065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARTEST(c, eptr) \
72165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
72265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && c >= 0xc0) GETUTF8(c, eptr);
72365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
72465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-8 character, advancing the pointer. This is called when we
72565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichknow we are in UTF-8 mode. */
72665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
72765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINC(c, eptr) \
72865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr++; \
72965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c >= 0xc0) GETUTF8INC(c, eptr);
73065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next character, testing for UTF-8 mode, and advancing the pointer.
73265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis is called when we don't know if we are in UTF-8 mode. */
73365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINCTEST(c, eptr) \
73565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr++; \
73665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && c >= 0xc0) GETUTF8INC(c, eptr);
73765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
73865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the remaining bytes of a UTF-8 character, not
73965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichadvancing the pointer, incrementing the length. */
74065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
74165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF8LEN(c, eptr, len) \
74265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    { \
74365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    if ((c & 0x20) == 0) \
74465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
74565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \
74665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      len++; \
74765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
74865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x10)  == 0) \
74965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
75065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \
75165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      len += 2; \
75265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
75365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x08)  == 0) \
75465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {\
75565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \
75665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \
75765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      len += 3; \
75865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
75965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else if ((c & 0x04)  == 0) \
76065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      { \
76165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \
76265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \
76365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          (eptr[4] & 0x3f); \
76465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      len += 4; \
76565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
76665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    else \
76765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      {\
76865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \
76965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \
77065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich          ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \
77165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      len += 5; \
77265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich      } \
77365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    }
77465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
77565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-8 character, not advancing the pointer, incrementing length
77665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif there are extra bytes. This is called when we know we are in UTF-8 mode. */
77765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
77865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLEN(c, eptr, len) \
77965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
78065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (c >= 0xc0) GETUTF8LEN(c, eptr, len);
78165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
78265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the
78365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer, incrementing length if there are extra bytes. This is called when we
78465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdo not know if we are in UTF-8 mode. */
78565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
78665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLENTEST(c, eptr, len) \
78765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
78865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len);
78965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* If the pointer is not at the start of a character, move it back until
79165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichit is. This is called only in UTF-8 mode - we don't put a test within the macro
79265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbecause almost all calls are already within a block of UTF-8 only code. */
79365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--
79565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, just in the other direction. */
79765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++
79865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
79965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, but it allows a fully customizable form. */
80065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ACROSSCHAR(condition, eptr, action) \
80165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  while((condition) && ((eptr) & 0xc0) == 0x80) action
80265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
80465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tells the biggest code point which can be encoded as a single character. */
80665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_VALUE_FOR_SINGLE_CHAR 65535
80865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
80965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tests whether the code point needs extra characters to decode. */
81065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800)
81265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE.
81465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOtherwise it has an undefined behaviour. */
81565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET_EXTRALEN(c) 1
81765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
81865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Returns TRUE, if the given character is not the first character
81965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichof a UTF sequence. */
82065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NOT_FIRSTCHAR(c) (((c) & 0xfc00) == 0xdc00)
82265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the low surrogate of a UTF-16 character, not
82465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichadvancing the pointer. */
82565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF16(c, eptr) \
82765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; }
82865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
82965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-16 character, not advancing the pointer. This is called when
83065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwe know we are in UTF-16 mode. */
83165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
83265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHAR(c, eptr) \
83365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
83465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
83565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
83665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the
83765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer. */
83865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
83965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARTEST(c, eptr) \
84065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
84165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr);
84265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
84365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the low surrogate of a UTF-16 character, advancing
84465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe pointer. */
84565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
84665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF16INC(c, eptr) \
84765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; }
84865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
84965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-16 character, advancing the pointer. This is called when we
85065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichknow we are in UTF-16 mode. */
85165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
85265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINC(c, eptr) \
85365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr++; \
85465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
85565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
85665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next character, testing for UTF-16 mode, and advancing the pointer.
85765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis is called when we don't know if we are in UTF-16 mode. */
85865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
85965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINCTEST(c, eptr) \
86065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr++; \
86165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr);
86265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
86365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Base macro to pick up the low surrogate of a UTF-16 character, not
86465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichadvancing the pointer, incrementing the length. */
86565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
86665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETUTF16LEN(c, eptr, len) \
86765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; }
86865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
86965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-16 character, not advancing the pointer, incrementing
87065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlength if there is a low surrogate. This is called when we know we are in
87165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUTF-16 mode. */
87265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
87365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLEN(c, eptr, len) \
87465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
87565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
87665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
87765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the
87865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer, incrementing length if there is a low surrogate. This is called when
87965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwe do not know if we are in UTF-16 mode. */
88065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
88165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLENTEST(c, eptr, len) \
88265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *eptr; \
88365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len);
88465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
88565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* If the pointer is not at the start of a character, move it back until
88665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichit is. This is called only in UTF-16 mode - we don't put a test within the
88765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmacro because almost all calls are already within a block of UTF-16 only
88865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcode. */
88965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
89065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr--
89165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
89265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, just in the other direction. */
89365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++
89465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
89565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, but it allows a fully customizable form. */
89665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ACROSSCHAR(condition, eptr, action) \
89765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action
89865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
89965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
90065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
90165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* These are trivial for the 32-bit library, since all UTF-32 characters fit
90265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinto one pcre_uchar unit. */
90365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAX_VALUE_FOR_SINGLE_CHAR (0x10ffffu)
90465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HAS_EXTRALEN(c) (0)
90565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET_EXTRALEN(c) (0)
90665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define NOT_FIRSTCHAR(c) (0)
90765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
90865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-32 character, not advancing the pointer. This is called when
90965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwe know we are in UTF-32 mode. */
91065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
91165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHAR(c, eptr) \
91265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *(eptr);
91365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
91465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-32 character, testing for UTF-32 mode, and not advancing the
91565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer. */
91665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
91765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARTEST(c, eptr) \
91865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *(eptr);
91965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
92065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-32 character, advancing the pointer. This is called when we
92165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichknow we are in UTF-32 mode. */
92265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
92365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINC(c, eptr) \
92465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *((eptr)++);
92565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
92665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next character, testing for UTF-32 mode, and advancing the pointer.
92765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis is called when we don't know if we are in UTF-32 mode. */
92865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
92965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARINCTEST(c, eptr) \
93065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  c = *((eptr)++);
93165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
93265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-32 character, not advancing the pointer, not incrementing
93365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlength (since all UTF-32 is of length 1). This is called when we know we are in
93465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichUTF-32 mode. */
93565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
93665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLEN(c, eptr, len) \
93765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GETCHAR(c, eptr)
93865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
93965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Get the next UTF-32character, testing for UTF-32 mode, not advancing the
94065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer, not incrementing the length (since all UTF-32 is of length 1).
94165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis is called when we do not know if we are in UTF-32 mode. */
94265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
94365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GETCHARLENTEST(c, eptr, len) \
94465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  GETCHARTEST(c, eptr)
94565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
94665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* If the pointer is not at the start of a character, move it back until
94765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichit is. This is called only in UTF-32 mode - we don't put a test within the
94865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmacro because almost all calls are already within a block of UTF-32 only
94965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcode.
95065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThese are all no-ops since all UTF-32 characters fit into one pcre_uchar. */
95165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
95265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define BACKCHAR(eptr) do { } while (0)
95365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
95465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, just in the other direction. */
95565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define FORWARDCHAR(eptr) do { } while (0)
95665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
95765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Same as above, but it allows a fully customizable form. */
95865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ACROSSCHAR(condition, eptr, action) do { } while (0)
95965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
96065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
96165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Unsupported compiling mode
96265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
96365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
96465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif  /* SUPPORT_UTF */
96565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
96665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Tests for Unicode horizontal and vertical whitespace characters must check a
96765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnumber of different values. Using a switch statement for this generates the
96865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfastest code (no loop, no memory access), and there are several places in the
96965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinterpreter code where this happens. In order to ensure that all the case lists
97065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichremain in step, we use macros so that there is only one place where the lists
97165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichare defined.
97265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
97365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThese values are also required as lists in pcre_compile.c when processing \h,
97465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich\H, \v and \V in a character class. The lists are defined in pcre_tables.c, but
97565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmacros that define the values are here so that all the definitions are
97665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtogether. The lists must be in ascending character order, terminated by
97765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichNOTACHAR (which is 0xffffffff).
97865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
97965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAny changes should ensure that the various macros are kept in step with each
98065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichother. NOTE: The values also appear in pcre_jit_compile.c. */
98165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
98265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* ------ ASCII/Unicode environments ------ */
98365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
98465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef EBCDIC
98565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
98665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_LIST \
98765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CHAR_HT, CHAR_SPACE, 0xa0, \
98865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, \
98965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202f, 0x205f, 0x3000, \
99065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  NOTACHAR
99165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
99265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_MULTIBYTE_CASES \
99365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x1680:  /* OGHAM SPACE MARK */ \
99465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x180e:  /* MONGOLIAN VOWEL SEPARATOR */ \
99565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2000:  /* EN QUAD */ \
99665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2001:  /* EM QUAD */ \
99765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2002:  /* EN SPACE */ \
99865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2003:  /* EM SPACE */ \
99965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2004:  /* THREE-PER-EM SPACE */ \
100065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2005:  /* FOUR-PER-EM SPACE */ \
100165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2006:  /* SIX-PER-EM SPACE */ \
100265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2007:  /* FIGURE SPACE */ \
100365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2008:  /* PUNCTUATION SPACE */ \
100465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2009:  /* THIN SPACE */ \
100565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x200A:  /* HAIR SPACE */ \
100665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x202f:  /* NARROW NO-BREAK SPACE */ \
100765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x205f:  /* MEDIUM MATHEMATICAL SPACE */ \
100865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x3000   /* IDEOGRAPHIC SPACE */
100965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
101065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_BYTE_CASES \
101165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_HT: \
101265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_SPACE: \
101365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0xa0     /* NBSP */
101465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
101565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_CASES \
101665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  HSPACE_BYTE_CASES: \
101765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  HSPACE_MULTIBYTE_CASES
101865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
101965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_LIST \
102065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CHAR_LF, CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, 0x2028, 0x2029, NOTACHAR
102165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
102265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_MULTIBYTE_CASES \
102365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2028:    /* LINE SEPARATOR */ \
102465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case 0x2029     /* PARAGRAPH SEPARATOR */
102565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
102665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_BYTE_CASES \
102765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_LF: \
102865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_VT: \
102965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_FF: \
103065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_CR: \
103165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_NEL
103265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
103365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_CASES \
103465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  VSPACE_BYTE_CASES: \
103565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  VSPACE_MULTIBYTE_CASES
103665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
103765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* ------ EBCDIC environments ------ */
103865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
103965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
104065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_LIST CHAR_HT, CHAR_SPACE
104165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
104265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_BYTE_CASES \
104365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_HT: \
104465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_SPACE
104565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
104665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define HSPACE_CASES HSPACE_BYTE_CASES
104765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
104865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef EBCDIC_NL25
104965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_LIST \
105065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_NEL, CHAR_LF, NOTACHAR
105165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
105265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_LIST \
105365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  CHAR_VT, CHAR_FF, CHAR_CR, CHAR_LF, CHAR_NEL, NOTACHAR
105465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
105565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
105665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_BYTE_CASES \
105765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_LF: \
105865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_VT: \
105965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_FF: \
106065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_CR: \
106165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  case CHAR_NEL
106265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
106365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define VSPACE_CASES VSPACE_BYTE_CASES
106465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif  /* EBCDIC */
106565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
106665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* ------ End of whitespace macros ------ */
106765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
106865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
106965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
107065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Private flags containing information about the compiled regex. They used to
107165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlive at the top end of the options word, but that got almost full, so they were
107265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmoved to a 16-bit flags word - which got almost full, so now they are in a
107365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich32-bit flags word. From release 8.00, PCRE_NOPARTIAL is unused, as the
107465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrestrictions on partial matching have been lifted. It remains for backwards
107565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompatibility. */
107665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
107765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE8         0x00000001  /* compiled in 8 bit mode */
107865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE16        0x00000002  /* compiled in 16 bit mode */
107965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE32        0x00000004  /* compiled in 32 bit mode */
108065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_FIRSTSET      0x00000010  /* first_char is set */
108165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_FCH_CASELESS  0x00000020  /* caseless first char */
108265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_REQCHSET      0x00000040  /* req_byte is set */
108365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_RCH_CASELESS  0x00000080  /* caseless requested char */
108465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_STARTLINE     0x00000100  /* start after \n for multiline */
108565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_NOPARTIAL     0x00000200  /* can't use partial with this regex */
108665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_JCHANGED      0x00000400  /* j option used in regex */
108765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_HASCRORLF     0x00000800  /* explicit \r or \n in pattern */
108865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_HASTHEN       0x00001000  /* pattern contains (*THEN) */
108965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MLSET         0x00002000  /* match limit set by regex */
109065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_RLSET         0x00004000  /* recursion limit set by regex */
109165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MATCH_EMPTY   0x00008000  /* pattern can match empty string */
109265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
109365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
109465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE          PCRE_MODE8
109565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
109665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE          PCRE_MODE16
109765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
109865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE          PCRE_MODE32
109965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
110065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_MODE_MASK     (PCRE_MODE8 | PCRE_MODE16 | PCRE_MODE32)
110165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
110265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Flags for the "extra" block produced by pcre_study(). */
110365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
110465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_STUDY_MAPPED  0x0001  /* a map of starting chars exists */
110565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_STUDY_MINLEN  0x0002  /* a minimum length field exists */
110665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
110765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Masks for identifying the public options that are permitted at compile
110865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtime, run time, or study time, respectively. */
110965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
111065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \
111165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           PCRE_NEWLINE_ANYCRLF)
111265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
111365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBLIC_COMPILE_OPTIONS \
111465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
111565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
111665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_NO_AUTO_CAPTURE|PCRE_NO_AUTO_POSSESS| \
111765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \
111865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \
111965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_JAVASCRIPT_COMPAT|PCRE_UCP|PCRE_NO_START_OPTIMIZE|PCRE_NEVER_UTF)
112065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
112165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBLIC_EXEC_OPTIONS \
112265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \
112365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \
112465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE)
112565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
112665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBLIC_DFA_EXEC_OPTIONS \
112765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \
112865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \
112965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \
113065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   PCRE_NO_START_OPTIMIZE)
113165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
113265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBLIC_STUDY_OPTIONS \
113365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   (PCRE_STUDY_JIT_COMPILE|PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE| \
113465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE|PCRE_STUDY_EXTRA_NEEDED)
113565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
113665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBLIC_JIT_EXEC_OPTIONS \
113765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich   (PCRE_NO_UTF8_CHECK|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|\
113865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich    PCRE_NOTEMPTY_ATSTART|PCRE_PARTIAL_SOFT|PCRE_PARTIAL_HARD)
113965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
114065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Magic number to provide a small check against being handed junk. */
114165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
114265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define MAGIC_NUMBER  0x50435245UL   /* 'PCRE' */
114365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
114465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This variable is used to detect a loaded regular expression
114565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichin different endianness. */
114665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
114765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REVERSED_MAGIC_NUMBER  0x45524350UL   /* 'ERCP' */
114865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
114965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The maximum remaining length of subject we are prepared to search for a
115065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreq_byte match. */
115165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
115265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REQ_BYTE_MAX 1000
115365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
115465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in
115565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichenvironments where these macros are defined elsewhere. Unfortunately, there
115665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichis no way to do the same for the typedef. */
115765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
115865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef int BOOL;
115965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
116065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef FALSE
116165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define FALSE   0
116265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define TRUE    1
116365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
116465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
116565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal
116665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcharacter constants like '*' because the compiler would emit their EBCDIC code,
116765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhich is different from their ASCII/UTF-8 code. Instead we define macros for
116865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthe characters so that they always use the ASCII/UTF-8 code when UTF-8 support
116965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichis enabled. When UTF-8 support is not enabled, the definitions use character
117065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichliterals. Both character and string versions of each character are needed, and
117165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthere are some longer strings as well.
117265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
117365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis means that, on EBCDIC platforms, the PCRE library can handle either
117465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichEBCDIC, or UTF-8, but not both. To support both in the same compiled library
117565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwould need different lookups depending on whether PCRE_UTF8 was set or not.
117665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThis would make it impossible to use characters in switch/case statements,
117765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhich would reduce performance. For a theoretical use (which nobody has asked
117865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor) in a minority area (EBCDIC platforms), this is not sensible. Any
117965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichapplication that did need both could compile two versions of the library, using
118065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmacros to give the functions distinct names. */
118165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
118265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef SUPPORT_UTF
118365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
118465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* UTF-8 support is not enabled; use the platform-dependent character literals
118565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichso that PCRE works in both ASCII and EBCDIC environments, but only in non-UTF
118665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmode. Newline characters are problematic in EBCDIC. Though it has CR and LF
118765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcharacters, a common practice has been to use its NL (0x15) character as the
118865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichline terminator in C-like processing environments. However, sometimes the LF
118965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(0x25) character is used instead, according to this Unicode document:
119065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
119165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhttp://unicode.org/standard/reports/tr13/tr13-5.html
119265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
119365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE defaults EBCDIC NL to 0x15, but has a build-time option to select 0x25
119465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinstead. Whichever is *not* chosen is defined as NEL.
119565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
119665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIn both ASCII and EBCDIC environments, CHAR_NL and CHAR_LF are synonyms for the
119765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsame code point. */
119865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
119965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef EBCDIC
120065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
120165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef EBCDIC_NL25
120265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NL                     '\x15'
120365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NEL                    '\x25'
120465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NL                      "\x15"
120565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NEL                     "\x25"
120665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
120765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NL                     '\x25'
120865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NEL                    '\x15'
120965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NL                      "\x25"
121065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NEL                     "\x15"
121165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
121265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
121365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LF                     CHAR_NL
121465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LF                      STR_NL
121565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
121665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_ESC                    '\047'
121765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DEL                    '\007'
121865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_ESC                     "\047"
121965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DEL                     "\007"
122065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
122165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else  /* Not EBCDIC */
122265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
122365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* In ASCII/Unicode, linefeed is '\n' and we equate this to NL for
122465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompatibility. NEL is the Unicode newline character; make sure it is
122565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevicha positive value. */
122665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
122765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LF                     '\n'
122865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NL                     CHAR_LF
122965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NEL                    ((unsigned char)'\x85')
123065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_ESC                    '\033'
123165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DEL                    '\177'
123265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
123365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LF                      "\n"
123465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NL                      STR_LF
123565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NEL                     "\x85"
123665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_ESC                     "\033"
123765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DEL                     "\177"
123865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
123965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif  /* EBCDIC */
124065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
124165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The remaining definitions work in both environments. */
124265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
124365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NULL                   '\0'
124465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_HT                     '\t'
124565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_VT                     '\v'
124665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_FF                     '\f'
124765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_CR                     '\r'
124865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BS                     '\b'
124965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BEL                    '\a'
125065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
125165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SPACE                  ' '
125265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_EXCLAMATION_MARK       '!'
125365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_QUOTATION_MARK         '"'
125465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NUMBER_SIGN            '#'
125565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DOLLAR_SIGN            '$'
125665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_PERCENT_SIGN           '%'
125765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_AMPERSAND              '&'
125865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_APOSTROPHE             '\''
125965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_PARENTHESIS       '('
126065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_PARENTHESIS      ')'
126165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_ASTERISK               '*'
126265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_PLUS                   '+'
126365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COMMA                  ','
126465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_MINUS                  '-'
126565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DOT                    '.'
126665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SLASH                  '/'
126765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_0                      '0'
126865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_1                      '1'
126965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_2                      '2'
127065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_3                      '3'
127165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_4                      '4'
127265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_5                      '5'
127365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_6                      '6'
127465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_7                      '7'
127565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_8                      '8'
127665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_9                      '9'
127765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COLON                  ':'
127865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SEMICOLON              ';'
127965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LESS_THAN_SIGN         '<'
128065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_EQUALS_SIGN            '='
128165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_GREATER_THAN_SIGN      '>'
128265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_QUESTION_MARK          '?'
128365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COMMERCIAL_AT          '@'
128465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_A                      'A'
128565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_B                      'B'
128665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_C                      'C'
128765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_D                      'D'
128865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_E                      'E'
128965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_F                      'F'
129065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_G                      'G'
129165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_H                      'H'
129265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_I                      'I'
129365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_J                      'J'
129465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_K                      'K'
129565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_L                      'L'
129665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_M                      'M'
129765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_N                      'N'
129865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_O                      'O'
129965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_P                      'P'
130065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Q                      'Q'
130165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_R                      'R'
130265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_S                      'S'
130365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_T                      'T'
130465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_U                      'U'
130565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_V                      'V'
130665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_W                      'W'
130765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_X                      'X'
130865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Y                      'Y'
130965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Z                      'Z'
131065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_SQUARE_BRACKET    '['
131165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BACKSLASH              '\\'
131265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_SQUARE_BRACKET   ']'
131365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_CIRCUMFLEX_ACCENT      '^'
131465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_UNDERSCORE             '_'
131565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_GRAVE_ACCENT           '`'
131665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_a                      'a'
131765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_b                      'b'
131865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_c                      'c'
131965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_d                      'd'
132065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_e                      'e'
132165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_f                      'f'
132265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_g                      'g'
132365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_h                      'h'
132465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_i                      'i'
132565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_j                      'j'
132665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_k                      'k'
132765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_l                      'l'
132865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_m                      'm'
132965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_n                      'n'
133065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_o                      'o'
133165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_p                      'p'
133265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_q                      'q'
133365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_r                      'r'
133465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_s                      's'
133565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_t                      't'
133665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_u                      'u'
133765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_v                      'v'
133865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_w                      'w'
133965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_x                      'x'
134065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_y                      'y'
134165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_z                      'z'
134265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_CURLY_BRACKET     '{'
134365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_VERTICAL_LINE          '|'
134465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_CURLY_BRACKET    '}'
134565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_TILDE                  '~'
134665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
134765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_HT                      "\t"
134865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_VT                      "\v"
134965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_FF                      "\f"
135065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_CR                      "\r"
135165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BS                      "\b"
135265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BEL                     "\a"
135365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
135465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SPACE                   " "
135565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_EXCLAMATION_MARK        "!"
135665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_QUOTATION_MARK          "\""
135765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NUMBER_SIGN             "#"
135865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DOLLAR_SIGN             "$"
135965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_PERCENT_SIGN            "%"
136065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_AMPERSAND               "&"
136165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_APOSTROPHE              "'"
136265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_PARENTHESIS        "("
136365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_PARENTHESIS       ")"
136465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_ASTERISK                "*"
136565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_PLUS                    "+"
136665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COMMA                   ","
136765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_MINUS                   "-"
136865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DOT                     "."
136965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SLASH                   "/"
137065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_0                       "0"
137165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_1                       "1"
137265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_2                       "2"
137365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_3                       "3"
137465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_4                       "4"
137565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_5                       "5"
137665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_6                       "6"
137765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_7                       "7"
137865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_8                       "8"
137965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_9                       "9"
138065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COLON                   ":"
138165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SEMICOLON               ";"
138265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LESS_THAN_SIGN          "<"
138365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_EQUALS_SIGN             "="
138465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_GREATER_THAN_SIGN       ">"
138565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_QUESTION_MARK           "?"
138665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COMMERCIAL_AT           "@"
138765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_A                       "A"
138865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_B                       "B"
138965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_C                       "C"
139065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_D                       "D"
139165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_E                       "E"
139265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_F                       "F"
139365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_G                       "G"
139465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_H                       "H"
139565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_I                       "I"
139665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_J                       "J"
139765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_K                       "K"
139865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_L                       "L"
139965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_M                       "M"
140065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_N                       "N"
140165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_O                       "O"
140265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_P                       "P"
140365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Q                       "Q"
140465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_R                       "R"
140565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_S                       "S"
140665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_T                       "T"
140765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_U                       "U"
140865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_V                       "V"
140965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_W                       "W"
141065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_X                       "X"
141165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Y                       "Y"
141265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Z                       "Z"
141365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_SQUARE_BRACKET     "["
141465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BACKSLASH               "\\"
141565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_SQUARE_BRACKET    "]"
141665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_CIRCUMFLEX_ACCENT       "^"
141765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_UNDERSCORE              "_"
141865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_GRAVE_ACCENT            "`"
141965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_a                       "a"
142065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_b                       "b"
142165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_c                       "c"
142265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_d                       "d"
142365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_e                       "e"
142465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_f                       "f"
142565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_g                       "g"
142665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_h                       "h"
142765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_i                       "i"
142865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_j                       "j"
142965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_k                       "k"
143065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_l                       "l"
143165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_m                       "m"
143265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_n                       "n"
143365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_o                       "o"
143465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_p                       "p"
143565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_q                       "q"
143665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_r                       "r"
143765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_s                       "s"
143865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_t                       "t"
143965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_u                       "u"
144065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_v                       "v"
144165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_w                       "w"
144265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_x                       "x"
144365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_y                       "y"
144465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_z                       "z"
144565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_CURLY_BRACKET      "{"
144665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_VERTICAL_LINE           "|"
144765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_CURLY_BRACKET     "}"
144865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_TILDE                   "~"
144965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
145065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ACCEPT0              "ACCEPT\0"
145165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_COMMIT0              "COMMIT\0"
145265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_F0                   "F\0"
145365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_FAIL0                "FAIL\0"
145465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_MARK0                "MARK\0"
145565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_PRUNE0               "PRUNE\0"
145665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_SKIP0                "SKIP\0"
145765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_THEN                 "THEN"
145865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
145965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_alpha0               "alpha\0"
146065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_lower0               "lower\0"
146165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_upper0               "upper\0"
146265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_alnum0               "alnum\0"
146365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ascii0               "ascii\0"
146465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_blank0               "blank\0"
146565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_cntrl0               "cntrl\0"
146665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_digit0               "digit\0"
146765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_graph0               "graph\0"
146865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_print0               "print\0"
146965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_punct0               "punct\0"
147065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_space0               "space\0"
147165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_word0                "word\0"
147265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_xdigit               "xdigit"
147365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
147465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_DEFINE               "DEFINE"
147565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_WEIRD_STARTWORD      "[:<:]]"
147665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_WEIRD_ENDWORD        "[:>:]]"
147765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
147865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_CR_RIGHTPAR              "CR)"
147965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LF_RIGHTPAR              "LF)"
148065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_CRLF_RIGHTPAR            "CRLF)"
148165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ANY_RIGHTPAR             "ANY)"
148265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ANYCRLF_RIGHTPAR         "ANYCRLF)"
148365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_BSR_ANYCRLF_RIGHTPAR     "BSR_ANYCRLF)"
148465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_BSR_UNICODE_RIGHTPAR     "BSR_UNICODE)"
148565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF8_RIGHTPAR            "UTF8)"
148665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF16_RIGHTPAR           "UTF16)"
148765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF32_RIGHTPAR           "UTF32)"
148865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF_RIGHTPAR             "UTF)"
148965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UCP_RIGHTPAR             "UCP)"
149065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_NO_AUTO_POSSESS_RIGHTPAR "NO_AUTO_POSSESS)"
149165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_NO_START_OPT_RIGHTPAR    "NO_START_OPT)"
149265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LIMIT_MATCH_EQ           "LIMIT_MATCH="
149365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LIMIT_RECURSION_EQ       "LIMIT_RECURSION="
149465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
149565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else  /* SUPPORT_UTF */
149665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
149765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This
149865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichworks in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode
149965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichonly. */
150065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
150165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_HT                     '\011'
150265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_VT                     '\013'
150365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_FF                     '\014'
150465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_CR                     '\015'
150565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LF                     '\012'
150665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NL                     CHAR_LF
150765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NEL                    ((unsigned char)'\x85')
150865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BS                     '\010'
150965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BEL                    '\007'
151065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_ESC                    '\033'
151165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DEL                    '\177'
151265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
151365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NULL                   '\0'
151465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SPACE                  '\040'
151565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_EXCLAMATION_MARK       '\041'
151665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_QUOTATION_MARK         '\042'
151765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_NUMBER_SIGN            '\043'
151865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DOLLAR_SIGN            '\044'
151965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_PERCENT_SIGN           '\045'
152065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_AMPERSAND              '\046'
152165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_APOSTROPHE             '\047'
152265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_PARENTHESIS       '\050'
152365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_PARENTHESIS      '\051'
152465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_ASTERISK               '\052'
152565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_PLUS                   '\053'
152665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COMMA                  '\054'
152765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_MINUS                  '\055'
152865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_DOT                    '\056'
152965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SLASH                  '\057'
153065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_0                      '\060'
153165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_1                      '\061'
153265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_2                      '\062'
153365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_3                      '\063'
153465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_4                      '\064'
153565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_5                      '\065'
153665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_6                      '\066'
153765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_7                      '\067'
153865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_8                      '\070'
153965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_9                      '\071'
154065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COLON                  '\072'
154165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_SEMICOLON              '\073'
154265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LESS_THAN_SIGN         '\074'
154365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_EQUALS_SIGN            '\075'
154465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_GREATER_THAN_SIGN      '\076'
154565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_QUESTION_MARK          '\077'
154665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_COMMERCIAL_AT          '\100'
154765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_A                      '\101'
154865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_B                      '\102'
154965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_C                      '\103'
155065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_D                      '\104'
155165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_E                      '\105'
155265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_F                      '\106'
155365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_G                      '\107'
155465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_H                      '\110'
155565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_I                      '\111'
155665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_J                      '\112'
155765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_K                      '\113'
155865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_L                      '\114'
155965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_M                      '\115'
156065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_N                      '\116'
156165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_O                      '\117'
156265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_P                      '\120'
156365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Q                      '\121'
156465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_R                      '\122'
156565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_S                      '\123'
156665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_T                      '\124'
156765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_U                      '\125'
156865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_V                      '\126'
156965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_W                      '\127'
157065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_X                      '\130'
157165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Y                      '\131'
157265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_Z                      '\132'
157365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_SQUARE_BRACKET    '\133'
157465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_BACKSLASH              '\134'
157565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_SQUARE_BRACKET   '\135'
157665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_CIRCUMFLEX_ACCENT      '\136'
157765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_UNDERSCORE             '\137'
157865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_GRAVE_ACCENT           '\140'
157965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_a                      '\141'
158065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_b                      '\142'
158165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_c                      '\143'
158265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_d                      '\144'
158365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_e                      '\145'
158465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_f                      '\146'
158565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_g                      '\147'
158665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_h                      '\150'
158765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_i                      '\151'
158865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_j                      '\152'
158965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_k                      '\153'
159065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_l                      '\154'
159165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_m                      '\155'
159265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_n                      '\156'
159365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_o                      '\157'
159465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_p                      '\160'
159565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_q                      '\161'
159665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_r                      '\162'
159765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_s                      '\163'
159865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_t                      '\164'
159965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_u                      '\165'
160065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_v                      '\166'
160165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_w                      '\167'
160265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_x                      '\170'
160365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_y                      '\171'
160465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_z                      '\172'
160565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_LEFT_CURLY_BRACKET     '\173'
160665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_VERTICAL_LINE          '\174'
160765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_RIGHT_CURLY_BRACKET    '\175'
160865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define CHAR_TILDE                  '\176'
160965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
161065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_HT                      "\011"
161165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_VT                      "\013"
161265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_FF                      "\014"
161365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_CR                      "\015"
161465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NL                      "\012"
161565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BS                      "\010"
161665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BEL                     "\007"
161765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_ESC                     "\033"
161865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DEL                     "\177"
161965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
162065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SPACE                   "\040"
162165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_EXCLAMATION_MARK        "\041"
162265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_QUOTATION_MARK          "\042"
162365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_NUMBER_SIGN             "\043"
162465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DOLLAR_SIGN             "\044"
162565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_PERCENT_SIGN            "\045"
162665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_AMPERSAND               "\046"
162765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_APOSTROPHE              "\047"
162865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_PARENTHESIS        "\050"
162965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_PARENTHESIS       "\051"
163065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_ASTERISK                "\052"
163165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_PLUS                    "\053"
163265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COMMA                   "\054"
163365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_MINUS                   "\055"
163465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_DOT                     "\056"
163565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SLASH                   "\057"
163665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_0                       "\060"
163765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_1                       "\061"
163865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_2                       "\062"
163965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_3                       "\063"
164065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_4                       "\064"
164165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_5                       "\065"
164265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_6                       "\066"
164365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_7                       "\067"
164465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_8                       "\070"
164565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_9                       "\071"
164665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COLON                   "\072"
164765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_SEMICOLON               "\073"
164865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LESS_THAN_SIGN          "\074"
164965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_EQUALS_SIGN             "\075"
165065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_GREATER_THAN_SIGN       "\076"
165165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_QUESTION_MARK           "\077"
165265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_COMMERCIAL_AT           "\100"
165365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_A                       "\101"
165465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_B                       "\102"
165565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_C                       "\103"
165665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_D                       "\104"
165765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_E                       "\105"
165865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_F                       "\106"
165965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_G                       "\107"
166065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_H                       "\110"
166165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_I                       "\111"
166265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_J                       "\112"
166365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_K                       "\113"
166465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_L                       "\114"
166565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_M                       "\115"
166665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_N                       "\116"
166765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_O                       "\117"
166865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_P                       "\120"
166965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Q                       "\121"
167065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_R                       "\122"
167165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_S                       "\123"
167265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_T                       "\124"
167365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_U                       "\125"
167465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_V                       "\126"
167565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_W                       "\127"
167665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_X                       "\130"
167765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Y                       "\131"
167865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_Z                       "\132"
167965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_SQUARE_BRACKET     "\133"
168065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_BACKSLASH               "\134"
168165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_SQUARE_BRACKET    "\135"
168265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_CIRCUMFLEX_ACCENT       "\136"
168365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_UNDERSCORE              "\137"
168465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_GRAVE_ACCENT            "\140"
168565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_a                       "\141"
168665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_b                       "\142"
168765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_c                       "\143"
168865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_d                       "\144"
168965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_e                       "\145"
169065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_f                       "\146"
169165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_g                       "\147"
169265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_h                       "\150"
169365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_i                       "\151"
169465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_j                       "\152"
169565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_k                       "\153"
169665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_l                       "\154"
169765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_m                       "\155"
169865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_n                       "\156"
169965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_o                       "\157"
170065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_p                       "\160"
170165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_q                       "\161"
170265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_r                       "\162"
170365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_s                       "\163"
170465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_t                       "\164"
170565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_u                       "\165"
170665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_v                       "\166"
170765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_w                       "\167"
170865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_x                       "\170"
170965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_y                       "\171"
171065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_z                       "\172"
171165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_LEFT_CURLY_BRACKET      "\173"
171265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_VERTICAL_LINE           "\174"
171365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_RIGHT_CURLY_BRACKET     "\175"
171465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STR_TILDE                   "\176"
171565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
171665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ACCEPT0              STR_A STR_C STR_C STR_E STR_P STR_T "\0"
171765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_COMMIT0              STR_C STR_O STR_M STR_M STR_I STR_T "\0"
171865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_F0                   STR_F "\0"
171965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_FAIL0                STR_F STR_A STR_I STR_L "\0"
172065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_MARK0                STR_M STR_A STR_R STR_K "\0"
172165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_PRUNE0               STR_P STR_R STR_U STR_N STR_E "\0"
172265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_SKIP0                STR_S STR_K STR_I STR_P "\0"
172365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_THEN                 STR_T STR_H STR_E STR_N
172465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
172565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_alpha0               STR_a STR_l STR_p STR_h STR_a "\0"
172665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_lower0               STR_l STR_o STR_w STR_e STR_r "\0"
172765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_upper0               STR_u STR_p STR_p STR_e STR_r "\0"
172865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_alnum0               STR_a STR_l STR_n STR_u STR_m "\0"
172965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ascii0               STR_a STR_s STR_c STR_i STR_i "\0"
173065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_blank0               STR_b STR_l STR_a STR_n STR_k "\0"
173165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_cntrl0               STR_c STR_n STR_t STR_r STR_l "\0"
173265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_digit0               STR_d STR_i STR_g STR_i STR_t "\0"
173365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_graph0               STR_g STR_r STR_a STR_p STR_h "\0"
173465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_print0               STR_p STR_r STR_i STR_n STR_t "\0"
173565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_punct0               STR_p STR_u STR_n STR_c STR_t "\0"
173665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_space0               STR_s STR_p STR_a STR_c STR_e "\0"
173765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_word0                STR_w STR_o STR_r STR_d       "\0"
173865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_xdigit               STR_x STR_d STR_i STR_g STR_i STR_t
173965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
174065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_DEFINE               STR_D STR_E STR_F STR_I STR_N STR_E
174165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_WEIRD_STARTWORD      STR_LEFT_SQUARE_BRACKET STR_COLON STR_LESS_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
174265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_WEIRD_ENDWORD        STR_LEFT_SQUARE_BRACKET STR_COLON STR_GREATER_THAN_SIGN STR_COLON STR_RIGHT_SQUARE_BRACKET STR_RIGHT_SQUARE_BRACKET
174365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
174465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_CR_RIGHTPAR              STR_C STR_R STR_RIGHT_PARENTHESIS
174565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LF_RIGHTPAR              STR_L STR_F STR_RIGHT_PARENTHESIS
174665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_CRLF_RIGHTPAR            STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
174765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ANY_RIGHTPAR             STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS
174865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_ANYCRLF_RIGHTPAR         STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
174965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_BSR_ANYCRLF_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS
175065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_BSR_UNICODE_RIGHTPAR     STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS
175165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF8_RIGHTPAR            STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS
175265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF16_RIGHTPAR           STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS
175365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF32_RIGHTPAR           STR_U STR_T STR_F STR_3 STR_2 STR_RIGHT_PARENTHESIS
175465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UTF_RIGHTPAR             STR_U STR_T STR_F STR_RIGHT_PARENTHESIS
175565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_UCP_RIGHTPAR             STR_U STR_C STR_P STR_RIGHT_PARENTHESIS
175665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_NO_AUTO_POSSESS_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_A STR_U STR_T STR_O STR_UNDERSCORE STR_P STR_O STR_S STR_S STR_E STR_S STR_S STR_RIGHT_PARENTHESIS
175765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_NO_START_OPT_RIGHTPAR    STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS
175865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LIMIT_MATCH_EQ           STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_M STR_A STR_T STR_C STR_H STR_EQUALS_SIGN
175965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRING_LIMIT_RECURSION_EQ       STR_L STR_I STR_M STR_I STR_T STR_UNDERSCORE STR_R STR_E STR_C STR_U STR_R STR_S STR_I STR_O STR_N STR_EQUALS_SIGN
176065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
176165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif  /* SUPPORT_UTF */
176265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
176365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Escape items that are just an encoding of a particular data value. */
176465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
176565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef ESC_e
176665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ESC_e CHAR_ESC
176765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
176865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
176965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef ESC_f
177065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ESC_f CHAR_FF
177165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
177265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
177365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef ESC_n
177465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ESC_n CHAR_LF
177565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
177665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
177765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef ESC_r
177865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ESC_r CHAR_CR
177965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
178065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
178165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* We can't officially use ESC_t because it is a POSIX reserved identifier
178265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich(presumably because of all the others like size_t). */
178365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
178465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef ESC_tee
178565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ESC_tee CHAR_HT
178665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
178765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
178865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Codes for different types of Unicode property */
178965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
179065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_ANY        0    /* Any property - matches all chars */
179165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_LAMP       1    /* L& - the union of Lu, Ll, Lt */
179265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_GC         2    /* Specified general characteristic (e.g. L) */
179365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_PC         3    /* Specified particular characteristic (e.g. Lu) */
179465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_SC         4    /* Script (e.g. Han) */
179565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_ALNUM      5    /* Alphanumeric - the union of L and N */
179665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_SPACE      6    /* Perl space - Z plus 9,10,12,13 */
179765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_PXSPACE    7    /* POSIX space - Z plus 9,10,11,12,13 */
179865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_WORD       8    /* Word - L plus N plus underscore */
179965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_CLIST      9    /* Pseudo-property: match character list */
180065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_UCNC      10    /* Universal Character nameable character */
180165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_TABSIZE   11    /* Size of square table for autopossessify tests */
180265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
180365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The following special properties are used only in XCLASS items, when POSIX
180465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichclasses are specified and PCRE_UCP is set - in other words, for Unicode
180565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhandling of these classes. They are not available via the \p or \P escapes like
180665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthose in the above list, and so they do not take part in the autopossessifying
180765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtable. */
180865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
180965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_PXGRAPH   11    /* [:graph:] - characters that mark the paper */
181065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_PXPRINT   12    /* [:print:] - [:graph:] plus non-control spaces */
181165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PT_PXPUNCT   13    /* [:punct:] - punctuation characters */
181265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
181365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
181465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcontain characters with values greater than 255. */
181565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
181665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_NOT       0x01    /* Flag: this is a negative class */
181765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_MAP       0x02    /* Flag: a 32-byte map is present */
181865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_HASPROP   0x04    /* Flag: property checks are present. */
181965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
182065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_END       0    /* Marks end of individual items */
182165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_SINGLE    1    /* Single item (one multibyte char) follows */
182265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_RANGE     2    /* A range (two multibyte chars) follows */
182365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_PROP      3    /* Unicode property (2-byte property code follows) */
182465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define XCL_NOTPROP   4    /* Unicode inverted property (ditto) */
182565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
182665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* These are escaped items that aren't just an encoding of a particular data
182765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvalue such as \n. They must have non-zero values, as check_escape() returns 0
182865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor a data character.  Also, they must appear in the same order as in the
182965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichopcode definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it
183065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcorresponds to "." in DOTALL mode rather than an escape sequence. It is also
183165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichused for [^] in JavaScript compatibility mode, and for \C in non-utf mode. In
183265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichnon-DOTALL mode, "." behaves like \N.
183365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
183465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc.
183565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhen PCRE_UCP is set and replacement of \d etc by \p sequences is required.
183665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThey must be contiguous, and remain in order so that the replacements can be
183765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichlooked up from a table.
183865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
183965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichNegative numbers are used to encode a backreference (\1, \2, \3, etc.) in
184065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcheck_escape(). There are two tests in the code for an escape
184165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichgreater than ESC_b and less than ESC_Z to detect the types that may be
184265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrepeated. These are the types that consume characters. If any new escapes are
184365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichput in between that don't consume a character, that code will have to change.
184465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
184565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
184665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichenum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
184765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
184865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,
184965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ESC_E, ESC_Q, ESC_g, ESC_k,
185065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu };
185165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
185265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
185365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/********************** Opcode definitions ******************/
185465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
185565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/****** NOTE NOTE NOTE ******
185665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
185765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichStarting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in
185865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichorder to the list of escapes immediately above. Furthermore, values up to
185965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichOP_DOLLM must not be changed without adjusting the table called autoposstab in
186065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_compile.c
186165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
186265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichWhenever this list is updated, the two macro definitions that follow must be
186365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichupdated to match. The possessification table called "opcode_possessify" in
186465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_compile.c must also be updated, and also the tables called "coptable"
186565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand "poptable" in pcre_dfa_exec.c.
186665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
186765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich****** NOTE NOTE NOTE ******/
186865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
186965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
187065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The values between FIRST_AUTOTAB_OP and LAST_AUTOTAB_RIGHT_OP, inclusive,
187165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichare used in a table for deciding whether a repeated character type can be
187265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichauto-possessified. */
187365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
187465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define FIRST_AUTOTAB_OP       OP_NOT_DIGIT
187565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define LAST_AUTOTAB_LEFT_OP   OP_EXTUNI
187665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define LAST_AUTOTAB_RIGHT_OP  OP_DOLLM
187765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
187865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichenum {
187965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_END,            /* 0 End of pattern */
188065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
188165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Values corresponding to backslashed metacharacters */
188265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
188365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SOD,            /* 1 Start of data: \A */
188465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SOM,            /* 2 Start of match (subject + offset): \G */
188565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SET_SOM,        /* 3 Set start of match (\K) */
188665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_WORD_BOUNDARY,  /*  4 \B */
188765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_WORD_BOUNDARY,      /*  5 \b */
188865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_DIGIT,          /*  6 \D */
188965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DIGIT,              /*  7 \d */
189065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_WHITESPACE,     /*  8 \S */
189165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_WHITESPACE,         /*  9 \s */
189265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_WORDCHAR,       /* 10 \W */
189365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_WORDCHAR,           /* 11 \w */
189465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
189565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ANY,            /* 12 Match any character except newline (\N) */
189665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ALLANY,         /* 13 Match any character */
189765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ANYBYTE,        /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */
189865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPROP,        /* 15 \P (not Unicode property) */
189965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_PROP,           /* 16 \p (Unicode property) */
190065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ANYNL,          /* 17 \R (any newline sequence) */
190165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_HSPACE,     /* 18 \H (not horizontal whitespace) */
190265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_HSPACE,         /* 19 \h (horizontal whitespace) */
190365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT_VSPACE,     /* 20 \V (not vertical whitespace) */
190465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_VSPACE,         /* 21 \v (vertical whitespace) */
190565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_EXTUNI,         /* 22 \X (extended Unicode sequence */
190665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_EODN,           /* 23 End of data or \n at end of data (\Z) */
190765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_EOD,            /* 24 End of data (\z) */
190865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
190965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Line end assertions */
191065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
191165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DOLL,           /* 25 End of line - not multiline */
191265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DOLLM,          /* 26 End of line - multiline */
191365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CIRC,           /* 27 Start of line - not multiline */
191465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CIRCM,          /* 28 Start of line - multiline */
191565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
191665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Single characters; caseful must precede the caseless ones */
191765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
191865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CHAR,           /* 29 Match one character, casefully */
191965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CHARI,          /* 30 Match one character, caselessly */
192065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOT,            /* 31 Match one character, not the given one, casefully */
192165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTI,           /* 32 Match one character, not the given one, caselessly */
192265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
192365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* The following sets of 13 opcodes must always be kept in step because
192465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  the offset from the first one is used to generate the others. */
192565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
192665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Repeated characters; caseful must precede the caseless ones */
192765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
192865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_STAR,           /* 33 The maximizing and minimizing versions of */
192965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINSTAR,        /* 34 these six opcodes must come in pairs, with */
193065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_PLUS,           /* 35 the minimizing one second. */
193165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINPLUS,        /* 36 */
193265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_QUERY,          /* 37 */
193365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINQUERY,       /* 38 */
193465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
193565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_UPTO,           /* 39 From 0 to n matches of one character, caseful*/
193665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINUPTO,        /* 40 */
193765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_EXACT,          /* 41 Exactly n matches */
193865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
193965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSSTAR,        /* 42 Possessified star, caseful */
194065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSPLUS,        /* 43 Possessified plus, caseful */
194165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSQUERY,       /* 44 Posesssified query, caseful */
194265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSUPTO,        /* 45 Possessified upto, caseful */
194365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
194465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Repeated characters; caseless must follow the caseful ones */
194565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
194665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_STARI,          /* 46 */
194765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINSTARI,       /* 47 */
194865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_PLUSI,          /* 48 */
194965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINPLUSI,       /* 49 */
195065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_QUERYI,         /* 50 */
195165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINQUERYI,      /* 51 */
195265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
195365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_UPTOI,          /* 52 From 0 to n matches of one character, caseless */
195465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MINUPTOI,       /* 53 */
195565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_EXACTI,         /* 54 */
195665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
195765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSSTARI,       /* 55 Possessified star, caseless */
195865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSPLUSI,       /* 56 Possessified plus, caseless */
195965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSQUERYI,      /* 57 Posesssified query, caseless */
196065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_POSUPTOI,       /* 58 Possessified upto, caseless */
196165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
196265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* The negated ones must follow the non-negated ones, and match them */
196365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Negated repeated character, caseful; must precede the caseless ones */
196465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
196565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTSTAR,        /* 59 The maximizing and minimizing versions of */
196665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINSTAR,     /* 60 these six opcodes must come in pairs, with */
196765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPLUS,        /* 61 the minimizing one second. They must be in */
196865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINPLUS,     /* 62 exactly the same order as those above. */
196965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTQUERY,       /* 63 */
197065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINQUERY,    /* 64 */
197165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
197265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTUPTO,        /* 65 From 0 to n matches, caseful */
197365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINUPTO,     /* 66 */
197465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTEXACT,       /* 67 Exactly n matches */
197565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
197665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSSTAR,     /* 68 Possessified versions, caseful */
197765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSPLUS,     /* 69 */
197865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSQUERY,    /* 70 */
197965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSUPTO,     /* 71 */
198065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
198165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Negated repeated character, caseless; must follow the caseful ones */
198265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
198365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTSTARI,       /* 72 */
198465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINSTARI,    /* 73 */
198565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPLUSI,       /* 74 */
198665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINPLUSI,    /* 75 */
198765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTQUERYI,      /* 76 */
198865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINQUERYI,   /* 77 */
198965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
199065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTUPTOI,       /* 78 From 0 to n matches, caseless */
199165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTMINUPTOI,    /* 79 */
199265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTEXACTI,      /* 80 Exactly n matches */
199365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
199465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSSTARI,    /* 81 Possessified versions, caseless */
199565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSPLUSI,    /* 82 */
199665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSQUERYI,   /* 83 */
199765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NOTPOSUPTOI,    /* 84 */
199865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
199965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Character types */
200065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
200165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPESTAR,       /* 85 The maximizing and minimizing versions of */
200265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEMINSTAR,    /* 86 these six opcodes must come in pairs, with */
200365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEPLUS,       /* 87 the minimizing one second. These codes must */
200465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEMINPLUS,    /* 88 be in exactly the same order as those above. */
200565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEQUERY,      /* 89 */
200665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEMINQUERY,   /* 90 */
200765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
200865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEUPTO,       /* 91 From 0 to n matches */
200965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEMINUPTO,    /* 92 */
201065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEEXACT,      /* 93 Exactly n matches */
201165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
201265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEPOSSTAR,    /* 94 Possessified versions */
201365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEPOSPLUS,    /* 95 */
201465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEPOSQUERY,   /* 96 */
201565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TYPEPOSUPTO,    /* 97 */
201665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
201765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* These are used for character classes and back references; only the
201865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  first six are the same as the sets above. */
201965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
202065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRSTAR,         /* 98 The maximizing and minimizing versions of */
202165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRMINSTAR,      /* 99 all these opcodes must come in pairs, with */
202265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRPLUS,         /* 100 the minimizing one second. These codes must */
202365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRMINPLUS,      /* 101 be in exactly the same order as those above. */
202465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRQUERY,        /* 102 */
202565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRMINQUERY,     /* 103 */
202665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
202765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRRANGE,        /* 104 These are different to the three sets above. */
202865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRMINRANGE,     /* 105 */
202965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
203065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRPOSSTAR,      /* 106 Possessified versions */
203165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRPOSPLUS,      /* 107 */
203265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRPOSQUERY,     /* 108 */
203365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CRPOSRANGE,     /* 109 */
203465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
203565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* End of quantifier opcodes */
203665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
203765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CLASS,          /* 110 Match a character class, chars < 256 only */
203865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_NCLASS,         /* 111 Same, but the bitmap was created from a negative
203965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                              class - the difference is relevant only when a
204065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                              character > 255 is encountered. */
204165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_XCLASS,         /* 112 Extended class for handling > 255 chars within the
204265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                              class. This does both positive and negative. */
204365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_REF,            /* 113 Match a back reference, casefully */
204465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_REFI,           /* 114 Match a back reference, caselessly */
204565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DNREF,          /* 115 Match a duplicate name backref, casefully */
204665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DNREFI,         /* 116 Match a duplicate name backref, caselessly */
204765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_RECURSE,        /* 117 Match a numbered subpattern (possibly recursive) */
204865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CALLOUT,        /* 118 Call out to external function if provided */
204965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
205065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ALT,            /* 119 Start of alternation */
205165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_KET,            /* 120 End of group that doesn't have an unbounded repeat */
205265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_KETRMAX,        /* 121 These two must remain together and in this */
205365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_KETRMIN,        /* 122 order. They are for groups the repeat for ever. */
205465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_KETRPOS,        /* 123 Possessive unlimited repeat. */
205565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
205665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four
205765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  asserts must remain in order. */
205865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
205965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_REVERSE,        /* 124 Move pointer back - used in lookbehind assertions */
206065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ASSERT,         /* 125 Positive lookahead */
206165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ASSERT_NOT,     /* 126 Negative lookahead */
206265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ASSERTBACK,     /* 127 Positive lookbehind */
206365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ASSERTBACK_NOT, /* 128 Negative lookbehind */
206465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
206565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately
206665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  after the assertions, with ONCE first, as there's a test for >= ONCE for a
206765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  subpattern that isn't an assertion. The POS versions must immediately follow
206865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  the non-POS versions in each case. */
206965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
207065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ONCE,           /* 129 Atomic group, contains captures */
207165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ONCE_NC,        /* 130 Atomic group containing no captures */
207265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_BRA,            /* 131 Start of non-capturing bracket */
207365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_BRAPOS,         /* 132 Ditto, with unlimited, possessive repeat */
207465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CBRA,           /* 133 Start of capturing bracket */
207565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CBRAPOS,        /* 134 Ditto, with unlimited, possessive repeat */
207665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_COND,           /* 135 Conditional group */
207765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
207865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* These five must follow the previous five, in the same order. There's a
207965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  check for >= SBRA to distinguish the two sets. */
208065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
208165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SBRA,           /* 136 Start of non-capturing bracket, check empty  */
208265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SBRAPOS,        /* 137 Ditto, with unlimited, possessive repeat */
208365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SCBRA,          /* 138 Start of capturing bracket, check empty */
208465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SCBRAPOS,       /* 139 Ditto, with unlimited, possessive repeat */
208565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SCOND,          /* 140 Conditional group, check empty */
208665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
208765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* The next two pairs must (respectively) be kept together. */
208865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
208965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CREF,           /* 141 Used to hold a capture number as condition */
209065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DNCREF,         /* 142 Used to point to duplicate names as a condition */
209165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_RREF,           /* 143 Used to hold a recursion number as condition */
209265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DNRREF,         /* 144 Used to point to duplicate names as a condition */
209365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_DEF,            /* 145 The DEFINE condition */
209465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
209565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_BRAZERO,        /* 146 These two must remain together and in this */
209665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_BRAMINZERO,     /* 147 order. */
209765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_BRAPOSZERO,     /* 148 */
209865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
209965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* These are backtracking control verbs */
210065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
210165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_MARK,           /* 149 always has an argument */
210265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_PRUNE,          /* 150 */
210365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_PRUNE_ARG,      /* 151 same, but with argument */
210465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SKIP,           /* 152 */
210565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SKIP_ARG,       /* 153 same, but with argument */
210665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_THEN,           /* 154 */
210765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_THEN_ARG,       /* 155 same, but with argument */
210865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_COMMIT,         /* 156 */
210965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
211065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* These are forced failure and success verbs */
211165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
211265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_FAIL,           /* 157 */
211365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ACCEPT,         /* 158 */
211465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_ASSERT_ACCEPT,  /* 159 Used inside assertions */
211565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_CLOSE,          /* 160 Used before OP_ACCEPT to close open captures */
211665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
211765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* This is used to skip a subpattern with a {0} quantifier */
211865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
211965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_SKIPZERO,       /* 161 */
212065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
212165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* This is not an opcode, but is used to check that tables indexed by opcode
212265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  are the correct length, in order to catch updating errors - there have been
212365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  some in the past. */
212465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
212565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  OP_TABLE_LENGTH
212665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich};
212765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
212865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro
212965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdefinitions that follow must also be updated to match. There are also tables
213065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcalled "opcode_possessify" in pcre_compile.c and "coptable" and "poptable" in
213165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_dfa_exec.c that must be updated. */
213265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
213365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
213465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This macro defines textual names for all the opcodes. These are used only
213565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfor debugging, and some of them are only partial names. The macro is referenced
213665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichonly in pcre_printint.c, which fills out the full names in many cases (and in
213765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsome cases doesn't actually use these names at all). */
213865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
213965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define OP_NAME_LIST \
214065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d",         \
214165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "\\S", "\\s", "\\W", "\\w", "Any", "AllAny", "Anybyte",         \
214265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v",           \
214365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "extuni",  "\\Z", "\\z",                                        \
214465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "$", "$", "^", "^", "char", "chari", "not", "noti",             \
214565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??",                                \
214665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "{", "{", "{",                                                  \
214765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
214865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??",                                \
214965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "{", "{", "{",                                                  \
215065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
215165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??",                                \
215265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "{", "{", "{",                                                  \
215365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
215465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??",                                \
215565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "{", "{", "{",                                                  \
215665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
215765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??", "{", "{", "{",                 \
215865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
215965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*", "*?", "+", "+?", "?", "??", "{", "{",                      \
216065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*+","++", "?+", "{",                                           \
216165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "class", "nclass", "xclass", "Ref", "Refi", "DnRef", "DnRefi",  \
216265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Recurse", "Callout",                                           \
216365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos",                  \
216465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Reverse", "Assert", "Assert not", "AssertB", "AssertB not",    \
216565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Once", "Once_NC",                                              \
216665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Bra", "BraPos", "CBra", "CBraPos",                             \
216765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Cond",                                                         \
216865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "SBra", "SBraPos", "SCBra", "SCBraPos",                         \
216965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "SCond",                                                        \
217065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Cond ref", "Cond dnref", "Cond rec", "Cond dnrec", "Cond def", \
217165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Brazero", "Braminzero", "Braposzero",                          \
217265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP",                  \
217365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*THEN", "*THEN", "*COMMIT", "*FAIL",                           \
217465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "*ACCEPT", "*ASSERT_ACCEPT",                                    \
217565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  "Close", "Skip zero"
217665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
217765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
217865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This macro defines the length of fixed length operations in the compiled
217965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichregex. The lengths are used when searching for specific things, and also in the
218065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdebugging printing of a compiled regex. We use a macro so that it can be
218165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdefined close to the definitions of the opcodes themselves.
218265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
218365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAs things have been extended, some of these are no longer fixed lenths, but are
218465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichminima instead. For example, the length of a single-character repeat may vary
218565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichin UTF-8 mode. The code that uses this table must know about such things. */
218665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
218765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define OP_LENGTHS \
218865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1,                             /* End                                    */ \
218965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1, 1,                 /* \A, \G, \K, \B, \b                     */ \
219065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1, 1, 1,              /* \D, \d, \S, \s, \W, \w                 */ \
219165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1,                       /* Any, AllAny, Anybyte                   */ \
219265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  3, 3,                          /* \P, \p                                 */ \
219365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1, 1,                 /* \R, \H, \h, \V, \v                     */ \
219465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1,                             /* \X                                     */ \
219565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1, 1, 1,              /* \Z, \z, $, $M ^, ^M                    */ \
219665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2,                             /* Char  - the minimum length             */ \
219765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2,                             /* Chari  - the minimum length            */ \
219865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2,                             /* not                                    */ \
219965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2,                             /* noti                                   */ \
220065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Positive single-char repeats                             ** These are */ \
220165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2, 2, 2,              /* *, *?, +, +?, ?, ??       ** minima in */ \
220265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto, minupto             ** mode      */ \
220365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE,                   /* exact                                  */ \
220465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2+IMM2_SIZE,          /* *+, ++, ?+, upto+                      */ \
220565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2, 2, 2,              /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8     */ \
220665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE, 2+IMM2_SIZE,      /* upto I, minupto I                      */ \
220765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE,                   /* exact I                                */ \
220865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2+IMM2_SIZE,          /* *+I, ++I, ?+I, upto+I                  */ \
220965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Negative single-char repeats - only for chars < 256                   */ \
221065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2, 2, 2,              /* NOT *, *?, +, +?, ?, ??                */ \
221165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto, minupto                      */ \
221265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE,                   /* NOT exact                              */ \
221365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *, +, ?, upto           */ \
221465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2, 2, 2,              /* NOT *I, *?I, +I, +?I, ?I, ??I          */ \
221565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE, 2+IMM2_SIZE,      /* NOT upto I, minupto I                  */ \
221665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE,                   /* NOT exact I                            */ \
221765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2+IMM2_SIZE,          /* Possessive NOT *I, +I, ?I, upto I      */ \
221865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Positive type repeats                                                 */ \
221965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2, 2, 2,              /* Type *, *?, +, +?, ?, ??               */ \
222065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE, 2+IMM2_SIZE,      /* Type upto, minupto                     */ \
222165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+IMM2_SIZE,                   /* Type exact                             */ \
222265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2, 2, 2, 2+IMM2_SIZE,          /* Possessive *+, ++, ?+, upto+           */ \
222365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  /* Character class & ref repeats                                         */ \
222465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1, 1, 1,              /* *, *?, +, +?, ?, ??                    */ \
222565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+2*IMM2_SIZE, 1+2*IMM2_SIZE,  /* CRRANGE, CRMINRANGE                    */ \
222665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1+2*IMM2_SIZE,        /* Possessive *+, ++, ?+, CRPOSRANGE      */ \
222765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+(32/sizeof(pcre_uchar)),     /* CLASS                                  */ \
222865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+(32/sizeof(pcre_uchar)),     /* NCLASS                                 */ \
222965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  0,                             /* XCLASS - variable length               */ \
223065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+IMM2_SIZE,                   /* REF                                    */ \
223165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+IMM2_SIZE,                   /* REFI                                   */ \
223265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+2*IMM2_SIZE,                 /* DNREF                                  */ \
223365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+2*IMM2_SIZE,                 /* DNREFI                                 */ \
223465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* RECURSE                                */ \
223565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  2+2*LINK_SIZE,                 /* CALLOUT                                */ \
223665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Alt                                    */ \
223765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Ket                                    */ \
223865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* KetRmax                                */ \
223965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* KetRmin                                */ \
224065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* KetRpos                                */ \
224165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Reverse                                */ \
224265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Assert                                 */ \
224365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Assert not                             */ \
224465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Assert behind                          */ \
224565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* Assert behind not                      */ \
224665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* ONCE                                   */ \
224765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* ONCE_NC                                */ \
224865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* BRA                                    */ \
224965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* BRAPOS                                 */ \
225065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE+IMM2_SIZE,         /* CBRA                                   */ \
225165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE+IMM2_SIZE,         /* CBRAPOS                                */ \
225265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* COND                                   */ \
225365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* SBRA                                   */ \
225465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* SBRAPOS                                */ \
225565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE+IMM2_SIZE,         /* SCBRA                                  */ \
225665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE+IMM2_SIZE,         /* SCBRAPOS                               */ \
225765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+LINK_SIZE,                   /* SCOND                                  */ \
225865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* CREF, DNCREF                           */ \
225965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+IMM2_SIZE, 1+2*IMM2_SIZE,    /* RREF, DNRREF                           */ \
226065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1,                             /* DEF                                    */ \
226165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1,                       /* BRAZERO, BRAMINZERO, BRAPOSZERO        */ \
226265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  3, 1, 3,                       /* MARK, PRUNE, PRUNE_ARG                 */ \
226365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 3,                          /* SKIP, SKIP_ARG                         */ \
226465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 3,                          /* THEN, THEN_ARG                         */ \
226565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1, 1, 1, 1,                    /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT    */ \
226665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  1+IMM2_SIZE, 1                 /* CLOSE, SKIPZERO                        */
226765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
226865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* A magic value for OP_RREF to indicate the "any recursion" condition. */
226965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
227065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define RREF_ANY  0xffff
227165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
227265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Compile time error code numbers. They are given names so that they can more
227365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevicheasily be tracked. When a new number is added, the table called eint in
227465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcreposix.c must be updated. */
227565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
227665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichenum { ERR0,  ERR1,  ERR2,  ERR3,  ERR4,  ERR5,  ERR6,  ERR7,  ERR8,  ERR9,
227765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19,
227865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29,
227965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,
228065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49,
228165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,
228265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69,
228365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79,
228465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERRCOUNT };
228565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
228665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* JIT compiling modes. The function list is indexed by them. */
228765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
228865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichenum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE,
228965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich       JIT_NUMBER_OF_COMPILE_MODES };
229065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
229165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The real format of the start of the pcre block; the index of names and the
229265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcode vector run on as long as necessary after the end. We store an explicit
229365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichoffset to the name table so that if a regex is compiled on one host, saved, and
229465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthen run on another where the size of pointers is different, all might still
229565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbe well.
229665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
229765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThe size of the structure must be a multiple of 8 bytes. For the case of
229865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompiled-on-4 and run-on-8, we include an extra pointer that is always NULL so
229965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichthat there are an even number of pointers which therefore are a multiple of 8
230065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbytes.
230165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
230265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIt is necessary to fork the struct for the 32 bit library, since it needs to
230365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichuse pcre_uint32 for first_char and req_char. We can't put an ifdef inside the
230465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef because pcretest needs access to the struct of the 8-, 16- and 32-bit
230565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichvariants.
230665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
230765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*** WARNING ***
230865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichWhen new fields are added to these structures, remember to adjust the code in
230965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_byte_order.c that is concerned with swapping the byte order of the fields
231065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwhen a compiled regex is reloaded on a host with different endianness.
231165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*** WARNING ***
231265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichThere is also similar byte-flipping code in pcretest.c, which is used for
231365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtesting the byte-flipping features. It must also be kept in step.
231465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*** WARNING ***
231565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/
231665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
231765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct real_pcre8_or_16 {
231865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 magic_number;
231965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 size;               /* Total that was malloced */
232065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 options;            /* Public options */
232165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 flags;              /* Private flags */
232265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 limit_match;        /* Limit set from regex */
232365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 limit_recursion;    /* Limit set from regex */
232465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 first_char;         /* Starting character */
232565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 req_char;           /* This character must be seen */
232665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */
232765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 top_bracket;        /* Highest numbered group */
232865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 top_backref;        /* Highest numbered back reference */
232965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_table_offset;  /* Offset to name table that follows */
233065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_entry_size;    /* Size of any name items */
233165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_count;         /* Number of name items */
233265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 ref_count;          /* Reference count */
233365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 dummy1;             /* To ensure size is a multiple of 8 */
233465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 dummy2;             /* To ensure size is a multiple of 8 */
233565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 dummy3;             /* To ensure size is a multiple of 8 */
233665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */
233765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void             *nullpad;      /* NULL padding */
233865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} real_pcre8_or_16;
233965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
234065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct real_pcre8_or_16 real_pcre;
234165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct real_pcre8_or_16 real_pcre16;
234265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
234365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct real_pcre32 {
234465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 magic_number;
234565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 size;               /* Total that was malloced */
234665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 options;            /* Public options */
234765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 flags;              /* Private flags */
234865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 limit_match;        /* Limit set from regex */
234965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 limit_recursion;    /* Limit set from regex */
235065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 first_char;         /* Starting character */
235165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 req_char;           /* This character must be seen */
235265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 max_lookbehind;     /* Longest lookbehind (characters) */
235365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 top_bracket;        /* Highest numbered group */
235465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 top_backref;        /* Highest numbered back reference */
235565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_table_offset;  /* Offset to name table that follows */
235665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_entry_size;    /* Size of any name items */
235765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_count;         /* Number of name items */
235865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 ref_count;          /* Reference count */
235965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 dummy;              /* To ensure size is a multiple of 8 */
236065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *tables;       /* Pointer to tables or NULL for std */
236165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void             *nullpad;      /* NULL padding */
236265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} real_pcre32;
236365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
236465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
236565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE real_pcre
236665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
236765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE real_pcre16
236865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
236965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE real_pcre32
237065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
237165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
237265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Assert that the size of REAL_PCRE is divisible by 8 */
237365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef int __assert_real_pcre_size_divisible_8[(sizeof(REAL_PCRE) % 8) == 0 ? 1 : -1];
237465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
237565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Needed in pcretest to access some fields in the real_pcre* structures
237665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * directly. They're unified for 8/16/32 bits since the structs only differ
237765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * after these fields; if that ever changes, need to fork those defines into
237865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * 8/16 and 32 bit versions. */
237965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE_MAGIC(re)     (((REAL_PCRE*)re)->magic_number)
238065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE_SIZE(re)      (((REAL_PCRE*)re)->size)
238165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE_OPTIONS(re)   (((REAL_PCRE*)re)->options)
238265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define REAL_PCRE_FLAGS(re)     (((REAL_PCRE*)re)->flags)
238365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
238465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The format of the block used to store data from pcre_study(). The same
238565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichremark (see NOTE above) about extending this structure applies. */
238665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
238765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct pcre_study_data {
238865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 size;               /* Total that was malloced */
238965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 flags;              /* Private flags */
239065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint8 start_bits[32];      /* Starting char bits */
239165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 minlength;          /* Minimum subject length */
239265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} pcre_study_data;
239365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
239465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for building a chain of open capturing subpatterns during
239565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompiling, so that instructions to close them can be compiled when (*ACCEPT) is
239665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichencountered. This is also used to identify subpatterns that contain recursive
239765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichback references to themselves, so that they can be made atomic. */
239865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
239965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct open_capitem {
240065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  struct open_capitem *next;    /* Chain link */
240165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 number;           /* Capture number */
240265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 flag;             /* Set TRUE if recursive back ref */
240365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} open_capitem;
240465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
240565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for building a list of named groups during the first pass of
240665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcompiling. */
240765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
240865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct named_group {
240965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar  *name;          /* Points to the name in the pattern */
241065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int                length;        /* Length of the name */
241165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32        number;        /* Group number */
241265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} named_group;
241365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
241465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for passing "static" information around between the functions
241565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdoing the compiling, so that they are thread-safe. */
241665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
241765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct compile_data {
241865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *lcc;            /* Points to lower casing table */
241965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *fcc;            /* Points to case-flipping table */
242065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *cbits;          /* Points to character type table */
242165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *ctypes;         /* Points to table of type maps */
242265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_workspace;/* The start of working space */
242365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_code;     /* The start of the compiled code */
242465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_pattern;  /* The start of the pattern */
242565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *end_pattern;    /* The end of the pattern */
242665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *hwm;                  /* High watermark of workspace */
242765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  open_capitem *open_caps;          /* Chain of open capture items */
242865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  named_group *named_groups;        /* Points to vector in pre-compile */
242965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *name_table;           /* The name/number table */
243065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  names_found;                 /* Number of entries so far */
243165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  name_entry_size;             /* Size of each entry */
243265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  named_group_list_size;       /* Number of entries in the list */
243365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  workspace_size;              /* Size of workspace */
243465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int bracount;            /* Count of capturing parens as we compile */
243565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  final_bracount;              /* Saved value after first pass */
243665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  max_lookbehind;              /* Maximum lookbehind (characters) */
243765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  top_backref;                 /* Maximum back reference */
243865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int backref_map;         /* Bitmap of low back refs */
243965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int namedrefcount;       /* Number of backreferences by name */
244065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  parens_depth;                /* Depth of nested parentheses */
244165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  assert_depth;                /* Depth of nested assertions */
244265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 external_options;     /* External (initial) options */
244365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint32 external_flags;       /* External flag bits to be set */
244465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  req_varyopt;                 /* "After variable item" flag for reqbyte */
244565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL had_accept;                  /* (*ACCEPT) encountered */
244665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL had_pruneorskip;             /* (*PRUNE) or (*SKIP) encountered */
244765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL check_lookbehind;            /* Lookbehinds need later checking */
244865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL dupnames;                    /* Duplicate names exist */
244965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  nltype;                      /* Newline type */
245065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int  nllen;                       /* Newline string length */
245165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar nl[4];                 /* Newline string when fixed length */
245265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} compile_data;
245365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
245465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for maintaining a chain of pointers to the currently incomplete
245565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbranches, for testing for left recursion while compiling. */
245665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
245765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct branch_chain {
245865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  struct branch_chain *outer;
245965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *current_branch;
246065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} branch_chain;
246165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
246265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for items in a linked list that represents an explicit recursive
246365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcall within the pattern; used by pcre_exec(). */
246465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
246565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct recursion_info {
246665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
246765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int group_num;         /* Number of group that was called */
246865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int *offset_save;               /* Pointer to start of saved offsets */
246965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int saved_max;                  /* Number of saved offsets */
247065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int saved_capture_last;         /* Last capture number */
247165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR subject_position;   /* Position at start of recursion */
247265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} recursion_info;
247365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
247465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* A similar structure for pcre_dfa_exec(). */
247565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
247665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct dfa_recursion_info {
247765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  struct dfa_recursion_info *prevrec;
247865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int group_num;
247965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR subject_position;
248065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} dfa_recursion_info;
248165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
248265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for building a chain of data for holding the values of the subject
248365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpointer at the start of each subpattern, so as to detect when an empty string
248465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhas been matched by a subpattern - to break infinite loops; used by
248565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_exec(). */
248665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
248765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct eptrblock {
248865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  struct eptrblock *epb_prev;
248965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR epb_saved_eptr;
249065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} eptrblock;
249165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
249265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
249365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Structure for passing "static" information around between the functions
249465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichdoing traditional NFA matching, so that they are thread-safe. */
249565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
249665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct match_data {
249765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned long int match_call_count;      /* As it says */
249865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned long int match_limit;           /* As it says */
249965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned long int match_limit_recursion; /* As it says */
250065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   *offset_vector;           /* Offset vector */
250165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    offset_end;              /* One past the end */
250265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    offset_max;              /* The maximum usable for return data */
250365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    nltype;                  /* Newline type */
250465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    nllen;                   /* Newline string length */
250565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    name_count;              /* Number of names in name table */
250665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    name_entry_size;         /* Size of entry in names table */
250765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int skip_arg_count;    /* For counting SKIP_ARGs */
250865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  unsigned int ignore_skip_arg;   /* For re-run when SKIP arg name not found */
250965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar *name_table;         /* Table of names */
251065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar nl[4];               /* Newline string when fixed */
251165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uint8 *lcc;         /* Points to lower casing table */
251265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uint8 *fcc;         /* Points to case-flipping table */
251365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uint8 *ctypes;      /* Points to table of type maps */
251465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   notbol;                  /* NOTBOL flag */
251565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   noteol;                  /* NOTEOL flag */
251665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   utf;                     /* UTF-8 / UTF-16 flag */
251765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   jscript_compat;          /* JAVASCRIPT_COMPAT flag */
251865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   use_ucp;                 /* PCRE_UCP flag */
251965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   endonly;                 /* Dollar not before final \n */
252065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   notempty;                /* Empty string match not wanted */
252165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   notempty_atstart;        /* Empty string match at start not wanted */
252265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   hitend;                  /* Hit the end of the subject at some point */
252365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   bsr_anycrlf;             /* \R is just any CRLF, not full Unicode */
252465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  BOOL   hasthen;                 /* Pattern contains (*THEN) */
252565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uchar *start_code;  /* For use when recursing */
252665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR start_subject;      /* Start of the subject string */
252765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR end_subject;        /* End of the subject string */
252865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR start_match_ptr;    /* Start of matched string */
252965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR end_match_ptr;      /* Subject position at end match */
253065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PCRE_PUCHAR start_used_ptr;     /* Earliest consulted character */
253165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    partial;                 /* PARTIAL options */
253265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    end_offset_top;          /* Highwater mark at end of match */
253365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_int32 capture_last;        /* Most recent capture number + overflow flag */
253465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    start_offset;            /* The start offset value */
253565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    match_function_type;     /* Set for certain special calls of MATCH() */
253665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  eptrblock *eptrchain;           /* Chain of eptrblocks for tail recursions */
253765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int    eptrn;                   /* Next free eptrblock */
253865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  recursion_info *recursive;      /* Linked list of recursion data */
253965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void  *callout_data;            /* To pass back to callouts */
254065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uchar *mark;        /* Mark pointer to pass back on success */
254165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uchar *nomatch_mark;/* Mark pointer to pass back on failure */
254265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const  pcre_uchar *once_target; /* Where to back up to for atomic groups */
254365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef NO_RECURSE
254465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void  *match_frames_base;       /* For remembering malloc'd frames */
254565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
254665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} match_data;
254765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
254865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* A similar structure is used for the same purpose by the DFA matching
254965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichfunctions. */
255065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
255165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct dfa_match_data {
255265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_code;     /* Start of the compiled pattern */
255365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_subject ; /* Start of the subject string */
255465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *end_subject;    /* End of subject string */
255565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uchar *start_used_ptr; /* Earliest consulted character */
255665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  const pcre_uint8 *tables;         /* Character tables */
255765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   start_offset;               /* The start offset value */
255865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   moptions;                   /* Match options */
255965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   poptions;                   /* Pattern options */
256065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   nltype;                     /* Newline type */
256165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  int   nllen;                      /* Newline string length */
256265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uchar nl[4];                 /* Newline string when fixed */
256365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  void *callout_data;               /* To pass back to callouts */
256465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  dfa_recursion_info *recursive;    /* Linked list of recursion data */
256565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} dfa_match_data;
256665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
256765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Bit definitions for entries in the pcre_ctypes table. */
256865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
256965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_space   0x01
257065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_letter  0x02
257165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_digit   0x04
257265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_xdigit  0x08
257365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_word    0x10   /* alphanumeric or '_' */
257465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctype_meta    0x80   /* regexp meta char or zero (end pattern) */
257565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
257665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
257765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichof bits for a class map. Some classes are built by combining these tables. */
257865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
257965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_space     0      /* [:space:] or \s */
258065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_xdigit   32      /* [:xdigit:] */
258165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_digit    64      /* [:digit:] or \d */
258265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_upper    96      /* [:upper:] */
258365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_lower   128      /* [:lower:] */
258465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_word    160      /* [:word:] or \w */
258565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_graph   192      /* [:graph:] */
258665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_print   224      /* [:print:] */
258765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_punct   256      /* [:punct:] */
258865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_cntrl   288      /* [:cntrl:] */
258965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbit_length  320      /* Length of the cbits table */
259065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
259165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Offsets of the various tables from the base tables pointer, and
259265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtotal length. */
259365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
259465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define lcc_offset      0
259565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define fcc_offset    256
259665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define cbits_offset  512
259765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define ctypes_offset (cbits_offset + cbit_length)
259865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define tables_length (ctypes_offset + 256)
259965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
260065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Internal function and data prefixes. */
260165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
260265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
260365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PUBL
260465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBL(name) pcre_##name
260565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
260665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PRIV
260765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRIV(name) _pcre_##name
260865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
260965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16
261065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PUBL
261165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBL(name) pcre16_##name
261265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
261365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PRIV
261465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRIV(name) _pcre16_##name
261565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
261665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
261765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PUBL
261865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PUBL(name) pcre32_##name
261965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
262065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifndef PRIV
262165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define PRIV(name) _pcre32_##name
262265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
262365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#else
262465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#error Unsupported compiling mode
262565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
262665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
262765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Layout of the UCP type table that translates property names into types and
262865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichcodes. Each entry used to point directly to a name, but to reduce the number of
262965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichrelocations in shared libraries, it now has an offset into a single string
263065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichinstead. */
263165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
263265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct {
263365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 name_offset;
263465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 type;
263565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint16 value;
263665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} ucp_type_table;
263765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
263865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
263965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Internal shared data tables. These are tables that are used by more than one
264065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichof the exported public functions. They have to be "external" in the C sense,
264165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichbut are not part of the PCRE public API. The data for these tables is in the
264265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_tables.c module. */
264365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
264465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef COMPILE_PCRE8
264565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int            PRIV(utf8_table1)[];
264665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int            PRIV(utf8_table1_size);
264765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int            PRIV(utf8_table2)[];
264865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int            PRIV(utf8_table3)[];
264965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint8     PRIV(utf8_table4)[];
265065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE8 */
265165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
265265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const char           PRIV(utt_names)[];
265365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const ucp_type_table PRIV(utt)[];
265465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int            PRIV(utt_size);
265565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
265665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint8     PRIV(OP_lengths)[];
265765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint8     PRIV(default_tables)[];
265865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
265965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint32    PRIV(hspace_list)[];
266065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint32    PRIV(vspace_list)[];
266165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
266265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
266365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Internal shared functions. These are functions that are used by more than
266465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichone of the exported public functions. They have to be "external" in the C
266565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichsense, but are not part of the PCRE public API. */
266665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
266765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* String comparison functions. */
266865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8
266965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
267065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_UC(str1, str2) \
267165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  strcmp((char *)(str1), (char *)(str2))
267265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_C8(str1, str2) \
267365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  strcmp((char *)(str1), (str2))
267465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRNCMP_UC_UC(str1, str2, num) \
267565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  strncmp((char *)(str1), (char *)(str2), (num))
267665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRNCMP_UC_C8(str1, str2, num) \
267765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  strncmp((char *)(str1), (str2), (num))
267865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRLEN_UC(str) strlen((const char *)str)
267965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
268065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16 || defined COMPILE_PCRE32
268165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
268265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strcmp_uc_uc)(const pcre_uchar *,
268365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const pcre_uchar *);
268465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strcmp_uc_c8)(const pcre_uchar *,
268565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const char *);
268665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strncmp_uc_uc)(const pcre_uchar *,
268765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const pcre_uchar *, unsigned int num);
268865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strncmp_uc_c8)(const pcre_uchar *,
268965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const char *, unsigned int num);
269065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern unsigned int      PRIV(strlen_uc)(const pcre_uchar *str);
269165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
269265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_UC(str1, str2) \
269365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PRIV(strcmp_uc_uc)((str1), (str2))
269465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_C8(str1, str2) \
269565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PRIV(strcmp_uc_c8)((str1), (str2))
269665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRNCMP_UC_UC(str1, str2, num) \
269765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PRIV(strncmp_uc_uc)((str1), (str2), (num))
269865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRNCMP_UC_C8(str1, str2, num) \
269965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  PRIV(strncmp_uc_c8)((str1), (str2), (num))
270065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRLEN_UC(str) PRIV(strlen_uc)(str)
270165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
270265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
270365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
270465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8 || defined COMPILE_PCRE16
270565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
270665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_UC_TEST(str1, str2) STRCMP_UC_UC(str1, str2)
270765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_C8_TEST(str1, str2) STRCMP_UC_C8(str1, str2)
270865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
270965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32
271065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
271165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strcmp_uc_uc_utf)(const pcre_uchar *,
271265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const pcre_uchar *);
271365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(strcmp_uc_c8_utf)(const pcre_uchar *,
271465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const char *);
271565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
271665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_UC_TEST(str1, str2) \
271765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (utf ? PRIV(strcmp_uc_uc_utf)((str1), (str2)) : PRIV(strcmp_uc_uc)((str1), (str2)))
271865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define STRCMP_UC_C8_TEST(str1, str2) \
271965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  (utf ? PRIV(strcmp_uc_c8_utf)((str1), (str2)) : PRIV(strcmp_uc_c8)((str1), (str2)))
272065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
272165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* COMPILE_PCRE[8|16|32] */
272265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
272365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uchar *PRIV(find_bracket)(const pcre_uchar *, BOOL, int);
272465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern BOOL              PRIV(is_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,
272565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           int *, BOOL);
272665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern unsigned int      PRIV(ord2utf)(pcre_uint32, pcre_uchar *);
272765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(valid_utf)(PCRE_PUCHAR, int, int *);
272865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern BOOL              PRIV(was_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR,
272965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           int *, BOOL);
273065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern BOOL              PRIV(xclass)(pcre_uint32, const pcre_uchar *, BOOL);
273165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
273265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_JIT
273365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern void              PRIV(jit_compile)(const REAL_PCRE *,
273465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           PUBL(extra) *, int);
273565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(jit_exec)(const PUBL(extra) *,
273665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich                           const pcre_uchar *, int, int, int, int *, int);
273765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern void              PRIV(jit_free)(void *);
273865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern int               PRIV(jit_get_size)(void *);
273965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const char*       PRIV(jit_get_target)(void);
274065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
274165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
274265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* Unicode character database (UCD) */
274365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
274465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichtypedef struct {
274565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint8 script;     /* ucp_Arabic, etc. */
274665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint8 chartype;   /* ucp_Cc, etc. (general categories) */
274765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint8 gbprop;     /* ucp_gbControl, etc. (grapheme break property) */
274865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_uint8 caseset;    /* offset to multichar other cases or zero */
274965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich  pcre_int32 other_case; /* offset to other case, or zero if none */
275065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} ucd_record;
275165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
275265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint32 PRIV(ucd_caseless_sets)[];
275365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const ucd_record  PRIV(ucd_records)[];
275465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint8  PRIV(ucd_stage1)[];
275565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint16 PRIV(ucd_stage2)[];
275665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint32 PRIV(ucp_gentype)[];
275765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const pcre_uint32 PRIV(ucp_gbtable)[];
275865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_JIT
275965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichextern const int         PRIV(ucp_typerange)[];
276065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
276165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
276265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef SUPPORT_UCP
276365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* UCD access macros */
276465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
276565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_BLOCK_SIZE 128
276665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define GET_UCD(ch) (PRIV(ucd_records) + \
276765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        PRIV(ucd_stage2)[PRIV(ucd_stage1)[(int)(ch) / UCD_BLOCK_SIZE] * \
276865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich        UCD_BLOCK_SIZE + (int)(ch) % UCD_BLOCK_SIZE])
276965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
277065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_CHARTYPE(ch)    GET_UCD(ch)->chartype
277165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_SCRIPT(ch)      GET_UCD(ch)->script
277265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_CATEGORY(ch)    PRIV(ucp_gentype)[UCD_CHARTYPE(ch)]
277365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_GRAPHBREAK(ch)  GET_UCD(ch)->gbprop
277465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_CASESET(ch)     GET_UCD(ch)->caseset
277565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#define UCD_OTHERCASE(ch)   ((pcre_uint32)((int)ch + (int)(GET_UCD(ch)->other_case)))
277665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
277765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif /* SUPPORT_UCP */
277865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
277965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif
278065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich
278165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* End of pcre_internal.h */
2782