util_pcre.c revision ac45a43afbf38aa4a91c1402c6beef6ef8a2696d
842ae4bd224140319ae7feec1872b93dfd491143fielding/*************************************************
842ae4bd224140319ae7feec1872b93dfd491143fielding* Perl-Compatible Regular Expressions *
842ae4bd224140319ae7feec1872b93dfd491143fielding*************************************************/
842ae4bd224140319ae7feec1872b93dfd491143fielding
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.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndThis module is a wrapper that provides a POSIX API to the underlying PCRE
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndfunctions.
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcndWritten by: Philip Hazel <ph10@cam.ac.uk>
ce9621257ef9e54c1bbe5ad8a5f445a1f211c2dcnd
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding Copyright (c) 1997-2004 University of Cambridge
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh-----------------------------------------------------------------------------
e8f95a682820a599fe41b22977010636be5c2717jimRedistribution and use in source and binary forms, with or without
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianhmodification, are permitted provided that the following conditions are met:
9d129b55f5a43abf43865c6b0eb6dd19bc22aba8ianh
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding * Redistributions of source code must retain the above copyright notice,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding this list of conditions and the following disclaimer.
1b21d7b3d97def358b2e923655edeb16613a1c31gstein
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
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.
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
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-----------------------------------------------------------------------------
7184de27ec1d62a83c41cdeac0953ca9fd661e8csf*/
36ef8f77bffe75d1aa327882be1b5bdbe2ff567asf
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#include "httpd.h"
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#include "apr_strings.h"
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#include "pcre.h"
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#define APR_WANT_STRFUNC
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#include "apr_want.h"
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#ifndef POSIX_MALLOC_THRESHOLD
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#define POSIX_MALLOC_THRESHOLD (10)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#endif
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
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. */
785be1b6298010956622771c870ab3cd8ca57a2faaron
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingstatic const char *const pstring[] = {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "", /* Dummy for value 0 */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "internal error", /* AP_REG_ASSERT */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "failed to get memory", /* AP_REG_ESPACE */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "bad argument", /* AP_REG_INVARG */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "match failed" /* AP_REG_NOMATCH */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding};
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
785be1b6298010956622771c870ab3cd8ca57a2faaronAP_DECLARE(apr_size_t) ap_regerror(int errcode, const ap_regex_t *preg,
785be1b6298010956622771c870ab3cd8ca57a2faaron char *errbuf, apr_size_t errbuf_size)
785be1b6298010956622771c870ab3cd8ca57a2faaron{
785be1b6298010956622771c870ab3cd8ca57a2faaronconst char *message, *addmessage;
785be1b6298010956622771c870ab3cd8ca57a2faaronapr_size_t length, addlength;
785be1b6298010956622771c870ab3cd8ca57a2faaron
7697b1b7376a532163c621e050b70c90dcb15d66covenermessage = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
7697b1b7376a532163c621e050b70c90dcb15d66covener "unknown error code" : pstring[errcode];
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldinglength = strlen(message) + 1;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
f4b96a996afbc46872f57ad1450e6ee1c8f13707jortonaddmessage = " at offset ";
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingaddlength = (preg != NULL && (int)preg->re_erroffset != -1)?
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding strlen(addmessage) + 6 : 0;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingif (errbuf_size > 0)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding {
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding if (addlength > 0 && errbuf_size >= length + addlength)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_snprintf(errbuf, sizeof errbuf,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding else
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_cpystrn(errbuf, message, errbuf_size);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding }
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingreturn length + addlength;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding}
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding* Free store held by a regex *
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding*************************************************/
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier
e08076ca56e6cb68b30846b9e9339061058aae6dpoirierAP_DECLARE(void) ap_regfree(ap_regex_t *preg)
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier{
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier(pcre_free)(preg->re_pcre);
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier}
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding* Compile a regular expression *
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding*************************************************/
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingArguments:
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding preg points to a structure for recording the compiled expression
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding pattern the pattern to compile
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding cflags compilation flags
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingReturns: 0 on success
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding various non-zero codes on failure
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding*/
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingAP_DECLARE(int) ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags)
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding{
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingconst char *errorptr;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingint erroffset;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingint options = 0;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
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;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingpreg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingpreg->re_erroffset = erroffset;
e08076ca56e6cb68b30846b9e9339061058aae6dpoirier
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingif (preg->re_pcre == NULL) return AP_REG_INVARG;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingpreg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingreturn 0;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding}
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/*************************************************
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm* Match a regular expression *
e8f95a682820a599fe41b22977010636be5c2717jim*************************************************/
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick
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. */
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick
8a261a9f7d18d1e862d63f68e93f288d3e1f0d94trawickAP_DECLARE(int) ap_regexec(const ap_regex_t *preg, const char *string,
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding apr_size_t nmatch, ap_regmatch_t pmatch[],
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick int eflags)
785be1b6298010956622771c870ab3cd8ca57a2faaron{
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingint rc;
3c290fd0361d6d9d84d97725eaf299456bddd6cfsfint options = 0;
3c290fd0361d6d9d84d97725eaf299456bddd6cfsfint *ovector = NULL;
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickint small_ovector[POSIX_MALLOC_THRESHOLD * 3];
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesint allocated_ovector = 0;
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesif ((eflags & AP_REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesif ((eflags & AP_REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames((ap_regex_t *)preg)->re_erroffset = (apr_size_t)(-1); /* Only has meaning after compile */
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregamesif (nmatch > 0)
e160b861b50a3a8dcc013b8cd3ef849fe777e52fgregames {
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick if (nmatch <= POSIX_MALLOC_THRESHOLD)
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick {
560f6ac786d611b858b2bad932713d9e971f0716trawick ovector = &(small_ovector[0]);
560f6ac786d611b858b2bad932713d9e971f0716trawick }
560f6ac786d611b858b2bad932713d9e971f0716trawick else
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick {
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick ovector = (int *)malloc(sizeof(int) * nmatch * 3);
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick if (ovector == NULL) return AP_REG_ESPACE;
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp allocated_ovector = 1;
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp }
7bf77d70b6830636bc36e6b76a228c301be23ff7brianp }
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickrc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string),
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick 0, options, ovector, nmatch * 3);
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawickif (rc == 0) rc = nmatch; /* All captured slots were filled in */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fieldingif (rc >= 0)
7697b1b7376a532163c621e050b70c90dcb15d66covener {
39b76a07959a0a332366c735a23894d9e8ed6872trawick apr_size_t i;
de00ec7378227d05be63ecd2053ebbb01b940023jorton for (i = 0; i < (apr_size_t)rc; i++)
f3aa436e29aa30e29695a18b7f469dd66b39b7e4jorton {
de00ec7378227d05be63ecd2053ebbb01b940023jorton pmatch[i].rm_so = ovector[i*2];
de00ec7378227d05be63ecd2053ebbb01b940023jorton pmatch[i].rm_eo = ovector[i*2+1];
785be1b6298010956622771c870ab3cd8ca57a2faaron }
785be1b6298010956622771c870ab3cd8ca57a2faaron if (allocated_ovector) free(ovector);
066877f1a045103acfdd376d48cdd473c33f409bdougm for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
8a261a9f7d18d1e862d63f68e93f288d3e1f0d94trawick return 0;
6b38fca3ec543a0f72efd5683e91a0b30fc752d1trawick }
f3aa436e29aa30e29695a18b7f469dd66b39b7e4jorton
74b39333600dee3260355ad3a06e36ef6c61c8f1dreidelse
74b39333600dee3260355ad3a06e36ef6c61c8f1dreid {
74b39333600dee3260355ad3a06e36ef6c61c8f1dreid if (allocated_ovector) free(ovector);
74b39333600dee3260355ad3a06e36ef6c61c8f1dreid switch(rc)
97c78987224dcd037076d393aad1867c26b2c8cftrawick {
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_NOMATCH: return AP_REG_NOMATCH;
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_NULL: return AP_REG_INVARG;
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_BADOPTION: return AP_REG_INVARG;
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_BADMAGIC: return AP_REG_INVARG;
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_UNKNOWN_NODE: return AP_REG_ASSERT;
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_NOMEMORY: return AP_REG_ESPACE;
97c78987224dcd037076d393aad1867c26b2c8cftrawick#ifdef PCRE_ERROR_MATCHLIMIT
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_MATCHLIMIT: return AP_REG_ESPACE;
97c78987224dcd037076d393aad1867c26b2c8cftrawick#endif
97c78987224dcd037076d393aad1867c26b2c8cftrawick#ifdef PCRE_ERROR_BADUTF8
97c78987224dcd037076d393aad1867c26b2c8cftrawick case PCRE_ERROR_BADUTF8: return AP_REG_INVARG;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#endif
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#ifdef PCRE_ERROR_BADUTF8_OFFSET
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG;
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding#endif
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding default: return AP_REG_ASSERT;
785be1b6298010956622771c870ab3cd8ca57a2faaron }
785be1b6298010956622771c870ab3cd8ca57a2faaron }
785be1b6298010956622771c870ab3cd8ca57a2faaron}
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding/* End of pcreposix.c */
09fe0b69d3d1e8c8041c9ce99ee77b8b44b5e3b1fielding