]> granicus.if.org Git - apache/commitdiff
optimization/cleanup.
authorAndré Malo <nd@apache.org>
Thu, 24 Jul 2003 19:06:33 +0000 (19:06 +0000)
committerAndré Malo <nd@apache.org>
Thu, 24 Jul 2003 19:06:33 +0000 (19:06 +0000)
The generic flagparser (read: lexer) for RewriteRules and RewriteConds
does the same except for one function call.
Collapse these to functions to one and make the result more
readable.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@100772 13f79535-47bb-0310-9956-ffa450edef68

modules/mappers/mod_rewrite.c
modules/mappers/mod_rewrite.h

index 88f951db5cfcdfd30ecdeeeb93be7cd60c2f4c39..80edefad3d77b39dfcf00ff6d87e98126a52370f 100644 (file)
@@ -604,8 +604,8 @@ static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf,
         know if the regex should be compiled with ICASE!) */
     newcond->flags = CONDFLAG_NONE;
     if (a3 != NULL) {
-        if ((err = cmd_rewritecond_parseflagfield(cmd->pool, newcond,
-                                                  a3)) != NULL) {
+        if ((err = cmd_parseflagfield(cmd->pool, newcond, a3,
+                                      cmd_rewritecond_setflag)) != NULL) {
             return err;
         }
     }
@@ -640,62 +640,11 @@ static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf,
     return NULL;
 }
 
-static const char *cmd_rewritecond_parseflagfield(apr_pool_t *p,
-                                                  rewritecond_entry *cfg,
-                                                  char *str)
-{
-    char *cp;
-    char *cp1;
-    char *cp2;
-    char *cp3;
-    char *key;
-    char *val;
-    const char *err;
-
-    if (str[0] != '[' || str[strlen(str)-1] != ']') {
-        return "RewriteCond: bad flag delimiters";
-    }
-
-    cp = str+1;
-    str[strlen(str)-1] = ','; /* for simpler parsing */
-    for ( ; *cp != '\0'; ) {
-        /* skip whitespaces */
-        for ( ; (*cp == ' ' || *cp == '\t') && *cp != '\0'; cp++)
-            ;
-        if (*cp == '\0') {
-            break;
-        }
-        cp1 = cp;
-        if ((cp2 = strchr(cp, ',')) != NULL) {
-            cp = cp2+1;
-            for ( ; (*(cp2-1) == ' ' || *(cp2-1) == '\t'); cp2--)
-                ;
-            *cp2 = '\0';
-            if ((cp3 = strchr(cp1, '=')) != NULL) {
-                *cp3 = '\0';
-                key = cp1;
-                val = cp3+1;
-            }
-            else {
-                key = cp1;
-                val = "";
-            }
-            if ((err = cmd_rewritecond_setflag(p, cfg, key, val)) != NULL) {
-                return err;
-            }
-        }
-        else {
-            break;
-        }
-    }
-
-    return NULL;
-}
-
-static const char *cmd_rewritecond_setflag(apr_pool_t *p,
-                                           rewritecond_entry *cfg,
+static const char *cmd_rewritecond_setflag(apr_pool_t *p, void *_cfg,
                                            char *key, char *val)
 {
+    rewritecond_entry *cfg = _cfg;
+
     if (   strcasecmp(key, "nocase") == 0
         || strcasecmp(key, "NC") == 0    ) {
         cfg->flags |= CONDFLAG_NOCASE;
@@ -749,8 +698,8 @@ static const char *cmd_rewriterule(cmd_parms *cmd, void *in_dconf,
     newrule->cookie[0] = NULL;
     newrule->skip   = 0;
     if (a3 != NULL) {
-        if ((err = cmd_rewriterule_parseflagfield(cmd->pool, newrule,
-                                                  a3)) != NULL) {
+        if ((err = cmd_parseflagfield(cmd->pool, newrule, a3,
+                                      cmd_rewriterule_setflag)) != NULL) {
             return err;
         }
     }
@@ -801,62 +750,10 @@ static const char *cmd_rewriterule(cmd_parms *cmd, void *in_dconf,
     return NULL;
 }
 
-static const char *cmd_rewriterule_parseflagfield(apr_pool_t *p,
-                                                  rewriterule_entry *cfg,
-                                                  char *str)
-{
-    char *cp;
-    char *cp1;
-    char *cp2;
-    char *cp3;
-    char *key;
-    char *val;
-    const char *err;
-
-    if (str[0] != '[' || str[strlen(str)-1] != ']') {
-        return "RewriteRule: bad flag delimiters";
-    }
-
-    cp = str+1;
-    str[strlen(str)-1] = ','; /* for simpler parsing */
-    for ( ; *cp != '\0'; ) {
-        /* skip whitespaces */
-        for ( ; (*cp == ' ' || *cp == '\t') && *cp != '\0'; cp++)
-            ;
-        if (*cp == '\0') {
-            break;
-        }
-        cp1 = cp;
-        if ((cp2 = strchr(cp, ',')) != NULL) {
-            cp = cp2+1;
-            for ( ; (*(cp2-1) == ' ' || *(cp2-1) == '\t'); cp2--)
-                ;
-            *cp2 = '\0';
-            if ((cp3 = strchr(cp1, '=')) != NULL) {
-                *cp3 = '\0';
-                key = cp1;
-                val = cp3+1;
-            }
-            else {
-                key = cp1;
-                val = "";
-            }
-            if ((err = cmd_rewriterule_setflag(p, cfg, key, val)) != NULL) {
-                return err;
-            }
-        }
-        else {
-            break;
-        }
-    }
-
-    return NULL;
-}
-
-static const char *cmd_rewriterule_setflag(apr_pool_t *p,
-                                           rewriterule_entry *cfg,
+static const char *cmd_rewriterule_setflag(apr_pool_t *p, void *_cfg,
                                            char *key, char *val)
 {
+    rewriterule_entry *cfg = _cfg;
     int status = 0;
     int i = 0;
 
@@ -1004,6 +901,60 @@ static const char *cmd_rewriterule_setflag(apr_pool_t *p,
     return NULL;
 }
 
+static const char *cmd_parseflagfield(apr_pool_t *p, void *cfg, char *key,
+                                      const char *(*parse)(apr_pool_t *,
+                                                           void *,
+                                                           char *, char *))
+{
+    apr_size_t last = strlen(key) - 1;
+    char *val, *nextp, *endp;
+    const char *err;
+
+    if (*key != '[' || key[last] != ']') {
+        return "RewriteCond: bad flag delimiters";
+    }
+
+    key[last] = ','; /* for simpler parsing */
+    ++key;
+
+    while (*key) {
+        /* skip leading spaces */
+        while (apr_isspace(*key)) {
+            ++key;
+        }
+
+        if (!*key || (nextp = ap_strchr(key, ',')) == NULL) { /* NULL should not
+                                                               * happen, but ...
+                                                               */
+            break;
+        }
+
+        /* strip trailing spaces */
+        endp = nextp - 1;
+        while (apr_isspace(*endp)) {
+            --endp;
+        }
+        *++endp = '\0';
+
+        /* split key and val */
+        val = ap_strchr(key, '=');
+        if (val) {
+            *val++ = '\0';
+        }
+        else {
+            val = endp;
+        }
+
+        err = parse(p, cfg, key, val);
+        if (err) {
+            return err;
+        }
+
+        key = nextp + 1;
+    }
+
+    return NULL;
+}
 
 /*
 **
index 244a22d374179c117ed95c506b8e9387d26761a7..427c9db327d118afb27f1b7567d10a9430cdfd33 100644 (file)
@@ -372,18 +372,16 @@ static const char *cmd_rewritebase(cmd_parms *cmd, void *dconf,
                                    const char *a1);
 static const char *cmd_rewritecond(cmd_parms *cmd, void *dconf,
                                    const char *str);
-static const char *cmd_rewritecond_parseflagfield(apr_pool_t *p,
-                                                  rewritecond_entry *new,
-                                                  char *str);
-static const char *cmd_rewritecond_setflag(apr_pool_t *p, rewritecond_entry *cfg,
+static const char *cmd_rewritecond_setflag(apr_pool_t *p, void *_cfg,
                                            char *key, char *val);
 static const char *cmd_rewriterule(cmd_parms *cmd, void *dconf,
                                    const char *str);
-static const char *cmd_rewriterule_parseflagfield(apr_pool_t *p,
-                                                  rewriterule_entry *new,
-                                                  char *str);
-static const char *cmd_rewriterule_setflag(apr_pool_t *p, rewriterule_entry *cfg,
+static const char *cmd_rewriterule_setflag(apr_pool_t *p, void *_cfg,
                                            char *key, char *val);
+static const char *cmd_parseflagfield(apr_pool_t *p, void *cfg, char *key,
+                                      const char *(*parse)(apr_pool_t *,
+                                                           void *,
+                                                           char *, char *));
 
     /* initialisation */
 static int pre_config(apr_pool_t *pconf,