#include "ap_regex.h"
#include "httpd.h"
+static apr_status_t rxplus_cleanup(void *preg)
+{
+ ap_regfree((ap_regex_t *) preg);
+ return APR_SUCCESS;
+}
+
AP_DECLARE(ap_rxplus_t*) ap_rxplus_compile(apr_pool_t *pool,
const char *pattern)
{
}
if (!endp) { /* there's no delim or flags */
if (ap_regcomp(&ret->rx, pattern, 0) == 0) {
- apr_pool_cleanup_register(pool, &ret->rx, (void*) ap_regfree,
+ apr_pool_cleanup_register(pool, &ret->rx, rxplus_cleanup,
apr_pool_cleanup_null);
return ret;
}
}
}
if (ap_regcomp(&ret->rx, rxstr, ret->flags) == 0) {
- apr_pool_cleanup_register(pool, &ret->rx, (void*) ap_regfree,
+ apr_pool_cleanup_register(pool, &ret->rx, rxplus_cleanup,
apr_pool_cleanup_null);
}
else {
AP_DECLARE(int) ap_rxplus_exec(apr_pool_t *pool, ap_rxplus_t *rx,
const char *pattern, char **newpattern)
- //int max_iterations)
{
-#if 1
int ret = 1;
int startl, oldl, newl, diffsz;
const char *remainder;
remainder = pattern + startl + oldl;
if (rx->flags & AP_REG_MULTI) {
/* recurse to do any further matches */
- char *subs;
ret += ap_rxplus_exec(pool, rx, remainder, &subs);
if (ret > 1) {
/* a further substitution happened */
*newpattern = subs;
}
return ret;
-
-
-
-
-#else
-
-
-
-
-
-
-
-
-
-
-
-
- if (!(rx->flags & AP_REG_MULTI) || (rx->subs == NULL)) {
- max_iterations = 1;
- }
- /* FIXME: multi-matching is incorrect */
- while (max_iterations-- > 0) {
- if (ap_regexec(&rx->rx, pattern, rx->nmatch, rx->pmatch, rx->flags)
- == 0) {
- ret++;
- if (rx->subs) {
- rx->match = pattern;
- *newpattern = ap_pregsub(pool, rx->subs, pattern,
- rx->nmatch, rx->pmatch);
- pattern = *newpattern;
- if (pattern == NULL) {
- max_iterations = 0;
- }
- }
- }
- else {
- max_iterations = 0;
- }
- }
-
- if (ret == 0 || rx->flags&AP_REG_NOMEM) {
- rx->match = NULL; /* no match, so don't pretend to remember a match */
- }
- else {
-#if 0
- /* FIXME - should we be 'safe' and take the performance hit,
- * or just document thou-shalt-keep-pattern-in-scope?
- */
- if (rx->match == inpattern) {
- rx->match = apr_pstrdup(pool, inpattern);
- }
-#endif
- }
- return ret;
-#endif
}
#ifdef DOXYGEN
AP_DECLARE(int) ap_rxplus_nmatch(ap_rxplus_t *rx)
int len;
const char *match;
ap_rxplus_match(rx, n, &len, &match);
- return (match != NULL) ? apr_pstrndup(pool, match, len) : NULL;
+ return apr_pstrndup(pool, match, len);
}