diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wordsplit.c | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c index d01fd43..9179a87 100644 --- a/src/wordsplit.c +++ b/src/wordsplit.c @@ -1036,5 +1036,4 @@ find_closing_paren (const char *str, size_t i, size_t len, size_t *poff, -static int -wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, - char const **ret) +static char const * +wsplt_env_find (struct wordsplit *wsp, const char *name, size_t len) { @@ -1042,5 +1041,4 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, - if (!(wsp->ws_flags & WRDSF_ENV)) - return WRDSE_UNDEF; - + if (!wsp->ws_env) + return NULL; if (wsp->ws_flags & WRDSF_ENV_KV) @@ -1052,6 +1050,3 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, if (elen == len && memcmp (wsp->ws_env[i], name, elen) == 0) - { - *ret = wsp->ws_env[i + 1]; - return WRDSE_OK; - } + return wsp->ws_env[i + 1]; /* Skip the value. Break the loop if it is NULL. */ @@ -1062,3 +1057,3 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, } - else if (wsp->ws_env) + else { @@ -1074,6 +1069,22 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, if (j == len && var[j] == '=') - { - *ret = var + j + 1; - return WRDSE_OK; - } + return var + j + 1; + } + } + return NULL; +} + +static int +wsplt_env_lookup (struct wordsplit *wsp, const char *name, size_t len, + char **ret) +{ + if (wsp->ws_flags & WRDSF_ENV) + { + char const *val = wsplt_env_find (wsp, name, len); + if (val) + { + char *retval = strdup (val); + if (!retval) + return WRDSE_NOSPACE; + *ret = retval; + return WRDSE_OK; } @@ -1084,2 +1095,9 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len, static int +wsplt_env_getvar (struct wordsplit *wsp, const char *name, size_t len, + char **ret) +{ + return wsp->ws_getvar (ret, name, len, wsp->ws_closure); +} + +static int wsplt_assign_var (struct wordsplit *wsp, const char *name, size_t namelen, @@ -1358,3 +1376,2 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, char *value; - const char *vptr; struct wordsplit_node *newnode; @@ -1499,18 +1516,19 @@ expvar (struct wordsplit *wsp, const char *str, size_t len, { - rc = wordsplit_find_env (wsp, str, i, &vptr); - if (rc == WRDSE_OK) + if (wsp->ws_flags & WRDSF_GETVAR) { - if (vptr) + if (wsp->ws_options & WRDSO_GETVARPREF) { - value = strdup (vptr); - if (!value) - rc = WRDSE_NOSPACE; + rc = wsplt_env_getvar (wsp, str, i, &value); + if (rc == WRDSE_UNDEF) + rc = wsplt_env_lookup (wsp, str, i, &value); } else - rc = WRDSE_UNDEF; + { + rc = wsplt_env_lookup (wsp, str, i, &value); + if (rc == WRDSE_UNDEF) + rc = wsplt_env_getvar (wsp, str, i, &value); + } } - else if (wsp->ws_flags & WRDSF_GETVAR) - rc = wsp->ws_getvar (&value, str, i, wsp->ws_closure); else - rc = WRDSE_UNDEF; + rc = wsplt_env_lookup (wsp, str, i, &value); } |