mirror of
git://git.gnu.org.ua/wordsplit.git
synced 2025-04-26 00:29:54 +03:00
Configurable order of lookups if both WRDSF_ENV and WRDSF_GETVAR are set
* src/wordsplit.h (WRDSO_GETVARPREF): New option. * src/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.
This commit is contained in:
parent
188bbb90d6
commit
f00da62cde
2 changed files with 46 additions and 27 deletions
|
@ -216,7 +216,8 @@ struct wordsplit
|
||||||
#define WRDSO_FAILGLOB 0x00000002
|
#define WRDSO_FAILGLOB 0x00000002
|
||||||
/* Allow a leading period to be matched by metacharacters. */
|
/* Allow a leading period to be matched by metacharacters. */
|
||||||
#define WRDSO_DOTGLOB 0x00000004
|
#define WRDSO_DOTGLOB 0x00000004
|
||||||
/* Unused value: 0x00000008 */
|
/* Prefer ws_getvar over lookup in ws_env, if both are supplied */
|
||||||
|
#define WRDSO_GETVARPREF 0x00000008
|
||||||
/* Keep backslash in unrecognized escape sequences in words */
|
/* Keep backslash in unrecognized escape sequences in words */
|
||||||
#define WRDSO_BSKEEP_WORD 0x00000010
|
#define WRDSO_BSKEEP_WORD 0x00000010
|
||||||
/* Handle octal escapes in words */
|
/* Handle octal escapes in words */
|
||||||
|
|
|
@ -1034,15 +1034,13 @@ find_closing_paren (const char *str, size_t i, size_t len, size_t *poff,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static char const *
|
||||||
wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len,
|
wsplt_env_find (struct wordsplit *wsp, const char *name, size_t len)
|
||||||
char const **ret)
|
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
if (!(wsp->ws_flags & WRDSF_ENV))
|
if (!wsp->ws_env)
|
||||||
return WRDSE_UNDEF;
|
return NULL;
|
||||||
|
|
||||||
if (wsp->ws_flags & WRDSF_ENV_KV)
|
if (wsp->ws_flags & WRDSF_ENV_KV)
|
||||||
{
|
{
|
||||||
/* A key-value pair environment */
|
/* A key-value pair environment */
|
||||||
|
@ -1050,17 +1048,14 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len,
|
||||||
{
|
{
|
||||||
size_t elen = strlen (wsp->ws_env[i]);
|
size_t elen = strlen (wsp->ws_env[i]);
|
||||||
if (elen == len && memcmp (wsp->ws_env[i], name, elen) == 0)
|
if (elen == len && memcmp (wsp->ws_env[i], name, elen) == 0)
|
||||||
{
|
return wsp->ws_env[i + 1];
|
||||||
*ret = wsp->ws_env[i + 1];
|
|
||||||
return WRDSE_OK;
|
|
||||||
}
|
|
||||||
/* Skip the value. Break the loop if it is NULL. */
|
/* Skip the value. Break the loop if it is NULL. */
|
||||||
i++;
|
i++;
|
||||||
if (wsp->ws_env[i] == NULL)
|
if (wsp->ws_env[i] == NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (wsp->ws_env)
|
else
|
||||||
{
|
{
|
||||||
/* Usual (A=B) environment. */
|
/* Usual (A=B) environment. */
|
||||||
for (i = 0; wsp->ws_env[i]; i++)
|
for (i = 0; wsp->ws_env[i]; i++)
|
||||||
|
@ -1072,15 +1067,38 @@ wordsplit_find_env (struct wordsplit *wsp, const char *name, size_t len,
|
||||||
if (name[j] != var[j])
|
if (name[j] != var[j])
|
||||||
break;
|
break;
|
||||||
if (j == len && var[j] == '=')
|
if (j == len && var[j] == '=')
|
||||||
{
|
return var + j + 1;
|
||||||
*ret = var + j + 1;
|
}
|
||||||
return WRDSE_OK;
|
}
|
||||||
}
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return WRDSE_UNDEF;
|
return WRDSE_UNDEF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static int
|
||||||
wsplt_assign_var (struct wordsplit *wsp, const char *name, size_t namelen,
|
wsplt_assign_var (struct wordsplit *wsp, const char *name, size_t namelen,
|
||||||
char const *value)
|
char const *value)
|
||||||
|
@ -1356,7 +1374,6 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
const char *defstr = NULL;
|
const char *defstr = NULL;
|
||||||
char *value;
|
char *value;
|
||||||
const char *vptr;
|
|
||||||
struct wordsplit_node *newnode;
|
struct wordsplit_node *newnode;
|
||||||
const char *start = str - 1;
|
const char *start = str - 1;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -1497,22 +1514,23 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rc = wordsplit_find_env (wsp, str, i, &vptr);
|
if (wsp->ws_flags & WRDSF_GETVAR)
|
||||||
if (rc == WRDSE_OK)
|
|
||||||
{
|
{
|
||||||
if (vptr)
|
if (wsp->ws_options & WRDSO_GETVARPREF)
|
||||||
{
|
{
|
||||||
value = strdup (vptr);
|
rc = wsplt_env_getvar (wsp, str, i, &value);
|
||||||
if (!value)
|
if (rc == WRDSE_UNDEF)
|
||||||
rc = WRDSE_NOSPACE;
|
rc = wsplt_env_lookup (wsp, str, i, &value);
|
||||||
}
|
}
|
||||||
else
|
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
|
else
|
||||||
rc = WRDSE_UNDEF;
|
rc = wsplt_env_lookup (wsp, str, i, &value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == WRDSE_OK
|
if (rc == WRDSE_OK
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue