From 7c8d0f697d815aa5a5ce7c592abb7a7ab690e2b5 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 2 Jul 2012 00:01:16 +0000 Subject: [PATCH] with user-dirs - expand env vars. i suspect we have to deal with escapes too. SVN revision: 73115 --- legacy/efreet/src/lib/efreet_base.c | 47 ++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/legacy/efreet/src/lib/efreet_base.c b/legacy/efreet/src/lib/efreet_base.c index 4cea7f31ae..8d57deda80 100644 --- a/legacy/efreet/src/lib/efreet_base.c +++ b/legacy/efreet/src/lib/efreet_base.c @@ -279,6 +279,51 @@ efreet_dirs_get(const char *key, const char *fallback) return dirs; } +static const char * +efreet_env_expand(const char *in) +{ + Eina_Strbuf *sb; + const char *ret, *p, *e1 = NULL, *e2 = NULL, *val; + char *env; + + if (!in) return NULL; + sb = eina_strbuf_new(); + if (!sb) return NULL; + + /* maximum length of any env var is the input string */ + env = alloca(strlen(in) + 1); + for (p = in; *p; p++) + { + if (!e1) + { + if (*p == '$') e1 = p + 1; + else eina_strbuf_append_char(sb, *p); + } + else if (!(((*p >= 'a') && (*p <= 'z')) || + ((*p >= 'A') && (*p <= 'Z')) || + ((*p >= '0') && (*p <= '9')) || + (*p == '_'))) + { + size_t len; + + e2 = p; + len = (size_t)(e2 - e1); + if (len > 0) + { + memcpy(env, e1, len); + env[len] = 0; + val = getenv(env); + if (val) eina_strbuf_append(sb, val); + } + e1 = NULL; + eina_strbuf_append_char(sb, *p); + } + } + ret = eina_stringshare_add(eina_strbuf_string_get(sb)); + eina_strbuf_free(sb); + return ret; +} + /** * @internal * @param key The user-dirs key to lookup @@ -334,5 +379,5 @@ fallback: ret = alloca(strlen(home) + strlen(fallback) + 2); sprintf(ret, "%s/%s", home, fallback); } - return eina_stringshare_add(ret); + return efreet_env_expand(ret); }