From: Stefan Fritsch Date: Thu, 20 Jan 2011 18:37:47 +0000 (+0000) Subject: Move ap_resolve_env to core.c, in preparation for adding mod_define-like X-Git-Tag: 2.3.11~156 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58f17628acc2446d1811095b38fdcbb1357d6d55;p=apache Move ap_resolve_env to core.c, in preparation for adding mod_define-like variable support. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1061444 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/core.c b/server/core.c index 88cf84b7fd..a9cf7d4686 100644 --- a/server/core.c +++ b/server/core.c @@ -1087,6 +1087,95 @@ static const char *set_access_name(cmd_parms *cmd, void *dummy, return NULL; } +/* Check a string for any ${ENV} environment variable + * construct and replace each them by the value of + * that environment variable, if it exists. If the + * environment value does not exist, leave the ${ENV} + * construct alone; it means something else. + */ +AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word) +{ +# define SMALL_EXPANSION 5 + struct sll { + struct sll *next; + const char *string; + apr_size_t len; + } *result, *current, sresult[SMALL_EXPANSION]; + char *res_buf, *cp; + const char *s, *e, *ep; + unsigned spc; + apr_size_t outlen; + + s = ap_strchr_c(word, '$'); + if (!s) { + return word; + } + + /* well, actually something to do */ + ep = word + strlen(word); + spc = 0; + result = current = &(sresult[spc++]); + current->next = NULL; + current->string = word; + current->len = s - word; + outlen = current->len; + + do { + /* prepare next entry */ + if (current->len) { + current->next = (spc < SMALL_EXPANSION) + ? &(sresult[spc++]) + : (struct sll *)apr_palloc(p, + sizeof(*current->next)); + current = current->next; + current->next = NULL; + current->len = 0; + } + + if (*s == '$') { + if (s[1] == '{' && (e = ap_strchr_c(s, '}'))) { + word = getenv(apr_pstrndup(p, s+2, e-s-2)); + if (word) { + current->string = word; + current->len = strlen(word); + outlen += current->len; + } + else { + current->string = s; + current->len = e - s + 1; + outlen += current->len; + } + s = e + 1; + } + else { + current->string = s++; + current->len = 1; + ++outlen; + } + } + else { + word = s; + s = ap_strchr_c(s, '$'); + current->string = word; + current->len = s ? s - word : ep - word; + outlen += current->len; + } + } while (s && *s); + + /* assemble result */ + res_buf = cp = apr_palloc(p, outlen + 1); + do { + if (result->len) { + memcpy(cp, result->string, result->len); + cp += result->len; + } + result = result->next; + } while (result); + res_buf[outlen] = '\0'; + + return res_buf; +} + static int reset_config_defines(void *dummy) { ap_server_config_defines = saved_server_config_defines; diff --git a/server/util.c b/server/util.c index c43fa762e7..1911616dac 100644 --- a/server/util.c +++ b/server/util.c @@ -755,95 +755,6 @@ AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) return res; } -/* Check a string for any ${ENV} environment variable - * construct and replace each them by the value of - * that environment variable, if it exists. If the - * environment value does not exist, leave the ${ENV} - * construct alone; it means something else. - */ -AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word) -{ -# define SMALL_EXPANSION 5 - struct sll { - struct sll *next; - const char *string; - apr_size_t len; - } *result, *current, sresult[SMALL_EXPANSION]; - char *res_buf, *cp; - const char *s, *e, *ep; - unsigned spc; - apr_size_t outlen; - - s = ap_strchr_c(word, '$'); - if (!s) { - return word; - } - - /* well, actually something to do */ - ep = word + strlen(word); - spc = 0; - result = current = &(sresult[spc++]); - current->next = NULL; - current->string = word; - current->len = s - word; - outlen = current->len; - - do { - /* prepare next entry */ - if (current->len) { - current->next = (spc < SMALL_EXPANSION) - ? &(sresult[spc++]) - : (struct sll *)apr_palloc(p, - sizeof(*current->next)); - current = current->next; - current->next = NULL; - current->len = 0; - } - - if (*s == '$') { - if (s[1] == '{' && (e = ap_strchr_c(s, '}'))) { - word = getenv(apr_pstrndup(p, s+2, e-s-2)); - if (word) { - current->string = word; - current->len = strlen(word); - outlen += current->len; - } - else { - current->string = s; - current->len = e - s + 1; - outlen += current->len; - } - s = e + 1; - } - else { - current->string = s++; - current->len = 1; - ++outlen; - } - } - else { - word = s; - s = ap_strchr_c(s, '$'); - current->string = word; - current->len = s ? s - word : ep - word; - outlen += current->len; - } - } while (s && *s); - - /* assemble result */ - res_buf = cp = apr_palloc(p, outlen + 1); - do { - if (result->len) { - memcpy(cp, result->string, result->len); - cp += result->len; - } - result = result->next; - } while (result); - res_buf[outlen] = '\0'; - - return res_buf; -} - AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp) { #ifdef DEBUG