]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: regex: Use native PCRE API.
authorThierry FOURNIER <tfournier@exceliance.fr>
Wed, 18 Jun 2014 09:50:51 +0000 (11:50 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 18 Jun 2014 13:14:00 +0000 (15:14 +0200)
The pcreposix layer (in the pcre projetc) execute strlen to find
thlength of the string. When we are using the function "regex_exex*2",
the length is used to add a final \0, when pcreposix is executed a
strlen is executed to compute the length.

If we are using a native PCRE api, the length is provided as an
argument, and these operations disappear.

This is useful because PCRE regex are more used than POSIC regex.

include/common/regex.h
src/regex.c

index 29a6ace8181b5ff756302f289b2b395c068202d2..762eb56f2d3f0bfce61e81a9e6a9a889b8f11963 100644 (file)
 
 struct my_regex {
 #ifdef USE_PCRE
+       pcre *reg;
+       pcre_extra *extra;
 #ifdef USE_PCRE_JIT
 #ifndef PCRE_CONFIG_JIT
 #error "The PCRE lib doesn't support JIT. Change your lib, or remove the option USE_PCRE_JIT."
 #endif
-       pcre *reg;
-       pcre_extra *extra;
-#else /* no PCRE_JIT */
-       regex_t regex;
 #endif
 #else /* no PCRE */
        regex_t regex;
@@ -87,7 +85,7 @@ const char *chain_regex(struct hdr_exp **head, struct my_regex *preg,
 /* If the function doesn't match, it returns false, else it returns true.
  */
 static inline int regex_exec(const struct my_regex *preg, char *subject) {
-#ifdef USE_PCRE_JIT
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
        if (pcre_exec(preg->reg, preg->extra, subject, strlen(subject), 0, 0, NULL, 0) < 0)
                return 0;
        return 1;
@@ -107,7 +105,7 @@ static inline int regex_exec(const struct my_regex *preg, char *subject) {
  * If the function doesn't match, it returns false, else it returns true.
  */
 static inline int regex_exec2(const struct my_regex *preg, char *subject, int length) {
-#ifdef USE_PCRE_JIT
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
        if (pcre_exec(preg->reg, preg->extra, subject, length, 0, 0, NULL, 0) < 0)
                return 0;
        return 1;
@@ -129,9 +127,11 @@ int regex_exec_match2(const struct my_regex *preg, char *subject, int length,
                       size_t nmatch, regmatch_t pmatch[]);
 
 static inline void regex_free(struct my_regex *preg) {
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
+       pcre_free(preg->reg);
 #ifdef USE_PCRE_JIT
        pcre_free_study(preg->extra);
-       pcre_free(preg->reg);
+#endif
 #else
        regfree(&preg->regex);
 #endif
index 22920026aecf4d3822cbe421af602d73226cd3f8..dda666db22083fc4c840c1745731be087e91ab09 100644 (file)
@@ -156,7 +156,7 @@ const char *chain_regex(struct hdr_exp **head, struct my_regex *preg,
  */
 int regex_exec_match(const struct my_regex *preg, const char *subject,
                      size_t nmatch, regmatch_t pmatch[]) {
-#ifdef USE_PCRE_JIT
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
        int ret;
        int matches[MAX_MATCH * 3];
        int enmatch;
@@ -216,7 +216,7 @@ int regex_exec_match(const struct my_regex *preg, const char *subject,
  */
 int regex_exec_match2(const struct my_regex *preg, char *subject, int length,
                       size_t nmatch, regmatch_t pmatch[]) {
-#ifdef USE_PCRE_JIT
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
        int ret;
        int matches[MAX_MATCH * 3];
        int enmatch;
@@ -272,7 +272,7 @@ int regex_exec_match2(const struct my_regex *preg, char *subject, int length,
 
 int regex_comp(const char *str, struct my_regex *regex, int cs, int cap, char **err)
 {
-#ifdef USE_PCRE_JIT
+#if defined(USE_PCRE) || defined(USE_PCRE_JIT)
        int flags = 0;
        const char *error;
        int erroffset;
@@ -288,12 +288,16 @@ int regex_comp(const char *str, struct my_regex *regex, int cs, int cap, char **
                return 0;
        }
 
+#ifdef USE_PCRE_JIT
        regex->extra = pcre_study(regex->reg, PCRE_STUDY_JIT_COMPILE, &error);
        if (!regex->extra) {
                pcre_free(regex->reg);
                memprintf(err, "failed to compile regex '%s' (error=%s)", str, error);
                return 0;
        }
+#else
+       regex->extra = NULL;
+#endif
 #else
        int flags = REG_EXTENDED;