No objections to going ahead with this?
On Thu, Jan 27, 2005 at 03:01:56PM +0000, Joe Orton wrote:
> There are two problems with the use of PCRE in httpd: firstly that there
> is no support for use of an external pcre library (PR27750), and
> secondly that use of the pcreposix.h interface can cause namespace
> collisions with the real POSIX regex API (PR26088, but this is triggered
> when trying to solve 27750).
>
> Attached is a patch which addresses the latter issue and prepares for
> the use of an external PCRE, based on the patches by Andres Solomon in
> 27750: implementing the pcreposix.c wrapper inside the ap_ namespace, by
> doing:
>
> 1. rename pcreposix.h to ap_regex.h (to avoid collisions with any
> external pcre), and copy srclib/pcre/pcreposix.c to server/util_pcre.c
> 2. rename REG_* constants to AP_REG_*, regex_t->ap_regex_t,
> regmatch_t->ap_regmatch_t, and ap_* prefix the reg* functions
>
> Because the error handling in the PCRE-based regcomp() relies on a
> non-public PCRE interface for mapping error strings to codes, this is
> dropped; if ap_regcomp() fails, no specific error code is provided, just
> REG_INVARG aka "invalid argument". (the regcomp error code is not used
> anywhere in httpd so no real difference; this could be improved later)
>
> Two diffs attached: firstly to implement all the above; secondly to
> update the rest of the tree to use the new API, you'll need to do
>
> $ cp srclib/pcre/pcreposix.c server/util_pcre.c
> $ cp include/pcreposix.h include/ap_regex.h
>
> to apply the svn diff to a trunk checkout.
>
> joe
> Index: configure.in
> ===================================================================
> --- configure.in (revision 126611)
> +++ configure.in (working copy)
> @@ -512,6 +512,7 @@
>
> dnl AP_LIBS specifies the actual libraries. note we have some required libs.
> AP_LIBS="$abs_builddir/srclib/pcre/libpcre.la $AP_LIBS"
> +APR_ADDTO(CPPFLAGS, [-I$abs_builddir/srclib/pcre])
>
> dnl APR should go after the other libs, so the right symbols can be picked up
> AP_LIBS="$AP_LIBS `$apu_config --link-libtool --libs` `$apr_config
> --link-libtool --libs`"
> Index: include/ap_mmn.h
> ===================================================================
> --- include/ap_mmn.h (revision 126611)
> +++ include/ap_mmn.h (working copy)
> @@ -85,6 +85,8 @@
> * ap_setup_prelinked_modules,
> ap_process_resource_config
> * 20040425.1 (2.1.0-dev) Added ap_module_symbol_t and
> ap_prelinked_module_symbols
> * 20050101.0 (2.1.2-dev) Axed misnamed http_method for http_scheme (which
> it was!)
> + * 20050127.0 (2.1.3-dev) renamed regex_t->ap_regex_t,
> regmatch_t->ap_regmatch_t,
> + * REG_*->AP_REG_*, removed reg* in place of ap_reg*
> */
>
> #define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */
> Index: include/ap_regex.h
> ===================================================================
> --- include/ap_regex.h (revision 126601)
> +++ include/ap_regex.h (working copy)
> @@ -52,37 +52,24 @@
>
> /* Options defined by POSIX. */
>
> -#define REG_ICASE 0x01
> -#define REG_NEWLINE 0x02
> -#define REG_NOTBOL 0x04
> -#define REG_NOTEOL 0x08
> +#define AP_REG_ICASE 0x01
> +#define AP_REG_NEWLINE 0x02
> +#define AP_REG_NOTBOL 0x04
> +#define AP_REG_NOTEOL 0x08
>
> /* These are not used by PCRE, but by defining them we make it easier
> to slot PCRE into existing programs that make POSIX calls. */
>
> -#define REG_EXTENDED 0
> -#define REG_NOSUB 0
> +#define AP_REG_EXTENDED 0
> +#define AP_REG_NOSUB 0
>
> /* Error values. Not all these are relevant or used by the wrapper. */
>
> enum {
> - REG_ASSERT = 1, /* internal error ? */
> - REG_BADBR, /* invalid repeat counts in {} */
> - REG_BADPAT, /* pattern error */
> - REG_BADRPT, /* ? * + invalid */
> - REG_EBRACE, /* unbalanced {} */
> - REG_EBRACK, /* unbalanced [] */
> - REG_ECOLLATE, /* collation error - not relevant */
> - REG_ECTYPE, /* bad class */
> - REG_EESCAPE, /* bad escape sequence */
> - REG_EMPTY, /* empty expression */
> - REG_EPAREN, /* unbalanced () */
> - REG_ERANGE, /* bad range inside [] */
> - REG_ESIZE, /* expression too big */
> - REG_ESPACE, /* failed to get memory */
> - REG_ESUBREG, /* bad back reference */
> - REG_INVARG, /* bad argument */
> - REG_NOMATCH /* match failed */
> + AP_REG_ASSERT = 1, /* internal error ? */
> + AP_REG_ESPACE, /* failed to get memory */
> + AP_REG_INVARG, /* bad argument */
> + AP_REG_NOMATCH /* match failed */
> };
>
>
> @@ -92,7 +79,7 @@
> void *re_pcre;
> size_t re_nsub;
> size_t re_erroffset;
> -} regex_t;
> +} ap_regex_t;
>
> /* The structure in which a captured offset is returned. */
>
> @@ -101,15 +88,46 @@
> typedef struct {
> regoff_t rm_so;
> regoff_t rm_eo;
> -} regmatch_t;
> +} ap_regmatch_t;
>
> +#ifndef AP_DECLARE
> +#define AP_DECLARE(x) x
> +#endif /* AP_DECLARE */
> +
> /* The functions */
>
> -extern int regcomp(regex_t *, const char *, int);
> -extern int regexec(const regex_t *, const char *, size_t, regmatch_t *, int);
> -extern size_t regerror(int, const regex_t *, char *, size_t);
> -extern void regfree(regex_t *);
> +AP_DECLARE(int) ap_regcomp(ap_regex_t *, const char *, int);
>
> +/**
> + * Match a null-terminated string against a pre-compiled regex.
> + * @param preg The pre-compiled regex
> + * @param string The string to match
> + * @param nmatch Provide information regarding the location of any matches
> + * @param pmatch Provide information regarding the location of any matches
> + * @param eflags Bitwise or of any of:
> + * @li #REG_NOTBOL - match-beginning-of-line operator always
> + * fails to match
> + * @li #REG_NOTEOL - match-end-of-line operator always fails to match
> + * @return 0 for successful match, #REG_NOMATCH otherwise
> + */
> +AP_DECLARE(int) ap_regexec(const ap_regex_t *preg, const char *string,
> + size_t nmatch, ap_regmatch_t *pmatch, int eflags);
> +
> +/**
> + * Return the error code returned by regcomp or regexec into error messages
> + * @param errcode the error code returned by regexec or regcomp
> + * @param preg The precompiled regex
> + * @param errbuf A buffer to store the error in
> + * @param errbuf_size The size of the buffer
> + */
> +AP_DECLARE(size_t) ap_regerror(int errcode, const ap_regex_t *preg,
> + char *errbuf, size_t errbuf_size);
> +
> +/** Destroy a pre-compiled regex.
> + * @param preg The pre-compiled regex to free.
> + */
> +AP_DECLARE(void) ap_regfree(ap_regex_t *preg);
> +
> #ifdef __cplusplus
> } /* extern "C" */
> #endif
> Index: include/http_core.h
> ===================================================================
> --- include/http_core.h (revision 126611)
> +++ include/http_core.h (working copy)
> @@ -488,7 +488,7 @@
>
> /* Access control */
> apr_array_header_t *sec_file;
> - regex_t *r;
> + ap_regex_t *r;
>
> const char *mime_type; /* forced with ForceType */
> const char *handler; /* forced with SetHandler */
> Index: include/httpd.h
> ===================================================================
> --- include/httpd.h (revision 126611)
> +++ include/httpd.h (working copy)
> @@ -41,7 +41,7 @@
>
> #include "os.h"
>
> -#include "pcreposix.h"
> +#include "ap_regex.h"
>
> /* Note: util_uri.h is also included, see below */
>
> @@ -1540,42 +1540,17 @@
> * @li #REG_NEWLINE - Match-any-character operators don't match new-line
> * @return The compiled regular expression
> */
> -AP_DECLARE(regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
> - int cflags);
> -
> +AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
> + int cflags);
> +
> /**
> * Free the memory associated with a compiled regular expression
> * @param p The pool the regex was allocated from
> * @param reg The regular expression to free
> */
> -AP_DECLARE(void) ap_pregfree(apr_pool_t *p, regex_t *reg);
> +AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg);
>
> /**
> - * Match a null-terminated string against a pre-compiled regex.
> - * @param preg The pre-compiled regex
> - * @param string The string to match
> - * @param nmatch Provide information regarding the location of any matches
> - * @param pmatch Provide information regarding the location of any matches
> - * @param eflags Bitwise or of any of:
> - * @li #REG_NOTBOL - match-beginning-of-line operator always
> - * fails to match
> - * @li #REG_NOTEOL - match-end-of-line operator always fails to match
> - * @return 0 for successful match, #REG_NOMATCH otherwise
> - */
> -AP_DECLARE(int) ap_regexec(regex_t *preg, const char *string,
> - size_t nmatch, regmatch_t pmatch[], int
> eflags);
> -
> -/**
> - * Return the error code returned by regcomp or regexec into error messages
> - * @param errcode the error code returned by regexec or regcomp
> - * @param preg The precompiled regex
> - * @param errbuf A buffer to store the error in
> - * @param errbuf_size The size of the buffer
> - */
> -AP_DECLARE(size_t) ap_regerror(int errcode, const regex_t *preg,
> - char *errbuf, size_t errbuf_size);
> -
> -/**
> * After performing a successful regex match, you may use this function to
> * perform a series of string substitutions based on subexpressions that were
> * matched during the call to ap_regexec
> @@ -1587,7 +1562,7 @@
> * @param pmatch the pmatch array returned from ap_pregex
> */
> AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char
> *source,
> - size_t nmatch, regmatch_t pmatch[]);
> + size_t nmatch, ap_regmatch_t pmatch[]);
>
> /**
> * We want to downcase the type/subtype for comparison purposes
> Index: include/pcreposix.h
> ===================================================================
> --- include/pcreposix.h (revision 126611)
> +++ include/pcreposix.h (working copy)
> @@ -1,117 +0,0 @@
> -/*************************************************
> -* Perl-Compatible Regular Expressions *
> -*************************************************/
> -
> -#ifndef _PCREPOSIX_H
> -#define _PCREPOSIX_H
> -
> -/* This is the header for the POSIX wrapper interface to the PCRE Perl-
> -Compatible Regular Expression library. It defines the things POSIX says
> should
> -be there. I hope.
> -
> - Copyright (c) 1997-2004 University of Cambridge
> -
> ------------------------------------------------------------------------------
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions are met:
> -
> - * Redistributions of source code must retain the above copyright notice,
> - this list of conditions and the following disclaimer.
> -
> - * Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -
> - * Neither the name of the University of Cambridge nor the names of its
> - contributors may be used to endorse or promote products derived from
> - this software without specific prior written permission.
> -
> -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
> -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
> -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> -POSSIBILITY OF SUCH DAMAGE.
> ------------------------------------------------------------------------------
> -*/
> -
> -/* Have to include stdlib.h in order to ensure that size_t is defined. */
> -
> -#include <stdlib.h>
> -
> -/* Allow for C++ users */
> -
> -#ifdef __cplusplus
> -extern "C" {
> -#endif
> -
> -/* Options defined by POSIX. */
> -
> -#define REG_ICASE 0x01
> -#define REG_NEWLINE 0x02
> -#define REG_NOTBOL 0x04
> -#define REG_NOTEOL 0x08
> -
> -/* These are not used by PCRE, but by defining them we make it easier
> -to slot PCRE into existing programs that make POSIX calls. */
> -
> -#define REG_EXTENDED 0
> -#define REG_NOSUB 0
> -
> -/* Error values. Not all these are relevant or used by the wrapper. */
> -
> -enum {
> - REG_ASSERT = 1, /* internal error ? */
> - REG_BADBR, /* invalid repeat counts in {} */
> - REG_BADPAT, /* pattern error */
> - REG_BADRPT, /* ? * + invalid */
> - REG_EBRACE, /* unbalanced {} */
> - REG_EBRACK, /* unbalanced [] */
> - REG_ECOLLATE, /* collation error - not relevant */
> - REG_ECTYPE, /* bad class */
> - REG_EESCAPE, /* bad escape sequence */
> - REG_EMPTY, /* empty expression */
> - REG_EPAREN, /* unbalanced () */
> - REG_ERANGE, /* bad range inside [] */
> - REG_ESIZE, /* expression too big */
> - REG_ESPACE, /* failed to get memory */
> - REG_ESUBREG, /* bad back reference */
> - REG_INVARG, /* bad argument */
> - REG_NOMATCH /* match failed */
> -};
> -
> -
> -/* The structure representing a compiled regular expression. */
> -
> -typedef struct {
> - void *re_pcre;
> - size_t re_nsub;
> - size_t re_erroffset;
> -} regex_t;
> -
> -/* The structure in which a captured offset is returned. */
> -
> -typedef int regoff_t;
> -
> -typedef struct {
> - regoff_t rm_so;
> - regoff_t rm_eo;
> -} regmatch_t;
> -
> -/* The functions */
> -
> -extern int regcomp(regex_t *, const char *, int);
> -extern int regexec(const regex_t *, const char *, size_t, regmatch_t *, int);
> -extern size_t regerror(int, const regex_t *, char *, size_t);
> -extern void regfree(regex_t *);
> -
> -#ifdef __cplusplus
> -} /* extern "C" */
> -#endif
> -
> -#endif /* End of pcreposix.h */
> Index: server/Makefile.in
> ===================================================================
> --- server/Makefile.in (revision 126611)
> +++ server/Makefile.in (working copy)
> @@ -12,7 +12,7 @@
> util_script.c util_md5.c util_cfgtree.c util_ebcdic.c util_time.c \
> connection.c listen.c \
> mpm_common.c util_charset.c util_debug.c util_xml.c \
> - util_filter.c exports.c buildmark.c \
> + util_filter.c util_pcre.c exports.c buildmark.c \
> scoreboard.c error_bucket.c protocol.c core.c request.c provider.c \
> eoc_bucket.c core_filters.c
>
> Index: server/util.c
> ===================================================================
> --- server/util.c (revision 126611)
> +++ server/util.c (working copy)
> @@ -246,25 +246,25 @@
> }
>
> /*
> - * Here's a pool-based interface to POSIX regex's regcomp().
> - * Note that we return regex_t instead of being passed one.
> - * The reason is that if you use an already-used regex_t structure,
> + * Here's a pool-based interface to the POSIX-esque ap_regcomp().
> + * Note that we return ap_regex_t instead of being passed one.
> + * The reason is that if you use an already-used ap_regex_t structure,
> * the memory that you've already allocated gets forgotten, and
> * regfree() doesn't clear it. So we don't allow it.
> */
>
> static apr_status_t regex_cleanup(void *preg)
> {
> - regfree((regex_t *) preg);
> + ap_regfree((ap_regex_t *) preg);
> return APR_SUCCESS;
> }
>
> -AP_DECLARE(regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
> - int cflags)
> +AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
> + int cflags)
> {
> - regex_t *preg = apr_palloc(p, sizeof(regex_t));
> + ap_regex_t *preg = apr_palloc(p, sizeof *preg);
>
> - if (regcomp(preg, pattern, cflags)) {
> + if (ap_regcomp(preg, pattern, cflags)) {
> return NULL;
> }
>
> @@ -274,9 +274,9 @@
> return preg;
> }
>
> -AP_DECLARE(void) ap_pregfree(apr_pool_t *p, regex_t * reg)
> +AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg)
> {
> - regfree(reg);
> + ap_regfree(reg);
> apr_pool_cleanup_kill(p, (void *) reg, regex_cleanup);
> }
>
> @@ -343,29 +343,10 @@
> return bigstring;
> }
>
> -/*
> - * Apache stub function for the regex libraries regexec() to make sure the
> - * whole regex(3) API is available through the Apache (exported) namespace.
> - * This is especially important for the DSO situations of modules.
> - * DO NOT MAKE A MACRO OUT OF THIS FUNCTION!
> - */
> -AP_DECLARE(int) ap_regexec(regex_t *preg, const char *string,
> - size_t nmatch, regmatch_t pmatch[], int eflags)
> -{
> - return regexec(preg, string, nmatch, pmatch, eflags);
> -}
> -
> -AP_DECLARE(size_t) ap_regerror(int errcode, const regex_t *preg, char
> *errbuf,
> - size_t errbuf_size)
> -{
> - return regerror(errcode, preg, errbuf, errbuf_size);
> -}
> -
> -
> /* This function substitutes for $0-$9, filling in regular expression
> * submatches. Pass it the same nmatch and pmatch arguments that you
> * passed ap_regexec(). pmatch should not be greater than the maximum number
> - * of subexpressions - i.e. one more than the re_nsub member of regex_t.
> + * of subexpressions - i.e. one more than the re_nsub member of ap_regex_t.
> *
> * input should be the string with the $-expressions, source should be the
> * string that was matched against.
> @@ -378,7 +359,7 @@
>
> AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input,
> const char *source, size_t nmatch,
> - regmatch_t pmatch[])
> + ap_regmatch_t pmatch[])
> {
> const char *src = input;
> char *dest, *dst;
> Index: server/util_pcre.c
> ===================================================================
> --- server/util_pcre.c (revision 126601)
> +++ server/util_pcre.c (working copy)
> @@ -43,122 +43,29 @@
> -----------------------------------------------------------------------------
> */
>
> -#include "internal.h"
> -#include "pcreposix.h"
> -#include "stdlib.h"
> +#include <stdlib.h>
>
> +#include "ap_regex.h"
> +#include "pcre.h"
>
> +#ifndef POSIX_MALLOC_THRESHOLD
> +#define POSIX_MALLOC_THRESHOLD (10)
> +#endif
>
> -/* Corresponding tables of PCRE error messages and POSIX error codes. */
> +/* Table of error strings corresponding to POSIX error codes; must be
> + * kept in synch with include/ap_regex.h's AP_REG_E* definitions. */
>
> -static const char *const estring[] = {
> - ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10,
> - ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,
> - ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,
> - ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40,
> - ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 };
> -
> -static const int eint[] = {
> - REG_EESCAPE, /* "\\ at end of pattern" */
> - REG_EESCAPE, /* "\\c at end of pattern" */
> - REG_EESCAPE, /* "unrecognized character follows \\" */
> - REG_BADBR, /* "numbers out of order in {} quantifier" */
> - REG_BADBR, /* "number too big in {} quantifier" */
> - REG_EBRACK, /* "missing terminating ] for character class" */
> - REG_ECTYPE, /* "invalid escape sequence in character class" */
> - REG_ERANGE, /* "range out of order in character class" */
> - REG_BADRPT, /* "nothing to repeat" */
> - REG_BADRPT, /* "operand of unlimited repeat could match the empty string"
> */
> - REG_ASSERT, /* "internal error: unexpected repeat" */
> - REG_BADPAT, /* "unrecognized character after (?" */
> - REG_BADPAT, /* "POSIX named classes are supported only within a class" */
> - REG_EPAREN, /* "missing )" */
> - REG_ESUBREG, /* "reference to non-existent subpattern" */
> - REG_INVARG, /* "erroffset passed as NULL" */
> - REG_INVARG, /* "unknown option bit(s) set" */
> - REG_EPAREN, /* "missing ) after comment" */
> - REG_ESIZE, /* "parentheses nested too deeply" */
> - REG_ESIZE, /* "regular expression too large" */
> - REG_ESPACE, /* "failed to get memory" */
> - REG_EPAREN, /* "unmatched brackets" */
> - REG_ASSERT, /* "internal error: code overflow" */
> - REG_BADPAT, /* "unrecognized character after (?<" */
> - REG_BADPAT, /* "lookbehind assertion is not fixed length" */
> - REG_BADPAT, /* "malformed number after (?(" */
> - REG_BADPAT, /* "conditional group containe more than two branches" */
> - REG_BADPAT, /* "assertion expected after (?(" */
> - 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" */
> - REG_BADPAT, /* "spare error" */
> - REG_BADPAT, /* "character value in \x{...} sequence is too large" */
> - REG_BADPAT, /* "invalid condition (?(0)" */
> - REG_BADPAT, /* "\\C not allowed in lookbehind assertion" */
> - REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\U, or \\u" */
> - REG_BADPAT, /* "number after (?C is > 255" */
> - REG_BADPAT, /* "closing ) for (?C expected" */
> - REG_BADPAT, /* "recursive call could loop indefinitely" */
> - REG_BADPAT, /* "unrecognized character after (?P" */
> - REG_BADPAT, /* "syntax error after (?P" */
> - REG_BADPAT, /* "two named groups have the same name" */
> - REG_BADPAT, /* "invalid UTF-8 string" */
> - REG_BADPAT, /* "support for \\P, \\p, and \\X has not been compiled" */
> - REG_BADPAT, /* "malformed \\P or \\p sequence" */
> - REG_BADPAT /* "unknown property name after \\P or \\p" */
> -};
> -
> -/* Table of texts corresponding to POSIX error codes */
> -
> static const char *const pstring[] = {
> "", /* Dummy for value 0 */
> - "internal error", /* REG_ASSERT */
> - "invalid repeat counts in {}", /* BADBR */
> - "pattern error", /* BADPAT */
> - "? * + invalid", /* BADRPT */
> - "unbalanced {}", /* EBRACE */
> - "unbalanced []", /* EBRACK */
> - "collation error - not relevant", /* ECOLLATE */
> - "bad class", /* ECTYPE */
> - "bad escape sequence", /* EESCAPE */
> - "empty expression", /* EMPTY */
> - "unbalanced ()", /* EPAREN */
> - "bad range inside []", /* ERANGE */
> - "expression too big", /* ESIZE */
> - "failed to get memory", /* ESPACE */
> - "bad back reference", /* ESUBREG */
> - "bad argument", /* INVARG */
> - "match failed" /* NOMATCH */
> + "internal error", /* AP_REG_ASSERT */
> + "failed to get memory", /* AP_REG_ESPACE */
> + "bad argument", /* AP_REG_INVARG */
> + "match failed" /* AP_REG_NOMATCH */
> };
>
> -
> -
> -
> -/*************************************************
> -* Translate PCRE text code to int *
> -*************************************************/
> -
> -/* PCRE compile-time errors are given as strings defined as macros. We can
> just
> -look them up in a table to turn them into POSIX-style error codes. */
> -
> -static int
> -pcre_posix_error_code(const char *s)
> +AP_DECLARE(size_t) ap_regerror(int errcode, const ap_regex_t *preg,
> + char *errbuf, size_t errbuf_size)
> {
> -size_t i;
> -for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
> - if (strcmp(s, estring[i]) == 0) return eint[i];
> -return REG_ASSERT;
> -}
> -
> -
> -
> -/*************************************************
> -* Translate error code to string *
> -*************************************************/
> -
> -EXPORT size_t
> -regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
> -{
> const char *message, *addmessage;
> size_t length, addlength;
>
> @@ -191,8 +98,7 @@
> * Free store held by a regex *
> *************************************************/
>
> -EXPORT void
> -regfree(regex_t *preg)
> +AP_DECLARE(void) ap_regfree(ap_regex_t *preg)
> {
> (pcre_free)(preg->re_pcre);
> }
> @@ -214,20 +120,19 @@
> various non-zero codes on failure
> */
>
> -EXPORT int
> -regcomp(regex_t *preg, const char *pattern, int cflags)
> +AP_DECLARE(int) ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags)
> {
> const char *errorptr;
> int erroffset;
> int options = 0;
>
> -if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
> -if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
> +if ((cflags & AP_REG_ICASE) != 0) options |= PCRE_CASELESS;
> +if ((cflags & AP_REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
>
> preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
> preg->re_erroffset = erroffset;
>
> -if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);
> +if (preg->re_pcre == NULL) return AP_REG_INVARG;
>
> preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
> return 0;
> @@ -247,20 +152,19 @@
> block of store on the stack, to reduce the use of malloc/free. The threshold
> is
> in a macro that can be changed at configure time. */
>
> -EXPORT int
> -regexec(const regex_t *preg, const char *string, size_t nmatch,
> - regmatch_t pmatch[], int eflags)
> +AP_DECLARE(int) ap_regexec(const ap_regex_t *preg, const char *string,
> size_t nmatch,
> + ap_regmatch_t pmatch[], int eflags)
> {
> int rc;
> int options = 0;
> int *ovector = NULL;
> int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
> -BOOL allocated_ovector = FALSE;
> +int allocated_ovector = 0;
>
> -if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
> -if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
> +if ((eflags & AP_REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
> +if ((eflags & AP_REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
>
> -((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after
> compile */
> +((ap_regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning
> after compile */
>
> if (nmatch > 0)
> {
> @@ -271,8 +175,8 @@
> else
> {
> ovector = (int *)malloc(sizeof(int) * nmatch * 3);
> - if (ovector == NULL) return REG_ESPACE;
> - allocated_ovector = TRUE;
> + if (ovector == NULL) return AP_REG_ESPACE;
> + allocated_ovector = 1;
> }
> }
>
> @@ -299,16 +203,16 @@
> if (allocated_ovector) free(ovector);
> switch(rc)
> {
> - case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
> - case PCRE_ERROR_NULL: return REG_INVARG;
> - case PCRE_ERROR_BADOPTION: return REG_INVARG;
> - case PCRE_ERROR_BADMAGIC: return REG_INVARG;
> - case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
> - case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
> - case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
> - case PCRE_ERROR_BADUTF8: return REG_INVARG;
> - case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
> - default: return REG_ASSERT;
> + case PCRE_ERROR_NOMATCH: return AP_REG_NOMATCH;
> + case PCRE_ERROR_NULL: return AP_REG_INVARG;
> + case PCRE_ERROR_BADOPTION: return AP_REG_INVARG;
> + case PCRE_ERROR_BADMAGIC: return AP_REG_INVARG;
> + case PCRE_ERROR_UNKNOWN_NODE: return AP_REG_ASSERT;
> + case PCRE_ERROR_NOMEMORY: return AP_REG_ESPACE;
> + case PCRE_ERROR_MATCHLIMIT: return AP_REG_ESPACE;
> + case PCRE_ERROR_BADUTF8: return AP_REG_INVARG;
> + case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG;
> + default: return AP_REG_ASSERT;
> }
> }
> }
> Index: srclib/pcre/Makefile.in
> ===================================================================
> --- srclib/pcre/Makefile.in (revision 126611)
> +++ srclib/pcre/Makefile.in (working copy)
> @@ -1,5 +1,5 @@
> LTLIBRARY_NAME = libpcre.la
> -LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c pcreposix.c
> +LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c
>
> CLEAN_TARGETS = dftables chartables.c
> DISTCLEAN_TARGETS = pcre.h pcre-config config.h config.log config.status
> $(CLEAN_TARGETS)
> Index: modules/experimental/mod_filter.c
> ===================================================================
> --- modules/experimental/mod_filter.c (revision 126611)
> +++ modules/experimental/mod_filter.c (working copy)
> @@ -66,7 +66,7 @@
> /** The dispatch match itself - union member depends on match_type */
> union {
> const char *string;
> - regex_t *regex;
> + ap_regex_t *regex;
> int number;
> } match;
>
> @@ -232,7 +232,7 @@
> break;
> case REGEX_MATCH:
> if (ap_regexec(provider->match.regex, str, 0, NULL, 0)
> - == REG_NOMATCH) {
> + == AP_REG_NOMATCH) {
> match = 0;
> }
> break;
> @@ -590,10 +590,10 @@
> if (!rxend) {
> return "Bad regexp syntax";
> }
> - flags = REG_NOSUB; /* we're not mod_rewrite:-) */
> + flags = AP_REG_NOSUB; /* we're not mod_rewrite:-) */
> for (c = rxend+1; *c; ++c) {
> switch (*c) {
> - case 'i': flags |= REG_ICASE; break;
> + case 'i': flags |= AP_REG_ICASE; break;
> }
> }
> provider->match.regex = ap_pregcomp(cmd->pool,
> Index: modules/filters/mod_include.c
> ===================================================================
> --- modules/filters/mod_include.c (revision 126611)
> +++ modules/filters/mod_include.c (working copy)
> @@ -154,7 +154,7 @@
> const char *source;
> const char *rexp;
> apr_size_t nsub;
> - regmatch_t match[AP_MAX_REG_MATCH];
> + ap_regmatch_t match[AP_MAX_REG_MATCH];
> } backref_t;
>
> typedef struct {
> @@ -916,11 +916,11 @@
> static APR_INLINE int re_check(include_ctx_t *ctx, const char *string,
> const char *rexp)
> {
> - regex_t *compiled;
> + ap_regex_t *compiled;
> backref_t *re = ctx->intern->re;
> int rc;
>
> - compiled = ap_pregcomp(ctx->dpool, rexp, REG_EXTENDED);
> + compiled = ap_pregcomp(ctx->dpool, rexp, AP_REG_EXTENDED);
> if (!compiled) {
> ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->intern->r, "unable to "
> "compile pattern \"%s\"", rexp);
> Index: modules/mappers/mod_alias.c
> ===================================================================
> --- modules/mappers/mod_alias.c (revision 126611)
> +++ modules/mappers/mod_alias.c (working copy)
> @@ -39,7 +39,7 @@
> const char *real;
> const char *fake;
> char *handler;
> - regex_t *regexp;
> + ap_regex_t *regexp;
> int redir_status; /* 301, 302, 303, 410, etc */
> } alias_entry;
>
> @@ -111,7 +111,7 @@
> /* XX r can NOT be relative to DocumentRoot here... compat bug. */
>
> if (use_regex) {
> - new->regexp = ap_pregcomp(cmd->pool, f, REG_EXTENDED);
> + new->regexp = ap_pregcomp(cmd->pool, f, AP_REG_EXTENDED);
> if (new->regexp == NULL)
> return "Regular expression could not be compiled.";
> new->real = r;
> @@ -175,7 +175,7 @@
> alias_server_conf *serverconf = ap_get_module_config(s->module_config,
> &alias_module);
> int status = (int) (long) cmd->info;
> - regex_t *r = NULL;
> + ap_regex_t *r = NULL;
> const char *f = arg2;
> const char *url = arg3;
>
> @@ -195,7 +195,7 @@
> }
>
> if (use_regex) {
> - r = ap_pregcomp(cmd->pool, f, REG_EXTENDED);
> + r = ap_pregcomp(cmd->pool, f, AP_REG_EXTENDED);
> if (r == NULL)
> return "Regular expression could not be compiled.";
> }
> @@ -313,7 +313,7 @@
> int doesc, int *status)
> {
> alias_entry *entries = (alias_entry *) aliases->elts;
> - regmatch_t regm[AP_MAX_REG_MATCH];
> + ap_regmatch_t regm[AP_MAX_REG_MATCH];
> char *found = NULL;
> int i;
>
> Index: modules/mappers/mod_rewrite.c
> ===================================================================
> --- modules/mappers/mod_rewrite.c (revision 126611)
> +++ modules/mappers/mod_rewrite.c (working copy)
> @@ -244,7 +244,7 @@
> typedef struct {
> char *input; /* Input string of RewriteCond */
> char *pattern; /* the RegExp pattern string */
> - regex_t *regexp; /* the precompiled regexp */
> + ap_regex_t *regexp; /* the precompiled regexp */
> int flags; /* Flags which control the match */
> pattern_type ptype; /* pattern type */
> } rewritecond_entry;
> @@ -258,7 +258,7 @@
> typedef struct {
> apr_array_header_t *rewriteconds;/* the corresponding RewriteCond
> entries */
> char *pattern; /* the RegExp pattern string
> */
> - regex_t *regexp; /* the RegExp pattern compilation
> */
> + ap_regex_t *regexp; /* the RegExp pattern compilation
> */
> char *output; /* the Substitution string
> */
> int flags; /* Flags which control the substitution
> */
> char *forced_mimetype; /* forced MIME type of substitution
> */
> @@ -317,7 +317,7 @@
> typedef struct backrefinfo {
> char *source;
> int nsub;
> - regmatch_t regmatch[AP_MAX_REG_MATCH];
> + ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
> } backrefinfo;
>
> /* single linked list used for
> @@ -3045,7 +3045,7 @@
> char *str = apr_pstrdup(cmd->pool, in_str);
> rewrite_server_conf *sconf;
> rewritecond_entry *newcond;
> - regex_t *regexp;
> + ap_regex_t *regexp;
> char *a1;
> char *a2;
> char *a3;
> @@ -3132,8 +3132,8 @@
>
> if (!newcond->ptype) {
> regexp = ap_pregcomp(cmd->pool, a2,
> - REG_EXTENDED | ((newcond->flags &
> CONDFLAG_NOCASE)
> - ? REG_ICASE : 0));
> + AP_REG_EXTENDED | ((newcond->flags &
> CONDFLAG_NOCASE)
> + ? AP_REG_ICASE : 0));
> if (!regexp) {
> return apr_pstrcat(cmd->pool, "RewriteCond: cannot compile
> regular "
> "expression '", a2, "'", NULL);
> @@ -3373,7 +3373,7 @@
> char *str = apr_pstrdup(cmd->pool, in_str);
> rewrite_server_conf *sconf;
> rewriterule_entry *newrule;
> - regex_t *regexp;
> + ap_regex_t *regexp;
> char *a1;
> char *a2;
> char *a3;
> @@ -3418,9 +3418,9 @@
> ++a1;
> }
>
> - regexp = ap_pregcomp(cmd->pool, a1, REG_EXTENDED |
> + regexp = ap_pregcomp(cmd->pool, a1, AP_REG_EXTENDED |
> ((newrule->flags & RULEFLAG_NOCASE)
> - ? REG_ICASE : 0));
> + ? AP_REG_ICASE : 0));
> if (!regexp) {
> return apr_pstrcat(cmd->pool,
> "RewriteRule: cannot compile regular expression
> '",
> @@ -3492,7 +3492,7 @@
> char *input = do_expand(p->input, ctx);
> apr_finfo_t sb;
> request_rec *rsub, *r = ctx->r;
> - regmatch_t regmatch[AP_MAX_REG_MATCH];
> + ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
> int rc = 0;
>
> switch (p->ptype) {
> @@ -3645,7 +3645,7 @@
> */
> static int apply_rewrite_rule(rewriterule_entry *p, rewrite_ctx *ctx)
> {
> - regmatch_t regmatch[AP_MAX_REG_MATCH];
> + ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
> apr_array_header_t *rewriteconds;
> rewritecond_entry *conds;
> int i, rc;
> Index: modules/metadata/mod_headers.c
> ===================================================================
> --- modules/metadata/mod_headers.c (revision 126611)
> +++ modules/metadata/mod_headers.c (working copy)
> @@ -116,7 +116,7 @@
> hdr_actions action;
> const char *header;
> apr_array_header_t *ta; /* Array of format_tag structs */
> - regex_t *regex;
> + ap_regex_t *regex;
> const char *condition_var;
> } header_entry;
>
> @@ -405,7 +405,7 @@
> }
> }
> else if (new->action == hdr_echo) {
> - regex_t *regex;
> + ap_regex_t *regex;
>
> if (value) {
> if (envclause) {
> @@ -418,7 +418,7 @@
> return "Header echo only valid on Header "
> "directives";
> else {
> - regex = ap_pregcomp(cmd->pool, hdr, REG_EXTENDED | REG_NOSUB);
> + regex = ap_pregcomp(cmd->pool, hdr, AP_REG_EXTENDED |
> AP_REG_NOSUB);
> if (regex == NULL) {
> return "Header echo regex could not be compiled";
> }
> Index: modules/metadata/mod_setenvif.c
> ===================================================================
> --- modules/metadata/mod_setenvif.c (revision 126611)
> +++ modules/metadata/mod_setenvif.c (working copy)
> @@ -105,9 +105,9 @@
> };
> typedef struct {
> char *name; /* header name */
> - regex_t *pnamereg; /* compiled header name regex */
> + ap_regex_t *pnamereg; /* compiled header name regex */
> char *regex; /* regex to match against */
> - regex_t *preg; /* compiled regex */
> + ap_regex_t *preg; /* compiled regex */
> const apr_strmatch_pattern *pattern; /* non-regex pattern to match */
> apr_table_t *features; /* env vars to set (or unset) */
> enum special special_type; /* is it a "special" header ? */
> @@ -158,7 +158,7 @@
> }
>
> /*
> - * any non-NULL magic constant will do... used to indicate if REG_ICASE
> should
> + * any non-NULL magic constant will do... used to indicate if AP_REG_ICASE
> should
> * be used
> */
> #define ICASE_MAGIC ((void *)(&setenvif_module))
> @@ -170,8 +170,8 @@
> * -,_,[A-Z\, [a-z] and [0-9].
> * assume the header name is a regular expression.
> */
> - regex_t *preg = ap_pregcomp(p, "^[-A-Za-z0-9_]*$",
> - (REG_EXTENDED | REG_NOSUB ));
> + ap_regex_t *preg = ap_pregcomp(p, "^[-A-Za-z0-9_]*$",
> + (AP_REG_EXTENDED | AP_REG_NOSUB ));
> ap_assert(preg != NULL);
>
> if (ap_regexec(preg, name, 0, NULL, 0)) {
> @@ -317,7 +317,7 @@
> }
> else {
> new->preg = ap_pregcomp(cmd->pool, regex,
> - (REG_EXTENDED | (icase ? REG_ICASE :
> 0)));
> + (AP_REG_EXTENDED | (icase ? AP_REG_ICASE
> : 0)));
> if (new->preg == NULL) {
> return apr_pstrcat(cmd->pool, cmd->cmd->name,
> " regex could not be compiled.", NULL);
> @@ -353,8 +353,8 @@
> */
> if (is_header_regex(cmd->pool, fname)) {
> new->pnamereg = ap_pregcomp(cmd->pool, fname,
> - (REG_EXTENDED | REG_NOSUB
> - | (icase ? REG_ICASE : 0)));
> + (AP_REG_EXTENDED | AP_REG_NOSUB
> + | (icase ? AP_REG_ICASE : 0)));
> if (new->pnamereg == NULL)
> return apr_pstrcat(cmd->pool, cmd->cmd->name,
> "Header name regex could not be "
> @@ -452,7 +452,7 @@
> apr_size_t val_len = 0;
> int i, j;
> char *last_name;
> - regmatch_t regm[AP_MAX_REG_MATCH];
> + ap_regmatch_t regm[AP_MAX_REG_MATCH];
>
> if (!ap_get_module_config(r->request_config, &setenvif_module)) {
> ap_set_module_config(r->request_config, &setenvif_module,
> Index: modules/metadata/mod_usertrack.c
> ===================================================================
> --- modules/metadata/mod_usertrack.c (revision 126611)
> +++ modules/metadata/mod_usertrack.c (working copy)
> @@ -83,7 +83,7 @@
> char *cookie_name;
> char *cookie_domain;
> char *regexp_string; /* used to compile regexp; save for debugging */
> - regex_t *regexp; /* used to find usertrack cookie in cookie header */
> + ap_regex_t *regexp; /* used to find usertrack cookie in cookie header */
> } cookie_dir_rec;
>
> /* Make Cookie: Now we have to generate something that is going to be
> @@ -199,7 +199,7 @@
> cookie_name,
> "=([^;,]+)", NULL);
>
> - dcfg->regexp = ap_pregcomp(p, dcfg->regexp_string, REG_EXTENDED);
> + dcfg->regexp = ap_pregcomp(p, dcfg->regexp_string, AP_REG_EXTENDED);
> ap_assert(dcfg->regexp != NULL);
> }
>
> @@ -208,7 +208,7 @@
> cookie_dir_rec *dcfg = ap_get_module_config(r->per_dir_config,
> &usertrack_module);
> const char *cookie_header;
> - regmatch_t regm[NUM_SUBS];
> + ap_regmatch_t regm[NUM_SUBS];
>
> /* Do not run in subrequests */
> if (!dcfg->enabled || r->main) {
> Index: modules/metadata/mod_version.c
> ===================================================================
> --- modules/metadata/mod_version.c (revision 126611)
> +++ modules/metadata/mod_version.c (working copy)
> @@ -141,11 +141,11 @@
> static int match_version(apr_pool_t *pool, char *version_string,
> const char **error)
> {
> - regex_t *compiled;
> + ap_regex_t *compiled;
> const char *to_match;
> int rc;
>
> - compiled = ap_pregcomp(pool, version_string, REG_EXTENDED);
> + compiled = ap_pregcomp(pool, version_string, AP_REG_EXTENDED);
> if (!compiled) {
> *error = "Unable to compile regular expression";
> return 0;
> Index: modules/proxy/mod_proxy.c
> ===================================================================
> --- modules/proxy/mod_proxy.c (revision 126611)
> +++ modules/proxy/mod_proxy.c (working copy)
> @@ -872,7 +872,7 @@
> struct proxy_remote *new;
> char *p, *q;
> char *r, *f, *scheme;
> - regex_t *reg = NULL;
> + ap_regex_t *reg = NULL;
> int port;
>
> r = apr_pstrdup(cmd->pool, r1);
> @@ -902,7 +902,7 @@
> port = -1;
> *p = '\0';
> if (regex) {
> - reg = ap_pregcomp(cmd->pool, f, REG_EXTENDED);
> + reg = ap_pregcomp(cmd->pool, f, AP_REG_EXTENDED);
> if (!reg)
> return "Regular expression for ProxyRemoteMatch could not be
> compiled.";
> }
> @@ -1516,7 +1516,7 @@
> char *old_path = cmd->path;
> proxy_dir_conf *conf;
> ap_conf_vector_t *new_dir_conf = ap_create_per_dir_config(cmd->pool);
> - regex_t *r = NULL;
> + ap_regex_t *r = NULL;
> const command_rec *thiscmd = cmd->cmd;
>
> const char *err = ap_check_cmd_context(cmd,
> @@ -1550,7 +1550,7 @@
> * scheme? See proxy_fixup()
> */
> if (thiscmd->cmd_data) { /* <ProxyMatch> */
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED);
> if (!r) {
> return "Regex could not be compiled";
> }
> @@ -1561,7 +1561,7 @@
> return "<Proxy ~ > block must specify a path";
> if (strncasecmp(cmd->path, "proxy:", 6))
> cmd->path += 6;
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED);
> if (!r) {
> return "Regex could not be compiled";
> }
> Index: modules/proxy/mod_proxy.h
> ===================================================================
> --- modules/proxy/mod_proxy.h (revision 126611)
> +++ modules/proxy/mod_proxy.h (working copy)
> @@ -95,7 +95,7 @@
> const char *protocol; /* the scheme used to talk to this proxy */
> const char *hostname; /* the hostname of this proxy */
> apr_port_t port; /* the port for this proxy */
> - regex_t *regexp; /* compiled regex (if any) for the remote */
> + ap_regex_t *regexp; /* compiled regex (if any) for the remote */
> int use_regex; /* simple boolean. True if we have a regex
> pattern */
> };
>
> @@ -189,7 +189,7 @@
> typedef struct {
> const char *p; /* The path */
> int p_is_fnmatch; /* Is this path an fnmatch candidate? */
> - regex_t *r; /* Is this a regex? */
> + ap_regex_t *r; /* Is this a regex? */
> } proxy_dir_conf;
>
> typedef struct {
> Index: modules/proxy/proxy_ftp.c
> ===================================================================
> --- modules/proxy/proxy_ftp.c (revision 126611)
> +++ modules/proxy/proxy_ftp.c (working copy)
> @@ -423,12 +423,11 @@
> char *filename;
> int found = 0;
> int eos = 0;
> + ap_regex_t *re = NULL;
> + ap_regmatch_t re_result[LS_REG_MATCH];
>
> - regex_t *re = NULL;
> - regmatch_t re_result[LS_REG_MATCH];
> -
> /* Compile the output format of "ls -s1" as a fallback for non-unix
> ftp listings */
> - re = ap_pregcomp(p, LS_REG_PATTERN, REG_EXTENDED);
> + re = ap_pregcomp(p, LS_REG_PATTERN, AP_REG_EXTENDED);
> ap_assert(re != NULL);
>
> /* get a complete line */
> Index: modules/ssl/ssl_expr_eval.c
> ===================================================================
> --- modules/ssl/ssl_expr_eval.c (revision 126611)
> +++ modules/ssl/ssl_expr_eval.c (working copy)
> @@ -125,24 +125,24 @@
> ssl_expr *e1;
> ssl_expr *e2;
> char *word;
> - regex_t *regex;
> + ap_regex_t *regex;
>
> e1 = (ssl_expr *)node->node_arg1;
> e2 = (ssl_expr *)node->node_arg2;
> word = ssl_expr_eval_word(r, e1);
> - regex = (regex_t *)(e2->node_arg1);
> + regex = (ap_regex_t *)(e2->node_arg1);
> return (ap_regexec(regex, word, 0, NULL, 0) == 0);
> }
> case op_NRE: {
> ssl_expr *e1;
> ssl_expr *e2;
> char *word;
> - regex_t *regex;
> + ap_regex_t *regex;
>
> e1 = (ssl_expr *)node->node_arg1;
> e2 = (ssl_expr *)node->node_arg2;
> word = ssl_expr_eval_word(r, e1);
> - regex = (regex_t *)(e2->node_arg1);
> + regex = (ap_regex_t *)(e2->node_arg1);
> return !(ap_regexec(regex, word, 0, NULL, 0) == 0);
> }
> default: {
> Index: modules/ssl/ssl_expr_parse.c
> ===================================================================
> --- modules/ssl/ssl_expr_parse.c (revision 126611)
> +++ modules/ssl/ssl_expr_parse.c (working copy)
> @@ -818,9 +818,9 @@
> case 24:
> #line 148 "ssl_expr_parse.y"
> {
> - regex_t *regex;
> + ap_regex_t *regex;
> if ((regex = ap_pregcomp(ssl_expr_info.pool,
> ssl_expr_yyvsp[0].cpVal,
> - REG_EXTENDED|REG_NOSUB)) == NULL) {
> + AP_REG_EXTENDED|AP_REG_NOSUB)) ==
> NULL) {
> ssl_expr_error = "Failed to compile regular expression";
> YYERROR;
> regex = NULL;
> @@ -831,9 +831,9 @@
> case 25:
> #line 158 "ssl_expr_parse.y"
> {
> - regex_t *regex;
> + ap_regex_t *regex;
> if ((regex = ap_pregcomp(ssl_expr_info.pool,
> ssl_expr_yyvsp[0].cpVal,
> - REG_EXTENDED|REG_NOSUB|REG_ICASE))
> == NULL) {
> +
> AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) {
> ssl_expr_error = "Failed to compile regular expression";
> YYERROR;
> regex = NULL;
> Index: modules/ssl/ssl_expr_parse.y
> ===================================================================
> --- modules/ssl/ssl_expr_parse.y (revision 126611)
> +++ modules/ssl/ssl_expr_parse.y (working copy)
> @@ -112,18 +112,18 @@
> ;
>
> regex : T_REGEX {
> - regex_t *regex;
> + ap_regex_t *regex;
> if ((regex = ap_pregcomp(ssl_expr_info.pool, $1,
> - REG_EXTENDED|REG_NOSUB)) == NULL) {
> + AP_REG_EXTENDED|AP_REG_NOSUB)) ==
> NULL) {
> ssl_expr_error = "Failed to compile regular expression";
> YYERROR;
> }
> $$ = ssl_expr_make(op_Regex, regex, NULL);
> }
> | T_REGEX_I {
> - regex_t *regex;
> + ap_regex_t *regex;
> if ((regex = ap_pregcomp(ssl_expr_info.pool, $1,
> - REG_EXTENDED|REG_NOSUB|REG_ICASE))
> == NULL) {
> +
> AP_REG_EXTENDED|AP_REG_NOSUB|AP_REG_ICASE)) == NULL) {
> ssl_expr_error = "Failed to compile regular expression";
> YYERROR;
> }
> Index: server/core.c
> ===================================================================
> --- server/core.c (revision 126611)
> +++ server/core.c (working copy)
> @@ -1729,7 +1729,7 @@
> */
>
> #ifdef WIN32
> -#define USE_ICASE REG_ICASE
> +#define USE_ICASE AP_REG_ICASE
> #else
> #define USE_ICASE 0
> #endif
> @@ -1742,7 +1742,7 @@
> char *old_path = cmd->path;
> core_dir_config *conf;
> ap_conf_vector_t *new_dir_conf = ap_create_per_dir_config(cmd->pool);
> - regex_t *r = NULL;
> + ap_regex_t *r = NULL;
> const command_rec *thiscmd = cmd->cmd;
>
> const char *err = ap_check_cmd_context(cmd,
> @@ -1775,13 +1775,13 @@
> cmd->path = ap_getword_conf(cmd->pool, &arg);
> if (!cmd->path)
> return "<Directory ~ > block must specify a path";
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
> if (!r) {
> return "Regex could not be compiled";
> }
> }
> else if (thiscmd->cmd_data) { /* <DirectoryMatch> */
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
> if (!r) {
> return "Regex could not be compiled";
> }
> @@ -1846,7 +1846,7 @@
> int old_overrides = cmd->override;
> char *old_path = cmd->path;
> core_dir_config *conf;
> - regex_t *r = NULL;
> + ap_regex_t *r = NULL;
> const command_rec *thiscmd = cmd->cmd;
> ap_conf_vector_t *new_url_conf = ap_create_per_dir_config(cmd->pool);
> const char *err = ap_check_cmd_context(cmd,
> @@ -1869,14 +1869,14 @@
> cmd->override = OR_ALL|ACCESS_CONF;
>
> if (thiscmd->cmd_data) { /* <LocationMatch> */
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED);
> if (!r) {
> return "Regex could not be compiled";
> }
> }
> else if (!strcmp(cmd->path, "~")) {
> cmd->path = ap_getword_conf(cmd->pool, &arg);
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED);
> if (!r) {
> return "Regex could not be compiled";
> }
> @@ -1914,7 +1914,7 @@
> int old_overrides = cmd->override;
> char *old_path = cmd->path;
> core_dir_config *conf;
> - regex_t *r = NULL;
> + ap_regex_t *r = NULL;
> const command_rec *thiscmd = cmd->cmd;
> core_dir_config *c = mconfig;
> ap_conf_vector_t *new_file_conf = ap_create_per_dir_config(cmd->pool);
> @@ -1941,14 +1941,14 @@
> }
>
> if (thiscmd->cmd_data) { /* <FilesMatch> */
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
> if (!r) {
> return "Regex could not be compiled";
> }
> }
> else if (!strcmp(cmd->path, "~")) {
> cmd->path = ap_getword_conf(cmd->pool, &arg);
> - r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE);
> + r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
> if (!r) {
> return "Regex could not be compiled";
> }
> Index: server/request.c
> ===================================================================
> --- server/request.c (revision 126611)
> +++ server/request.c (working copy)
> @@ -1047,7 +1047,7 @@
> continue;
> }
>
> - if (ap_regexec(entry_core->r, r->filename, 0, NULL, REG_NOTEOL))
> {
> + if (ap_regexec(entry_core->r, r->filename, 0, NULL,
> AP_REG_NOTEOL)) {
> continue;
> }
>