2010-06-26 15:51 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* external/pcre/pcreexec.c
* external/pcre/pcre.h
* external/pcre/pcreinal.h
* external/pcre/pcretabs.c
* external/pcre/pcredfa.c
* external/pcre/pcrecomp.c
* external/pcre/pcre.dif
* external/pcre/config.h
* external/pcre/pcrexcls.c
* external/pcre/chartabs.c
* external/pcre/pcreprni.h
* external/pcre/pcrestud.c
* external/pcre/Makefile
* PCRE update to 8.10 (from 8.02)
; Thanks to Tamas Tevesz for the patch. This update was done
using the new patchup tool.
This commit is contained in:
@@ -16,6 +16,24 @@
|
||||
The license applies to all entries newer than 2009-04-28.
|
||||
*/
|
||||
|
||||
2010-06-26 15:51 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* external/pcre/pcreexec.c
|
||||
* external/pcre/pcre.h
|
||||
* external/pcre/pcreinal.h
|
||||
* external/pcre/pcretabs.c
|
||||
* external/pcre/pcredfa.c
|
||||
* external/pcre/pcrecomp.c
|
||||
* external/pcre/pcre.dif
|
||||
* external/pcre/config.h
|
||||
* external/pcre/pcrexcls.c
|
||||
* external/pcre/chartabs.c
|
||||
* external/pcre/pcreprni.h
|
||||
* external/pcre/pcrestud.c
|
||||
* external/pcre/Makefile
|
||||
* PCRE update to 8.10 (from 8.02)
|
||||
; Thanks to Tamas Tevesz for the patch. This update was done
|
||||
using the new patchup tool.
|
||||
|
||||
2010-06-26 15:25 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* utils/hbmk2/hbmk2.prg
|
||||
+ -hbimplib mode now respects -clean option.
|
||||
|
||||
4
harbour/external/pcre/Makefile
vendored
4
harbour/external/pcre/Makefile
vendored
@@ -68,8 +68,8 @@ else
|
||||
endif
|
||||
|
||||
# ORIGIN http://www.pcre.org/
|
||||
# VER 8.02
|
||||
# URL http://sourceforge.net/projects/pcre/files/pcre/8.02/pcre-8.02.zip/download
|
||||
# VER 8.10
|
||||
# URL http://sourceforge.net/projects/pcre/files/pcre/8.10/pcre-8.10.zip/download
|
||||
# DIFF pcre.dif
|
||||
#
|
||||
# MAP LICENCE
|
||||
|
||||
2
harbour/external/pcre/chartabs.c
vendored
2
harbour/external/pcre/chartabs.c
vendored
@@ -14,7 +14,7 @@ example ISO-8859-1. When dftables is run, it creates these tables in the
|
||||
current locale. If PCRE is configured with --enable-rebuild-chartables, this
|
||||
happens automatically.
|
||||
|
||||
The following #includes are present because without the gcc 4.x may remove the
|
||||
The following #includes are present because without them gcc 4.x may remove the
|
||||
array definition from the final binary if PCRE is built into a static library
|
||||
and dead code stripping is activated. This leads to link errors. Pulling in the
|
||||
header ensures that the array gets flagged as "someone outside this compilation
|
||||
|
||||
9
harbour/external/pcre/config.h
vendored
9
harbour/external/pcre/config.h
vendored
@@ -250,13 +250,16 @@ them both to 0; an emulation function will be used. */
|
||||
#define PACKAGE_NAME "PCRE"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "PCRE 8.02"
|
||||
#define PACKAGE_STRING "PCRE 8.10"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "pcre"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "8.02"
|
||||
#define PACKAGE_VERSION "8.10"
|
||||
|
||||
|
||||
/* If you are compiling for a system other than a Unix-like system or
|
||||
@@ -312,7 +315,7 @@ them both to 0; an emulation function will be used. */
|
||||
|
||||
/* Version number of package */
|
||||
#ifndef VERSION
|
||||
#define VERSION "8.02"
|
||||
#define VERSION "8.10"
|
||||
#endif
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
|
||||
8
harbour/external/pcre/pcre.dif
vendored
8
harbour/external/pcre/pcre.dif
vendored
@@ -1,6 +1,6 @@
|
||||
diff -urN pcre.orig/pcrefinf.c pcre/pcrefinf.c
|
||||
--- pcre.orig/pcrefinf.c 2010-06-13 18:04:52.000000000 +0200
|
||||
+++ pcre/pcrefinf.c 2010-06-11 04:09:57.000000000 +0200
|
||||
--- pcre.orig/pcrefinf.c 2010-06-26 14:10:17.887330037 +0200
|
||||
+++ pcre/pcrefinf.c 2010-06-26 14:10:18.107331394 +0200
|
||||
@@ -126,7 +126,7 @@
|
||||
case PCRE_INFO_MINLENGTH:
|
||||
*((int *)where) =
|
||||
@@ -11,8 +11,8 @@ diff -urN pcre.orig/pcrefinf.c pcre/pcrefinf.c
|
||||
|
||||
case PCRE_INFO_LASTLITERAL:
|
||||
diff -urN pcre.orig/pcreglob.c pcre/pcreglob.c
|
||||
--- pcre.orig/pcreglob.c 2010-06-13 18:04:52.000000000 +0200
|
||||
+++ pcre/pcreglob.c 2010-06-11 04:09:57.000000000 +0200
|
||||
--- pcre.orig/pcreglob.c 2010-06-26 14:10:17.907330491 +0200
|
||||
+++ pcre/pcreglob.c 2010-06-26 14:10:18.107331394 +0200
|
||||
@@ -74,11 +74,17 @@
|
||||
PCRE_EXP_DATA_DEFN int (*pcre_callout)(pcre_callout_block *) = NULL;
|
||||
|
||||
|
||||
9
harbour/external/pcre/pcre.h
vendored
9
harbour/external/pcre/pcre.h
vendored
@@ -5,7 +5,7 @@
|
||||
/* This is the public header file for the PCRE library, to be #included by
|
||||
applications that call the PCRE functions.
|
||||
|
||||
Copyright (c) 1997-2009 University of Cambridge
|
||||
Copyright (c) 1997-2010 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
/* The current PCRE version information. */
|
||||
|
||||
#define PCRE_MAJOR 8
|
||||
#define PCRE_MINOR 02
|
||||
#define PCRE_MINOR 10
|
||||
#define PCRE_PRERELEASE
|
||||
#define PCRE_DATE 2010-03-19
|
||||
#define PCRE_DATE 2010-06-25
|
||||
|
||||
/* When an application links to a PCRE DLL in Windows, the symbols that are
|
||||
imported have to be identified as such. When building PCRE, the appropriate
|
||||
@@ -131,6 +131,7 @@ both, so we keep them all distinct. */
|
||||
#define PCRE_NO_START_OPTIMISE 0x04000000
|
||||
#define PCRE_PARTIAL_HARD 0x08000000
|
||||
#define PCRE_NOTEMPTY_ATSTART 0x10000000
|
||||
#define PCRE_UCP 0x20000000
|
||||
|
||||
/* Exec-time and get/set-time error codes */
|
||||
|
||||
@@ -200,6 +201,7 @@ these bits, just add new ones on the end, in order to remain compatible. */
|
||||
#define PCRE_EXTRA_CALLOUT_DATA 0x0004
|
||||
#define PCRE_EXTRA_TABLES 0x0008
|
||||
#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010
|
||||
#define PCRE_EXTRA_MARK 0x0020
|
||||
|
||||
/* Types */
|
||||
|
||||
@@ -225,6 +227,7 @@ typedef struct pcre_extra {
|
||||
void *callout_data; /* Data passed back in callouts */
|
||||
const unsigned char *tables; /* Pointer to character tables */
|
||||
unsigned long int match_limit_recursion; /* Max recursive calls to match() */
|
||||
unsigned char **mark; /* For passing back a mark pointer */
|
||||
} pcre_extra;
|
||||
|
||||
/* The structure for passing out data via the pcre_callout_function. We use a
|
||||
|
||||
750
harbour/external/pcre/pcrecomp.c
vendored
750
harbour/external/pcre/pcrecomp.c
vendored
File diff suppressed because it is too large
Load Diff
217
harbour/external/pcre/pcredfa.c
vendored
217
harbour/external/pcre/pcredfa.c
vendored
@@ -106,7 +106,7 @@ never stored, so we push them well clear of the normal opcodes. */
|
||||
|
||||
|
||||
/* This table identifies those opcodes that are followed immediately by a
|
||||
character that is to be tested in some way. This makes is possible to
|
||||
character that is to be tested in some way. This makes it possible to
|
||||
centralize the loading of these characters. In the case of Type * etc, the
|
||||
"character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a
|
||||
small value. Non-zero values in the table are the offsets from the opcode where
|
||||
@@ -161,8 +161,9 @@ static const uschar coptable[] = {
|
||||
0, 0, /* RREF, NRREF */
|
||||
0, /* DEF */
|
||||
0, 0, /* BRAZERO, BRAMINZERO */
|
||||
0, 0, 0, 0, /* PRUNE, SKIP, THEN, COMMIT */
|
||||
0, 0, 0, 0 /* FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
0, 0, 0, /* MARK, PRUNE, PRUNE_ARG, */
|
||||
0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG, */
|
||||
0, 0, 0, 0, 0 /* COMMIT, FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
};
|
||||
|
||||
/* This table identifies those opcodes that inspect a character. It is used to
|
||||
@@ -218,8 +219,9 @@ static const uschar poptable[] = {
|
||||
0, 0, /* RREF, NRREF */
|
||||
0, /* DEF */
|
||||
0, 0, /* BRAZERO, BRAMINZERO */
|
||||
0, 0, 0, 0, /* PRUNE, SKIP, THEN, COMMIT */
|
||||
0, 0, 0, 0 /* FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
0, 0, 0, /* MARK, PRUNE, PRUNE_ARG, */
|
||||
0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG, */
|
||||
0, 0, 0, 0, 0 /* COMMIT, FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
};
|
||||
|
||||
/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W,
|
||||
@@ -473,7 +475,7 @@ if (*first_op == OP_REVERSE)
|
||||
|
||||
{
|
||||
gone_back = (current_subject - max_back < start_subject)?
|
||||
current_subject - start_subject : max_back;
|
||||
(int)(current_subject - start_subject) : max_back;
|
||||
current_subject -= gone_back;
|
||||
}
|
||||
|
||||
@@ -490,7 +492,7 @@ if (*first_op == OP_REVERSE)
|
||||
int back = GET(end_code, 2+LINK_SIZE);
|
||||
if (back <= gone_back)
|
||||
{
|
||||
int bstate = end_code - start_code + 2 + 2*LINK_SIZE;
|
||||
int bstate = (int)(end_code - start_code + 2 + 2*LINK_SIZE);
|
||||
ADD_NEW_DATA(-bstate, 0, gone_back - back);
|
||||
}
|
||||
end_code += GET(end_code, 1);
|
||||
@@ -526,7 +528,7 @@ else
|
||||
((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0);
|
||||
do
|
||||
{
|
||||
ADD_NEW(end_code - start_code + length, 0);
|
||||
ADD_NEW((int)(end_code - start_code + length), 0);
|
||||
end_code += GET(end_code, 1);
|
||||
length = 1 + LINK_SIZE;
|
||||
}
|
||||
@@ -753,8 +755,8 @@ for (;;)
|
||||
if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int));
|
||||
if (offsetcount >= 2)
|
||||
{
|
||||
offsets[0] = current_subject - start_subject;
|
||||
offsets[1] = ptr - start_subject;
|
||||
offsets[0] = (int)(current_subject - start_subject);
|
||||
offsets[1] = (int)(ptr - start_subject);
|
||||
DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP,
|
||||
offsets[1] - offsets[0], current_subject));
|
||||
}
|
||||
@@ -776,7 +778,7 @@ for (;;)
|
||||
/*-----------------------------------------------------------------*/
|
||||
case OP_ALT:
|
||||
do { code += GET(code, 1); } while (*code == OP_ALT);
|
||||
ADD_ACTIVE(code - start_code, 0);
|
||||
ADD_ACTIVE((int)(code - start_code), 0);
|
||||
break;
|
||||
|
||||
/*-----------------------------------------------------------------*/
|
||||
@@ -784,7 +786,7 @@ for (;;)
|
||||
case OP_SBRA:
|
||||
do
|
||||
{
|
||||
ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
|
||||
ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);
|
||||
code += GET(code, 1);
|
||||
}
|
||||
while (*code == OP_ALT);
|
||||
@@ -793,11 +795,11 @@ for (;;)
|
||||
/*-----------------------------------------------------------------*/
|
||||
case OP_CBRA:
|
||||
case OP_SCBRA:
|
||||
ADD_ACTIVE(code - start_code + 3 + LINK_SIZE, 0);
|
||||
ADD_ACTIVE((int)(code - start_code + 3 + LINK_SIZE), 0);
|
||||
code += GET(code, 1);
|
||||
while (*code == OP_ALT)
|
||||
{
|
||||
ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
|
||||
ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);
|
||||
code += GET(code, 1);
|
||||
}
|
||||
break;
|
||||
@@ -808,14 +810,14 @@ for (;;)
|
||||
ADD_ACTIVE(state_offset + 1, 0);
|
||||
code += 1 + GET(code, 2);
|
||||
while (*code == OP_ALT) code += GET(code, 1);
|
||||
ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
|
||||
ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);
|
||||
break;
|
||||
|
||||
/*-----------------------------------------------------------------*/
|
||||
case OP_SKIPZERO:
|
||||
code += 1 + GET(code, 2);
|
||||
while (*code == OP_ALT) code += GET(code, 1);
|
||||
ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0);
|
||||
ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0);
|
||||
break;
|
||||
|
||||
/*-----------------------------------------------------------------*/
|
||||
@@ -920,13 +922,37 @@ for (;;)
|
||||
if (utf8) BACKCHAR(temp);
|
||||
#endif
|
||||
GETCHARTEST(d, temp);
|
||||
#ifdef SUPPORT_UCP
|
||||
if ((md->poptions & PCRE_UCP) != 0)
|
||||
{
|
||||
if (d == '_') left_word = TRUE; else
|
||||
{
|
||||
int cat = UCD_CATEGORY(d);
|
||||
left_word = (cat == ucp_L || cat == ucp_N);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
left_word = d < 256 && (ctypes[d] & ctype_word) != 0;
|
||||
}
|
||||
else left_word = 0;
|
||||
else left_word = FALSE;
|
||||
|
||||
if (clen > 0)
|
||||
{
|
||||
#ifdef SUPPORT_UCP
|
||||
if ((md->poptions & PCRE_UCP) != 0)
|
||||
{
|
||||
if (c == '_') right_word = TRUE; else
|
||||
{
|
||||
int cat = UCD_CATEGORY(c);
|
||||
right_word = (cat == ucp_L || cat == ucp_N);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
right_word = c < 256 && (ctypes[c] & ctype_word) != 0;
|
||||
else right_word = 0;
|
||||
}
|
||||
else right_word = FALSE;
|
||||
|
||||
if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY))
|
||||
{ ADD_ACTIVE(state_offset + 1, 0); }
|
||||
@@ -953,7 +979,8 @@ for (;;)
|
||||
break;
|
||||
|
||||
case PT_LAMP:
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
||||
prop->chartype == ucp_Lt;
|
||||
break;
|
||||
|
||||
case PT_GC:
|
||||
@@ -968,6 +995,30 @@ for (;;)
|
||||
OK = prop->script == code[2];
|
||||
break;
|
||||
|
||||
/* These are specials for combination cases. */
|
||||
|
||||
case PT_ALNUM:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N;
|
||||
break;
|
||||
|
||||
case PT_SPACE: /* Perl space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_PXSPACE: /* POSIX space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
|
||||
c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_WORD:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N ||
|
||||
c == CHAR_UNDERSCORE;
|
||||
break;
|
||||
|
||||
/* Should never occur, but keep compilers from grumbling. */
|
||||
|
||||
default:
|
||||
@@ -1122,7 +1173,8 @@ for (;;)
|
||||
break;
|
||||
|
||||
case PT_LAMP:
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
||||
prop->chartype == ucp_Lt;
|
||||
break;
|
||||
|
||||
case PT_GC:
|
||||
@@ -1137,6 +1189,30 @@ for (;;)
|
||||
OK = prop->script == code[3];
|
||||
break;
|
||||
|
||||
/* These are specials for combination cases. */
|
||||
|
||||
case PT_ALNUM:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N;
|
||||
break;
|
||||
|
||||
case PT_SPACE: /* Perl space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_PXSPACE: /* POSIX space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
|
||||
c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_WORD:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N ||
|
||||
c == CHAR_UNDERSCORE;
|
||||
break;
|
||||
|
||||
/* Should never occur, but keep compilers from grumbling. */
|
||||
|
||||
default:
|
||||
@@ -1344,7 +1420,8 @@ for (;;)
|
||||
break;
|
||||
|
||||
case PT_LAMP:
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
||||
prop->chartype == ucp_Lt;
|
||||
break;
|
||||
|
||||
case PT_GC:
|
||||
@@ -1359,6 +1436,30 @@ for (;;)
|
||||
OK = prop->script == code[3];
|
||||
break;
|
||||
|
||||
/* These are specials for combination cases. */
|
||||
|
||||
case PT_ALNUM:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N;
|
||||
break;
|
||||
|
||||
case PT_SPACE: /* Perl space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_PXSPACE: /* POSIX space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
|
||||
c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_WORD:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N ||
|
||||
c == CHAR_UNDERSCORE;
|
||||
break;
|
||||
|
||||
/* Should never occur, but keep compilers from grumbling. */
|
||||
|
||||
default:
|
||||
@@ -1591,7 +1692,8 @@ for (;;)
|
||||
break;
|
||||
|
||||
case PT_LAMP:
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt;
|
||||
OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
||||
prop->chartype == ucp_Lt;
|
||||
break;
|
||||
|
||||
case PT_GC:
|
||||
@@ -1606,6 +1708,30 @@ for (;;)
|
||||
OK = prop->script == code[5];
|
||||
break;
|
||||
|
||||
/* These are specials for combination cases. */
|
||||
|
||||
case PT_ALNUM:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N;
|
||||
break;
|
||||
|
||||
case PT_SPACE: /* Perl space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_PXSPACE: /* POSIX space */
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
|
||||
c == CHAR_FF || c == CHAR_CR;
|
||||
break;
|
||||
|
||||
case PT_WORD:
|
||||
OK = _pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N ||
|
||||
c == CHAR_UNDERSCORE;
|
||||
break;
|
||||
|
||||
/* Should never occur, but keep compilers from grumbling. */
|
||||
|
||||
default:
|
||||
@@ -2233,7 +2359,7 @@ for (;;)
|
||||
points to the byte after the end of the class. If there is a
|
||||
quantifier, this is where it will be. */
|
||||
|
||||
next_state_offset = ecode - start_code;
|
||||
next_state_offset = (int)(ecode - start_code);
|
||||
|
||||
switch (*ecode)
|
||||
{
|
||||
@@ -2304,7 +2430,7 @@ for (;;)
|
||||
md, /* static match data */
|
||||
code, /* this subexpression's code */
|
||||
ptr, /* where we currently are */
|
||||
ptr - start_subject, /* start offset */
|
||||
(int)(ptr - start_subject), /* start offset */
|
||||
local_offsets, /* offset vector */
|
||||
sizeof(local_offsets)/sizeof(int), /* size of same */
|
||||
local_workspace, /* workspace vector */
|
||||
@@ -2315,7 +2441,7 @@ for (;;)
|
||||
|
||||
if (rc == PCRE_ERROR_DFA_UITEM) return rc;
|
||||
if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK))
|
||||
{ ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
|
||||
{ ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -2342,9 +2468,9 @@ for (;;)
|
||||
cb.callout_number = code[LINK_SIZE+2];
|
||||
cb.offset_vector = offsets;
|
||||
cb.subject = (PCRE_SPTR)start_subject;
|
||||
cb.subject_length = end_subject - start_subject;
|
||||
cb.start_match = current_subject - start_subject;
|
||||
cb.current_position = ptr - start_subject;
|
||||
cb.subject_length = (int)(end_subject - start_subject);
|
||||
cb.start_match = (int)(current_subject - start_subject);
|
||||
cb.current_position = (int)(ptr - start_subject);
|
||||
cb.pattern_position = GET(code, LINK_SIZE + 3);
|
||||
cb.next_item_length = GET(code, 3 + 2*LINK_SIZE);
|
||||
cb.capture_top = 1;
|
||||
@@ -2395,7 +2521,7 @@ for (;;)
|
||||
md, /* fixed match data */
|
||||
asscode, /* this subexpression's code */
|
||||
ptr, /* where we currently are */
|
||||
ptr - start_subject, /* start offset */
|
||||
(int)(ptr - start_subject), /* start offset */
|
||||
local_offsets, /* offset vector */
|
||||
sizeof(local_offsets)/sizeof(int), /* size of same */
|
||||
local_workspace, /* workspace vector */
|
||||
@@ -2407,7 +2533,7 @@ for (;;)
|
||||
if (rc == PCRE_ERROR_DFA_UITEM) return rc;
|
||||
if ((rc >= 0) ==
|
||||
(condcode == OP_ASSERT || condcode == OP_ASSERTBACK))
|
||||
{ ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); }
|
||||
{ ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); }
|
||||
else
|
||||
{ ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
|
||||
}
|
||||
@@ -2428,7 +2554,7 @@ for (;;)
|
||||
md, /* fixed match data */
|
||||
start_code + GET(code, 1), /* this subexpression's code */
|
||||
ptr, /* where we currently are */
|
||||
ptr - start_subject, /* start offset */
|
||||
(int)(ptr - start_subject), /* start offset */
|
||||
local_offsets, /* offset vector */
|
||||
sizeof(local_offsets)/sizeof(int), /* size of same */
|
||||
local_workspace, /* workspace vector */
|
||||
@@ -2480,7 +2606,7 @@ for (;;)
|
||||
md, /* fixed match data */
|
||||
code, /* this subexpression's code */
|
||||
ptr, /* where we currently are */
|
||||
ptr - start_subject, /* start offset */
|
||||
(int)(ptr - start_subject), /* start offset */
|
||||
local_offsets, /* offset vector */
|
||||
sizeof(local_offsets)/sizeof(int), /* size of same */
|
||||
local_workspace, /* workspace vector */
|
||||
@@ -2497,7 +2623,8 @@ for (;;)
|
||||
|
||||
do { end_subpattern += GET(end_subpattern, 1); }
|
||||
while (*end_subpattern == OP_ALT);
|
||||
next_state_offset = end_subpattern - start_code + LINK_SIZE + 1;
|
||||
next_state_offset =
|
||||
(int)(end_subpattern - start_code + LINK_SIZE + 1);
|
||||
|
||||
/* If the end of this subpattern is KETRMAX or KETRMIN, we must
|
||||
arrange for the repeat state also to be added to the relevant list.
|
||||
@@ -2505,7 +2632,7 @@ for (;;)
|
||||
|
||||
repeat_state_offset = (*end_subpattern == OP_KETRMAX ||
|
||||
*end_subpattern == OP_KETRMIN)?
|
||||
end_subpattern - start_code - GET(end_subpattern, 1) : -1;
|
||||
(int)(end_subpattern - start_code - GET(end_subpattern, 1)) : -1;
|
||||
|
||||
/* If we have matched an empty string, add the next state at the
|
||||
current character pointer. This is important so that the duplicate
|
||||
@@ -2569,9 +2696,9 @@ for (;;)
|
||||
cb.callout_number = code[1];
|
||||
cb.offset_vector = offsets;
|
||||
cb.subject = (PCRE_SPTR)start_subject;
|
||||
cb.subject_length = end_subject - start_subject;
|
||||
cb.start_match = current_subject - start_subject;
|
||||
cb.current_position = ptr - start_subject;
|
||||
cb.subject_length = (int)(end_subject - start_subject);
|
||||
cb.start_match = (int)(current_subject - start_subject);
|
||||
cb.current_position = (int)(ptr - start_subject);
|
||||
cb.pattern_position = GET(code, 2);
|
||||
cb.next_item_length = GET(code, 2 + LINK_SIZE);
|
||||
cb.capture_top = 1;
|
||||
@@ -2622,8 +2749,8 @@ for (;;)
|
||||
{
|
||||
if (offsetcount >= 2)
|
||||
{
|
||||
offsets[0] = md->start_used_ptr - start_subject;
|
||||
offsets[1] = end_subject - start_subject;
|
||||
offsets[0] = (int)(md->start_used_ptr - start_subject);
|
||||
offsets[1] = (int)(end_subject - start_subject);
|
||||
}
|
||||
match_count = PCRE_ERROR_PARTIAL;
|
||||
}
|
||||
@@ -2982,8 +3109,16 @@ for (;;)
|
||||
while (current_subject < end_subject)
|
||||
{
|
||||
register unsigned int c = *current_subject;
|
||||
if ((start_bits[c/8] & (1 << (c&7))) == 0) current_subject++;
|
||||
else break;
|
||||
if ((start_bits[c/8] & (1 << (c&7))) == 0)
|
||||
{
|
||||
current_subject++;
|
||||
#ifdef SUPPORT_UTF8
|
||||
if (utf8)
|
||||
while(current_subject < end_subject &&
|
||||
(*current_subject & 0xc0) == 0x80) current_subject++;
|
||||
#endif
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1051
harbour/external/pcre/pcreexec.c
vendored
1051
harbour/external/pcre/pcreexec.c
vendored
File diff suppressed because it is too large
Load Diff
76
harbour/external/pcre/pcreinal.h
vendored
76
harbour/external/pcre/pcreinal.h
vendored
@@ -475,7 +475,8 @@ know we are in UTF-8 mode. */
|
||||
} \
|
||||
}
|
||||
|
||||
/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
|
||||
/* Get the next character, testing for UTF-8 mode, and advancing the pointer.
|
||||
This is called when we don't know if we are in UTF-8 mode. */
|
||||
|
||||
#define GETCHARINCTEST(c, eptr) \
|
||||
c = *eptr++; \
|
||||
@@ -512,7 +513,7 @@ if there are extra bytes. This is called when we know we are in UTF-8 mode. */
|
||||
|
||||
/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the
|
||||
pointer, incrementing length if there are extra bytes. This is called when we
|
||||
know we are in UTF-8 mode. */
|
||||
do not know if we are in UTF-8 mode. */
|
||||
|
||||
#define GETCHARLENTEST(c, eptr, len) \
|
||||
c = *eptr; \
|
||||
@@ -580,7 +581,7 @@ time, run time, or study time, respectively. */
|
||||
PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
|
||||
PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \
|
||||
PCRE_DUPNAMES|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \
|
||||
PCRE_JAVASCRIPT_COMPAT)
|
||||
PCRE_JAVASCRIPT_COMPAT|PCRE_UCP)
|
||||
|
||||
#define PUBLIC_EXEC_OPTIONS \
|
||||
(PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \
|
||||
@@ -875,6 +876,7 @@ so that PCRE works on both ASCII and EBCDIC platforms, in non-UTF-mode only. */
|
||||
#define STRING_COMMIT0 "COMMIT\0"
|
||||
#define STRING_F0 "F\0"
|
||||
#define STRING_FAIL0 "FAIL\0"
|
||||
#define STRING_MARK0 "MARK\0"
|
||||
#define STRING_PRUNE0 "PRUNE\0"
|
||||
#define STRING_SKIP0 "SKIP\0"
|
||||
#define STRING_THEN "THEN"
|
||||
@@ -904,6 +906,7 @@ so that PCRE works on both ASCII and EBCDIC platforms, in non-UTF-mode only. */
|
||||
#define STRING_BSR_ANYCRLF_RIGHTPAR "BSR_ANYCRLF)"
|
||||
#define STRING_BSR_UNICODE_RIGHTPAR "BSR_UNICODE)"
|
||||
#define STRING_UTF8_RIGHTPAR "UTF8)"
|
||||
#define STRING_UCP_RIGHTPAR "UCP)"
|
||||
|
||||
#else /* SUPPORT_UTF8 */
|
||||
|
||||
@@ -1127,6 +1130,7 @@ only. */
|
||||
#define STRING_COMMIT0 STR_C STR_O STR_M STR_M STR_I STR_T "\0"
|
||||
#define STRING_F0 STR_F "\0"
|
||||
#define STRING_FAIL0 STR_F STR_A STR_I STR_L "\0"
|
||||
#define STRING_MARK0 STR_M STR_A STR_R STR_K "\0"
|
||||
#define STRING_PRUNE0 STR_P STR_R STR_U STR_N STR_E "\0"
|
||||
#define STRING_SKIP0 STR_S STR_K STR_I STR_P "\0"
|
||||
#define STRING_THEN STR_T STR_H STR_E STR_N
|
||||
@@ -1156,6 +1160,7 @@ only. */
|
||||
#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
|
||||
#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
|
||||
#define STRING_UTF8_RIGHTPAR STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS
|
||||
#define STRING_UCP_RIGHTPAR STR_U STR_C STR_P STR_RIGHT_PARENTHESIS
|
||||
|
||||
#endif /* SUPPORT_UTF8 */
|
||||
|
||||
@@ -1188,9 +1193,13 @@ only. */
|
||||
|
||||
#define PT_ANY 0 /* Any property - matches all chars */
|
||||
#define PT_LAMP 1 /* L& - the union of Lu, Ll, Lt */
|
||||
#define PT_GC 2 /* General characteristic (e.g. L) */
|
||||
#define PT_PC 3 /* Particular characteristic (e.g. Lu) */
|
||||
#define PT_GC 2 /* Specified general characteristic (e.g. L) */
|
||||
#define PT_PC 3 /* Specified particular characteristic (e.g. Lu) */
|
||||
#define PT_SC 4 /* Script (e.g. Han) */
|
||||
#define PT_ALNUM 5 /* Alphanumeric - the union of L and N */
|
||||
#define PT_SPACE 6 /* Perl space - Z plus 9,10,12,13 */
|
||||
#define PT_PXSPACE 7 /* POSIX space - Z plus 9,10,11,12,13 */
|
||||
#define PT_WORD 8 /* Word - L plus N plus underscore */
|
||||
|
||||
/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
|
||||
contain UTF-8 characters with values greater than 255. */
|
||||
@@ -1207,9 +1216,15 @@ contain UTF-8 characters with values greater than 255. */
|
||||
/* These are escaped items that aren't just an encoding of a particular data
|
||||
value such as \n. They must have non-zero values, as check_escape() returns
|
||||
their negation. Also, they must appear in the same order as in the opcode
|
||||
definitions below, up to ESC_z. There's a dummy for OP_ANY because it
|
||||
corresponds to "." rather than an escape sequence, and another for OP_ALLANY
|
||||
(which is used for [^] in JavaScript compatibility mode).
|
||||
definitions below, up to ESC_z. There's a dummy for OP_ALLANY because it
|
||||
corresponds to "." in DOTALL mode rather than an escape sequence. It is also
|
||||
used for [^] in JavaScript compatibility mode. In non-DOTALL mode, "." behaves
|
||||
like \N.
|
||||
|
||||
The special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc.
|
||||
when PCRE_UCP is set, when replacement of \d etc by \p sequences is required.
|
||||
They must be contiguous, and remain in order so that the replacements can be
|
||||
looked up from a table.
|
||||
|
||||
The final escape must be ESC_REF as subsequent values are used for
|
||||
backreferences (\1, \2, \3, etc). There are two tests in the code for an escape
|
||||
@@ -1219,11 +1234,12 @@ put in between that don't consume a character, that code will have to change.
|
||||
*/
|
||||
|
||||
enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s,
|
||||
ESC_W, ESC_w, ESC_dum1, ESC_dum2, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
|
||||
ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_g, ESC_k,
|
||||
ESC_W, ESC_w, ESC_N, ESC_dum, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H,
|
||||
ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z,
|
||||
ESC_E, ESC_Q, ESC_g, ESC_k,
|
||||
ESC_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu,
|
||||
ESC_REF };
|
||||
|
||||
|
||||
/* Opcode table: Starting from 1 (i.e. after OP_END), the values up to
|
||||
OP_EOD must correspond in order to the list of escapes immediately above.
|
||||
|
||||
@@ -1247,8 +1263,8 @@ enum {
|
||||
OP_WHITESPACE, /* 9 \s */
|
||||
OP_NOT_WORDCHAR, /* 10 \W */
|
||||
OP_WORDCHAR, /* 11 \w */
|
||||
OP_ANY, /* 12 Match any character (subject to DOTALL) */
|
||||
OP_ALLANY, /* 13 Match any character (not subject to DOTALL) */
|
||||
OP_ANY, /* 12 Match any character except newline */
|
||||
OP_ALLANY, /* 13 Match any character */
|
||||
OP_ANYBYTE, /* 14 Match any byte (\C); different to OP_ANY for UTF-8 */
|
||||
OP_NOTPROP, /* 15 \P (not Unicode property) */
|
||||
OP_PROP, /* 16 \p (Unicode property) */
|
||||
@@ -1378,20 +1394,24 @@ enum {
|
||||
|
||||
/* These are backtracking control verbs */
|
||||
|
||||
OP_PRUNE, /* 107 */
|
||||
OP_SKIP, /* 108 */
|
||||
OP_THEN, /* 109 */
|
||||
OP_COMMIT, /* 110 */
|
||||
OP_MARK, /* 107 always has an argument */
|
||||
OP_PRUNE, /* 108 */
|
||||
OP_PRUNE_ARG, /* 109 same, but with argument */
|
||||
OP_SKIP, /* 110 */
|
||||
OP_SKIP_ARG, /* 111 same, but with argument */
|
||||
OP_THEN, /* 112 */
|
||||
OP_THEN_ARG, /* 113 same, but with argument */
|
||||
OP_COMMIT, /* 114 */
|
||||
|
||||
/* These are forced failure and success verbs */
|
||||
|
||||
OP_FAIL, /* 111 */
|
||||
OP_ACCEPT, /* 112 */
|
||||
OP_CLOSE, /* 113 Used before OP_ACCEPT to close open captures */
|
||||
OP_FAIL, /* 115 */
|
||||
OP_ACCEPT, /* 116 */
|
||||
OP_CLOSE, /* 117 Used before OP_ACCEPT to close open captures */
|
||||
|
||||
/* This is used to skip a subpattern with a {0} quantifier */
|
||||
|
||||
OP_SKIPZERO, /* 114 */
|
||||
OP_SKIPZERO, /* 118 */
|
||||
|
||||
/* This is not an opcode, but is used to check that tables indexed by opcode
|
||||
are the correct length, in order to catch updating errors - there have been
|
||||
@@ -1402,7 +1422,7 @@ enum {
|
||||
|
||||
/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro
|
||||
definitions that follow must also be updated to match. There are also tables
|
||||
called "coptable" cna "poptable" in pcre_dfa_exec.c that must be updated. */
|
||||
called "coptable" and "poptable" in pcre_dfa_exec.c that must be updated. */
|
||||
|
||||
|
||||
/* This macro defines textual names for all the opcodes. These are used only
|
||||
@@ -1427,7 +1447,8 @@ for debugging. The macro is referenced only in pcre_printint.c. */
|
||||
"Once", "Bra", "CBra", "Cond", "SBra", "SCBra", "SCond", \
|
||||
"Cond ref", "Cond nref", "Cond rec", "Cond nrec", "Cond def", \
|
||||
"Brazero", "Braminzero", \
|
||||
"*PRUNE", "*SKIP", "*THEN", "*COMMIT", "*FAIL", "*ACCEPT", \
|
||||
"*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP", \
|
||||
"*THEN", "*THEN", "*COMMIT", "*FAIL", "*ACCEPT", \
|
||||
"Close", "Skip zero"
|
||||
|
||||
|
||||
@@ -1493,8 +1514,9 @@ in UTF-8 mode. The code that uses this table must know about such things. */
|
||||
3, 3, /* RREF, NRREF */ \
|
||||
1, /* DEF */ \
|
||||
1, 1, /* BRAZERO, BRAMINZERO */ \
|
||||
1, 1, 1, 1, /* PRUNE, SKIP, THEN, COMMIT, */ \
|
||||
1, 1, 3, 1 /* FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
3, 1, 3, /* MARK, PRUNE, PRUNE_ARG, */ \
|
||||
1, 3, 1, 3, /* SKIP, SKIP_ARG, THEN, THEN_ARG, */ \
|
||||
1, 1, 1, 3, 1 /* COMMIT, FAIL, ACCEPT, CLOSE, SKIPZERO */
|
||||
|
||||
|
||||
/* A magic value for OP_RREF and OP_NRREF to indicate the "any recursion"
|
||||
@@ -1512,7 +1534,7 @@ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9,
|
||||
ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39,
|
||||
ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49,
|
||||
ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,
|
||||
ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERRCOUNT };
|
||||
ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERRCOUNT };
|
||||
|
||||
/* The real format of the start of the pcre block; the index of names and the
|
||||
code vector run on as long as necessary after the end. We store an explicit
|
||||
@@ -1655,6 +1677,7 @@ typedef struct match_data {
|
||||
BOOL noteol; /* NOTEOL flag */
|
||||
BOOL utf8; /* UTF8 flag */
|
||||
BOOL jscript_compat; /* JAVASCRIPT_COMPAT flag */
|
||||
BOOL use_ucp; /* PCRE_UCP flag */
|
||||
BOOL endonly; /* Dollar not before final \n */
|
||||
BOOL notempty; /* Empty string match not wanted */
|
||||
BOOL notempty_atstart; /* Empty string match at start not wanted */
|
||||
@@ -1674,6 +1697,7 @@ typedef struct match_data {
|
||||
int eptrn; /* Next free eptrblock */
|
||||
recursion_info *recursive; /* Linked list of recursion data */
|
||||
void *callout_data; /* To pass back to callouts */
|
||||
const uschar *mark; /* Mark pointer to pass back */
|
||||
} match_data;
|
||||
|
||||
/* A similar structure is used for the same purpose by the DFA matching
|
||||
|
||||
8
harbour/external/pcre/pcreprni.h
vendored
8
harbour/external/pcre/pcreprni.h
vendored
@@ -534,6 +534,14 @@ for(;;)
|
||||
}
|
||||
break;
|
||||
|
||||
case OP_MARK:
|
||||
case OP_PRUNE_ARG:
|
||||
case OP_SKIP_ARG:
|
||||
case OP_THEN_ARG:
|
||||
fprintf(f, " %s %s", OP_names[*code], code + 2);
|
||||
extra += code[1];
|
||||
break;
|
||||
|
||||
/* Anything else is just an item with no data*/
|
||||
|
||||
default:
|
||||
|
||||
274
harbour/external/pcre/pcrestud.c
vendored
274
harbour/external/pcre/pcrestud.c
vendored
@@ -48,6 +48,7 @@ supporting functions. */
|
||||
|
||||
#include "pcreinal.h"
|
||||
|
||||
#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7))
|
||||
|
||||
/* Returns from set_start_bits() */
|
||||
|
||||
@@ -413,6 +414,15 @@ for (;;)
|
||||
#endif
|
||||
break;
|
||||
|
||||
/* Skip these, but we need to add in the name length. */
|
||||
|
||||
case OP_MARK:
|
||||
case OP_PRUNE_ARG:
|
||||
case OP_SKIP_ARG:
|
||||
case OP_THEN_ARG:
|
||||
cc += _pcre_OP_lengths[op] + cc[1];
|
||||
break;
|
||||
|
||||
/* For the record, these are the opcodes that are matched by "default":
|
||||
OP_ACCEPT, OP_CLOSE, OP_COMMIT, OP_FAIL, OP_PRUNE, OP_SET_SOM, OP_SKIP,
|
||||
OP_THEN. */
|
||||
@@ -431,25 +441,121 @@ for (;;)
|
||||
* Set a bit and maybe its alternate case *
|
||||
*************************************************/
|
||||
|
||||
/* Given a character, set its bit in the table, and also the bit for the other
|
||||
version of a letter if we are caseless.
|
||||
/* Given a character, set its first byte's bit in the table, and also the
|
||||
corresponding bit for the other version of a letter if we are caseless. In
|
||||
UTF-8 mode, for characters greater than 127, we can only do the caseless thing
|
||||
when Unicode property support is available.
|
||||
|
||||
Arguments:
|
||||
start_bits points to the bit map
|
||||
c is the character
|
||||
p points to the character
|
||||
caseless the caseless flag
|
||||
cd the block with char table pointers
|
||||
utf8 TRUE for UTF-8 mode
|
||||
|
||||
Returns: nothing
|
||||
Returns: pointer after the character
|
||||
*/
|
||||
|
||||
static const uschar *
|
||||
set_table_bit(uschar *start_bits, const uschar *p, BOOL caseless,
|
||||
compile_data *cd, BOOL utf8)
|
||||
{
|
||||
unsigned int c = *p;
|
||||
|
||||
SET_BIT(c);
|
||||
|
||||
#ifdef SUPPORT_UTF8
|
||||
if (utf8 && c > 127)
|
||||
{
|
||||
GETCHARINC(c, p);
|
||||
#ifdef SUPPORT_UCP
|
||||
if (caseless)
|
||||
{
|
||||
uschar buff[8];
|
||||
c = UCD_OTHERCASE(c);
|
||||
(void)_pcre_ord2utf8(c, buff);
|
||||
SET_BIT(buff[0]);
|
||||
}
|
||||
#endif
|
||||
return p;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Not UTF-8 mode, or character is less than 127. */
|
||||
|
||||
if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************************
|
||||
* Set bits for a positive character type *
|
||||
*************************************************/
|
||||
|
||||
/* This function sets starting bits for a character type. In UTF-8 mode, we can
|
||||
only do a direct setting for bytes less than 128, as otherwise there can be
|
||||
confusion with bytes in the middle of UTF-8 characters. In a "traditional"
|
||||
environment, the tables will only recognize ASCII characters anyway, but in at
|
||||
least one Windows environment, some higher bytes bits were set in the tables.
|
||||
So we deal with that case by considering the UTF-8 encoding.
|
||||
|
||||
Arguments:
|
||||
start_bits the starting bitmap
|
||||
cbit type the type of character wanted
|
||||
table_limit 32 for non-UTF-8; 16 for UTF-8
|
||||
cd the block with char table pointers
|
||||
|
||||
Returns: nothing
|
||||
*/
|
||||
|
||||
static void
|
||||
set_table_bit(uschar *start_bits, unsigned int c, BOOL caseless,
|
||||
set_type_bits(uschar *start_bits, int cbit_type, int table_limit,
|
||||
compile_data *cd)
|
||||
{
|
||||
start_bits[c/8] |= (1 << (c&7));
|
||||
if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
|
||||
start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
|
||||
register int c;
|
||||
for (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type];
|
||||
if (table_limit == 32) return;
|
||||
for (c = 128; c < 256; c++)
|
||||
{
|
||||
if ((cd->cbits[c/8] & (1 << (c&7))) != 0)
|
||||
{
|
||||
uschar buff[8];
|
||||
(void)_pcre_ord2utf8(c, buff);
|
||||
SET_BIT(buff[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*************************************************
|
||||
* Set bits for a negative character type *
|
||||
*************************************************/
|
||||
|
||||
/* This function sets starting bits for a negative character type such as \D.
|
||||
In UTF-8 mode, we can only do a direct setting for bytes less than 128, as
|
||||
otherwise there can be confusion with bytes in the middle of UTF-8 characters.
|
||||
Unlike in the positive case, where we can set appropriate starting bits for
|
||||
specific high-valued UTF-8 characters, in this case we have to set the bits for
|
||||
all high-valued characters. The lowest is 0xc2, but we overkill by starting at
|
||||
0xc0 (192) for simplicity.
|
||||
|
||||
Arguments:
|
||||
start_bits the starting bitmap
|
||||
cbit type the type of character wanted
|
||||
table_limit 32 for non-UTF-8; 16 for UTF-8
|
||||
cd the block with char table pointers
|
||||
|
||||
Returns: nothing
|
||||
*/
|
||||
|
||||
static void
|
||||
set_nottype_bits(uschar *start_bits, int cbit_type, int table_limit,
|
||||
compile_data *cd)
|
||||
{
|
||||
register int c;
|
||||
for (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type];
|
||||
if (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff;
|
||||
}
|
||||
|
||||
|
||||
@@ -484,6 +590,7 @@ set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
|
||||
{
|
||||
register int c;
|
||||
int yield = SSB_DONE;
|
||||
int table_limit = utf8? 16:32;
|
||||
|
||||
#if 0
|
||||
/* ========================================================================= */
|
||||
@@ -607,12 +714,7 @@ do
|
||||
case OP_QUERY:
|
||||
case OP_MINQUERY:
|
||||
case OP_POSQUERY:
|
||||
set_table_bit(start_bits, tcode[1], caseless, cd);
|
||||
tcode += 2;
|
||||
#ifdef SUPPORT_UTF8
|
||||
if (utf8 && tcode[-1] >= 0xc0)
|
||||
tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
|
||||
#endif
|
||||
tcode = set_table_bit(start_bits, tcode + 1, caseless, cd, utf8);
|
||||
break;
|
||||
|
||||
/* Single-char upto sets the bit and tries the next */
|
||||
@@ -620,12 +722,7 @@ do
|
||||
case OP_UPTO:
|
||||
case OP_MINUPTO:
|
||||
case OP_POSUPTO:
|
||||
set_table_bit(start_bits, tcode[3], caseless, cd);
|
||||
tcode += 4;
|
||||
#ifdef SUPPORT_UTF8
|
||||
if (utf8 && tcode[-1] >= 0xc0)
|
||||
tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
|
||||
#endif
|
||||
tcode = set_table_bit(start_bits, tcode + 3, caseless, cd, utf8);
|
||||
break;
|
||||
|
||||
/* At least one single char sets the bit and stops */
|
||||
@@ -638,59 +735,86 @@ do
|
||||
case OP_PLUS:
|
||||
case OP_MINPLUS:
|
||||
case OP_POSPLUS:
|
||||
set_table_bit(start_bits, tcode[1], caseless, cd);
|
||||
(void)set_table_bit(start_bits, tcode + 1, caseless, cd, utf8);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
/* Single character type sets the bits and stops */
|
||||
/* Special spacing and line-terminating items. These recognize specific
|
||||
lists of characters. The difference between VSPACE and ANYNL is that the
|
||||
latter can match the two-character CRLF sequence, but that is not
|
||||
relevant for finding the first character, so their code here is
|
||||
identical. */
|
||||
|
||||
case OP_HSPACE:
|
||||
SET_BIT(0x09);
|
||||
SET_BIT(0x20);
|
||||
if (utf8)
|
||||
{
|
||||
SET_BIT(0xC2); /* For U+00A0 */
|
||||
SET_BIT(0xE1); /* For U+1680, U+180E */
|
||||
SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */
|
||||
SET_BIT(0xE3); /* For U+3000 */
|
||||
}
|
||||
else SET_BIT(0xA0);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
case OP_ANYNL:
|
||||
case OP_VSPACE:
|
||||
SET_BIT(0x0A);
|
||||
SET_BIT(0x0B);
|
||||
SET_BIT(0x0C);
|
||||
SET_BIT(0x0D);
|
||||
if (utf8)
|
||||
{
|
||||
SET_BIT(0xC2); /* For U+0085 */
|
||||
SET_BIT(0xE2); /* For U+2028, U+2029 */
|
||||
}
|
||||
else SET_BIT(0x85);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
/* Single character types set the bits and stop. Note that if PCRE_UCP
|
||||
is set, we do not see these op codes because \d etc are converted to
|
||||
properties. Therefore, these apply in the case when only characters less
|
||||
than 256 are recognized to match the types. */
|
||||
|
||||
case OP_NOT_DIGIT:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= ~cd->cbits[c+cbit_digit];
|
||||
set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
case OP_DIGIT:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= cd->cbits[c+cbit_digit];
|
||||
set_type_bits(start_bits, cbit_digit, table_limit, cd);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
/* The cbit_space table has vertical tab as whitespace; we have to
|
||||
discard it. */
|
||||
ensure it is set as not whitespace. */
|
||||
|
||||
case OP_NOT_WHITESPACE:
|
||||
for (c = 0; c < 32; c++)
|
||||
{
|
||||
int d = cd->cbits[c+cbit_space];
|
||||
if (c == 1) d &= ~0x08;
|
||||
start_bits[c] |= ~d;
|
||||
}
|
||||
set_nottype_bits(start_bits, cbit_space, table_limit, cd);
|
||||
start_bits[1] |= 0x08;
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
/* The cbit_space table has vertical tab as whitespace; we have to
|
||||
discard it. */
|
||||
not set it from the table. */
|
||||
|
||||
case OP_WHITESPACE:
|
||||
for (c = 0; c < 32; c++)
|
||||
{
|
||||
int d = cd->cbits[c+cbit_space];
|
||||
if (c == 1) d &= ~0x08;
|
||||
start_bits[c] |= d;
|
||||
}
|
||||
c = start_bits[1]; /* Save in case it was already set */
|
||||
set_type_bits(start_bits, cbit_space, table_limit, cd);
|
||||
start_bits[1] = (start_bits[1] & ~0x08) | c;
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
case OP_NOT_WORDCHAR:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= ~cd->cbits[c+cbit_word];
|
||||
set_nottype_bits(start_bits, cbit_word, table_limit, cd);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
case OP_WORDCHAR:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= cd->cbits[c+cbit_word];
|
||||
set_type_bits(start_bits, cbit_word, table_limit, cd);
|
||||
try_next = FALSE;
|
||||
break;
|
||||
|
||||
@@ -699,6 +823,7 @@ do
|
||||
|
||||
case OP_TYPEPLUS:
|
||||
case OP_TYPEMINPLUS:
|
||||
case OP_TYPEPOSPLUS:
|
||||
tcode++;
|
||||
break;
|
||||
|
||||
@@ -722,52 +847,69 @@ do
|
||||
case OP_TYPEPOSQUERY:
|
||||
switch(tcode[1])
|
||||
{
|
||||
default:
|
||||
case OP_ANY:
|
||||
case OP_ALLANY:
|
||||
return SSB_FAIL;
|
||||
|
||||
case OP_HSPACE:
|
||||
SET_BIT(0x09);
|
||||
SET_BIT(0x20);
|
||||
if (utf8)
|
||||
{
|
||||
SET_BIT(0xC2); /* For U+00A0 */
|
||||
SET_BIT(0xE1); /* For U+1680, U+180E */
|
||||
SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */
|
||||
SET_BIT(0xE3); /* For U+3000 */
|
||||
}
|
||||
else SET_BIT(0xA0);
|
||||
break;
|
||||
|
||||
case OP_ANYNL:
|
||||
case OP_VSPACE:
|
||||
SET_BIT(0x0A);
|
||||
SET_BIT(0x0B);
|
||||
SET_BIT(0x0C);
|
||||
SET_BIT(0x0D);
|
||||
if (utf8)
|
||||
{
|
||||
SET_BIT(0xC2); /* For U+0085 */
|
||||
SET_BIT(0xE2); /* For U+2028, U+2029 */
|
||||
}
|
||||
else SET_BIT(0x85);
|
||||
break;
|
||||
|
||||
case OP_NOT_DIGIT:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= ~cd->cbits[c+cbit_digit];
|
||||
set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
|
||||
break;
|
||||
|
||||
case OP_DIGIT:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= cd->cbits[c+cbit_digit];
|
||||
set_type_bits(start_bits, cbit_digit, table_limit, cd);
|
||||
break;
|
||||
|
||||
/* The cbit_space table has vertical tab as whitespace; we have to
|
||||
discard it. */
|
||||
ensure it gets set as not whitespace. */
|
||||
|
||||
case OP_NOT_WHITESPACE:
|
||||
for (c = 0; c < 32; c++)
|
||||
{
|
||||
int d = cd->cbits[c+cbit_space];
|
||||
if (c == 1) d &= ~0x08;
|
||||
start_bits[c] |= ~d;
|
||||
}
|
||||
set_nottype_bits(start_bits, cbit_space, table_limit, cd);
|
||||
start_bits[1] |= 0x08;
|
||||
break;
|
||||
|
||||
/* The cbit_space table has vertical tab as whitespace; we have to
|
||||
discard it. */
|
||||
avoid setting it. */
|
||||
|
||||
case OP_WHITESPACE:
|
||||
for (c = 0; c < 32; c++)
|
||||
{
|
||||
int d = cd->cbits[c+cbit_space];
|
||||
if (c == 1) d &= ~0x08;
|
||||
start_bits[c] |= d;
|
||||
}
|
||||
c = start_bits[1]; /* Save in case it was already set */
|
||||
set_type_bits(start_bits, cbit_space, table_limit, cd);
|
||||
start_bits[1] = (start_bits[1] & ~0x08) | c;
|
||||
break;
|
||||
|
||||
case OP_NOT_WORDCHAR:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= ~cd->cbits[c+cbit_word];
|
||||
set_nottype_bits(start_bits, cbit_word, table_limit, cd);
|
||||
break;
|
||||
|
||||
case OP_WORDCHAR:
|
||||
for (c = 0; c < 32; c++)
|
||||
start_bits[c] |= cd->cbits[c+cbit_word];
|
||||
set_type_bits(start_bits, cbit_word, table_limit, cd);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
22
harbour/external/pcre/pcretabs.c
vendored
22
harbour/external/pcre/pcretabs.c
vendored
@@ -243,6 +243,10 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
|
||||
#define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0"
|
||||
#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0"
|
||||
#define STRING_Vai0 STR_V STR_a STR_i "\0"
|
||||
#define STRING_Xan0 STR_X STR_a STR_n "\0"
|
||||
#define STRING_Xps0 STR_X STR_p STR_s "\0"
|
||||
#define STRING_Xsp0 STR_X STR_s STR_p "\0"
|
||||
#define STRING_Xwd0 STR_X STR_w STR_d "\0"
|
||||
#define STRING_Yi0 STR_Y STR_i "\0"
|
||||
#define STRING_Z0 STR_Z "\0"
|
||||
#define STRING_Zl0 STR_Z STR_l "\0"
|
||||
@@ -376,6 +380,10 @@ const char _pcre_utt_names[] =
|
||||
STRING_Tifinagh0
|
||||
STRING_Ugaritic0
|
||||
STRING_Vai0
|
||||
STRING_Xan0
|
||||
STRING_Xps0
|
||||
STRING_Xsp0
|
||||
STRING_Xwd0
|
||||
STRING_Yi0
|
||||
STRING_Z0
|
||||
STRING_Zl0
|
||||
@@ -509,11 +517,15 @@ const ucp_type_table _pcre_utt[] = {
|
||||
{ 891, PT_SC, ucp_Tifinagh },
|
||||
{ 900, PT_SC, ucp_Ugaritic },
|
||||
{ 909, PT_SC, ucp_Vai },
|
||||
{ 913, PT_SC, ucp_Yi },
|
||||
{ 916, PT_GC, ucp_Z },
|
||||
{ 918, PT_PC, ucp_Zl },
|
||||
{ 921, PT_PC, ucp_Zp },
|
||||
{ 924, PT_PC, ucp_Zs }
|
||||
{ 913, PT_ALNUM, 0 },
|
||||
{ 917, PT_PXSPACE, 0 },
|
||||
{ 921, PT_SPACE, 0 },
|
||||
{ 925, PT_WORD, 0 },
|
||||
{ 929, PT_SC, ucp_Yi },
|
||||
{ 932, PT_GC, ucp_Z },
|
||||
{ 934, PT_PC, ucp_Zl },
|
||||
{ 937, PT_PC, ucp_Zp },
|
||||
{ 940, PT_PC, ucp_Zs }
|
||||
};
|
||||
|
||||
const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table);
|
||||
|
||||
36
harbour/external/pcre/pcrexcls.c
vendored
36
harbour/external/pcre/pcrexcls.c
vendored
@@ -6,7 +6,7 @@
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2009 University of Cambridge
|
||||
Copyright (c) 1997-2010 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -112,12 +112,13 @@ while ((t = *data++) != XCL_END)
|
||||
break;
|
||||
|
||||
case PT_LAMP:
|
||||
if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || prop->chartype == ucp_Lt) ==
|
||||
(t == XCL_PROP)) return !negated;
|
||||
if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll ||
|
||||
prop->chartype == ucp_Lt) == (t == XCL_PROP)) return !negated;
|
||||
break;
|
||||
|
||||
case PT_GC:
|
||||
if ((data[1] == _pcre_ucp_gentype[prop->chartype]) == (t == XCL_PROP)) return !negated;
|
||||
if ((data[1] == _pcre_ucp_gentype[prop->chartype]) == (t == XCL_PROP))
|
||||
return !negated;
|
||||
break;
|
||||
|
||||
case PT_PC:
|
||||
@@ -128,6 +129,33 @@ while ((t = *data++) != XCL_END)
|
||||
if ((data[1] == prop->script) == (t == XCL_PROP)) return !negated;
|
||||
break;
|
||||
|
||||
case PT_ALNUM:
|
||||
if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N) == (t == XCL_PROP))
|
||||
return !negated;
|
||||
break;
|
||||
|
||||
case PT_SPACE: /* Perl space */
|
||||
if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR)
|
||||
== (t == XCL_PROP))
|
||||
return !negated;
|
||||
break;
|
||||
|
||||
case PT_PXSPACE: /* POSIX space */
|
||||
if ((_pcre_ucp_gentype[prop->chartype] == ucp_Z ||
|
||||
c == CHAR_HT || c == CHAR_NL || c == CHAR_VT ||
|
||||
c == CHAR_FF || c == CHAR_CR) == (t == XCL_PROP))
|
||||
return !negated;
|
||||
break;
|
||||
|
||||
case PT_WORD:
|
||||
if ((_pcre_ucp_gentype[prop->chartype] == ucp_L ||
|
||||
_pcre_ucp_gentype[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE)
|
||||
== (t == XCL_PROP))
|
||||
return !negated;
|
||||
break;
|
||||
|
||||
/* This should never occur, but compilers may mutter if there is no
|
||||
default. */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user