util_pcre.c revision ac45a43afbf38aa4a91c1402c6beef6ef8a2696d
842ae4bd224140319ae7feec1872b93dfd491143fielding/*************************************************
842ae4bd224140319ae7feec1872b93dfd491143fielding* Perl-Compatible Regular Expressions *
842ae4bd224140319ae7feec1872b93dfd491143fielding*************************************************/
842ae4bd224140319ae7feec1872b93dfd491143fieldingThis is a library of functions to support regular expressions whose syntax
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingand semantics are as close as possible to those of the Perl 5 language. See
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndthe file Tech.Notes for some information on the internals.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndThis module is a wrapper that provides a POSIX API to the underlying PCRE
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndWritten by: Philip Hazel <ph10@cam.ac.uk>
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding Copyright (c) 1997-2004 University of Cambridge
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh-----------------------------------------------------------------------------
e8f95a682820a599fe41b22977010636be5c2717jimRedistribution and use in source and binary forms, with or without
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianhmodification, are permitted provided that the following conditions are met:
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * Redistributions of source code must retain the above copyright notice,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding this list of conditions and the following disclaimer.
1b21d7b3d97def358b2e923655edeb16613a1c31gstein * Redistributions in binary form must reproduce the above copyright
1b21d7b3d97def358b2e923655edeb16613a1c31gstein notice, this list of conditions and the following disclaimer in the
1b21d7b3d97def358b2e923655edeb16613a1c31gstein documentation and/or other materials provided with the distribution.
1b21d7b3d97def358b2e923655edeb16613a1c31gstein * Neither the name of the University of Cambridge nor the names of its
1b21d7b3d97def358b2e923655edeb16613a1c31gstein contributors may be used to endorse or promote products derived from
2d71630471d1c23f0137309e3c3957c633ecbfd6rbb this software without specific prior written permission.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
51af95bb51b5084e883bad250b2afa2838e9ceebfieldingLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
d4f1d9c1ff112a8ab9bee31f196973761329b236rbbCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
7fae9cc4639013f3c04c085547256c68814aee8ftrawickSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
7fae9cc4639013f3c04c085547256c68814aee8ftrawickINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
7fae9cc4639013f3c04c085547256c68814aee8ftrawickCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
7fae9cc4639013f3c04c085547256c68814aee8ftrawickARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
7184de27ec1d62a83c41cdeac0953ca9fd661e8csfPOSSIBILITY OF SUCH DAMAGE.
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf-----------------------------------------------------------------------------
785be1b6298010956622771c870ab3cd8ca57a2faaron/* Table of error strings corresponding to POSIX error codes; must be
785be1b6298010956622771c870ab3cd8ca57a2faaron * kept in synch with include/ap_regex.h's AP_REG_E* definitions. */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingstatic const char *const pstring[] = {
785be1b6298010956622771c870ab3cd8ca57a2faaronAP_DECLARE(apr_size_t) ap_regerror(int errcode, const ap_regex_t *preg,
7697b1b7376a532163c621e050b70c90dcb15d66covenermessage = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingaddlength = (preg != NULL && (int)preg->re_erroffset != -1)?
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (addlength > 0 && errbuf_size >= length + addlength)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding* Free store held by a regex *
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding*************************************************/
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding* Compile a regular expression *
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding*************************************************/
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding preg points to a structure for recording the compiled expression
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding pattern the pattern to compile
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding cflags compilation flags
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingReturns: 0 on success
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding various non-zero codes on failure
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(int) ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingif ((cflags & AP_REG_ICASE) != 0) options |= PCRE_CASELESS;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingif ((cflags & AP_REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
45acd673a68181802b112e97e84fa3813ddd3ec1stoddardif ((cflags & AP_REG_DOTALL) != 0) options |= PCRE_DOTALL;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingpreg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingpreg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm* Match a regular expression *
e8f95a682820a599fe41b22977010636be5c2717jim*************************************************/
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/* Unfortunately, PCRE requires 3 ints of working space for each captured
8a261a9f7d18d1e862d63f68e93f288d3e1f0d94trawicksubstring, so we have to get and release working store instead of just using
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingthe POSIX structures as was done in earlier releases when PCRE needed only 2
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickints. However, if the number of possible capturing brackets is small, use a
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickblock of store on the stack, to reduce the use of malloc/free. The threshold is
58fd79b56eb624bf011772994e9761d3c2e228c1orlikowskiin a macro that can be changed at configure time. */
8a261a9f7d18d1e862d63f68e93f288d3e1f0d94trawickAP_DECLARE(int) ap_regexec(const ap_regex_t *preg, const char *string,
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesif ((eflags & AP_REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesif ((eflags & AP_REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames((ap_regex_t *)preg)->re_erroffset = (apr_size_t)(-1); /* Only has meaning after compile */
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickrc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string),
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickif (rc == 0) rc = nmatch; /* All captured slots were filled in */
066877f1a045103acfdd376d48cdd473c33f409bdougm for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding default: return AP_REG_ASSERT;