aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-06-13 14:20:20 +0300
committerSergey Poznyakoff <gray@gnu.org>2019-06-13 14:20:20 +0300
commit12304127b52650588877f00b0c4b32dae083e852 (patch)
treee6a2fa21b66d16a82a7913933b88bd091f633dc6 /src
parentdbe318987cf3a36fe63893205d3df0dc3be7fa4a (diff)
downloadgrecs-12304127b52650588877f00b0c4b32dae083e852.tar.gz
grecs-12304127b52650588877f00b0c4b32dae083e852.tar.bz2
wordsplit: configurable order of lookups if both WRDSF_ENV and WRDSF_GETVAR are set
* lib/wordsplit.h (WRDSO_GETVARPREF): New option. * lib/wordsplit.c (wordsplit_find_env): Rewrite as wsplt_env_lookup wsplt_env_getvar): New function. (expvar): Select preference of wsplt_env_lookup vs. wsplt_env_getvar depending on the value if WRDSO_GETVARPREF option.
Diffstat (limited to 'src')
-rw-r--r--src/wordsplit.c70
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);
}

Return to:

Send suggestions and report system problems to the System administrator.