diff options
Diffstat (limited to 'ext/pcre/pcrelib/pcreposix.c')
-rw-r--r-- | ext/pcre/pcrelib/pcreposix.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/ext/pcre/pcrelib/pcreposix.c b/ext/pcre/pcrelib/pcreposix.c index 31c7a31ab3..53ea6c7231 100644 --- a/ext/pcre/pcrelib/pcreposix.c +++ b/ext/pcre/pcrelib/pcreposix.c @@ -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-2006 University of Cambridge + Copyright (c) 1997-2008 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -42,10 +42,22 @@ POSSIBILITY OF SUCH DAMAGE. functions. */ +#include "config.h" + + +/* Ensure that the PCREPOSIX_EXP_xxx macros are set appropriately for +compiling these functions. This must come before including pcreposix.h, where +they are set for an application (using these functions) if they have not +previously been set. */ + +#if defined(_WIN32) && !defined(PCRE_STATIC) +# define PCREPOSIX_EXP_DECL extern __declspec(dllexport) +# define PCREPOSIX_EXP_DEFN __declspec(dllexport) +#endif + +#include "pcre.h" #include "pcre_internal.h" #include "pcreposix.h" -#include "stdlib.h" - /* Table to translate PCRE compile time error codes into POSIX error codes. */ @@ -80,7 +92,7 @@ static const int eint[] = { REG_BADPAT, /* malformed number or name after (?( */ REG_BADPAT, /* conditional group contains more than two branches */ REG_BADPAT, /* assertion expected after (?( */ - REG_BADPAT, /* (?R or (?digits must be followed by ) */ + REG_BADPAT, /* (?R or (?[+-]digits must be followed by ) */ REG_ECTYPE, /* unknown POSIX class name */ REG_BADPAT, /* POSIX collating elements are not supported */ REG_INVARG, /* this version of PCRE is not compiled with PCRE_UTF8 support */ @@ -108,7 +120,12 @@ static const int eint[] = { REG_BADPAT, /* DEFINE group contains more than one branch */ REG_BADPAT, /* repeating a DEFINE group is not allowed */ REG_INVARG, /* inconsistent NEWLINE options */ - REG_BADPAT /* \g is not followed followed by an (optionally braced) non-zero number */ + REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ + REG_BADPAT, /* (?+ or (?- must be followed by a non-zero number */ + REG_BADPAT, /* number is too big */ + REG_BADPAT, /* subpattern name expected */ + REG_BADPAT, /* digit expected after (?+ */ + REG_BADPAT /* ] is an invalid data character in JavaScript compatibility mode */ }; /* Table of texts corresponding to POSIX error codes */ @@ -141,7 +158,7 @@ static const char *const pstring[] = { * Translate error code to string * *************************************************/ -PCRE_DATA_SCOPE size_t +PCREPOSIX_EXP_DEFN size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) { const char *message, *addmessage; @@ -176,7 +193,7 @@ return length + addlength; * Free store held by a regex * *************************************************/ -PCRE_DATA_SCOPE void +PCREPOSIX_EXP_DEFN void regfree(regex_t *preg) { (pcre_free)(preg->re_pcre); @@ -199,7 +216,7 @@ Returns: 0 on success various non-zero codes on failure */ -PCRE_DATA_SCOPE int +PCREPOSIX_EXP_DEFN int regcomp(regex_t *preg, const char *pattern, int cflags) { const char *errorptr; @@ -241,11 +258,11 @@ If REG_NOSUB was specified at compile time, the PCRE_NO_AUTO_CAPTURE flag will be set. When this is the case, the nmatch and pmatch arguments are ignored, and the only result is yes/no/error. */ -PCRE_DATA_SCOPE int +PCREPOSIX_EXP_DEFN int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { -int rc; +int rc, so, eo; int options = 0; int *ovector = NULL; int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; @@ -278,7 +295,23 @@ else if (nmatch > 0) } } -rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string), +/* REG_STARTEND is a BSD extension, to allow for non-NUL-terminated strings. +The man page from OS X says "REG_STARTEND affects only the location of the +string, not how it is matched". That is why the "so" value is used to bump the +start location rather than being passed as a PCRE "starting offset". */ + +if ((eflags & REG_STARTEND) != 0) + { + so = pmatch[0].rm_so; + eo = pmatch[0].rm_eo; + } +else + { + so = 0; + eo = strlen(string); + } + +rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string + so, (eo - so), 0, options, ovector, nmatch * 3); if (rc == 0) rc = nmatch; /* All captured slots were filled in */ |