mirror of
git://git.gnu.org.ua/wordsplit.git
synced 2025-04-26 00:29:54 +03:00
Support ${x:-word}, ${x:+word} and ${x:?word}
* src/wordsplit.c (expvar): Support default value.
This commit is contained in:
parent
9765ed3720
commit
e082c9923e
1 changed files with 54 additions and 16 deletions
|
@ -779,27 +779,65 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
|
|||
}
|
||||
else if (wsp->ws_flags & WRDSF_GETVAR)
|
||||
value = wsp->ws_getvar (str, i, wsp->ws_closure);
|
||||
else if (wsp->ws_flags & WRDSF_UNDEF)
|
||||
|
||||
if (!value)
|
||||
{
|
||||
wsp->ws_errno = WRDSE_UNDEF;
|
||||
if (wsp->ws_flags & WRDSF_SHOWERR)
|
||||
wordsplit_perror (wsp);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (wsp->ws_flags & WRDSF_WARNUNDEF)
|
||||
wsp->ws_error (_("warning: undefined variable `%.*s'"), (int) i, str);
|
||||
if (wsp->ws_flags & WRDSF_KEEPUNDEF)
|
||||
value = NULL;
|
||||
if (defstr)
|
||||
{
|
||||
size_t size;
|
||||
if (*defstr == '-')
|
||||
{
|
||||
size = *pend - ++defstr;
|
||||
value = malloc (size + 1);
|
||||
if (!value)
|
||||
return _wsplt_nomem (wsp);
|
||||
memcpy (value, defstr, size);
|
||||
value[size] = 0;
|
||||
}
|
||||
else if (*defstr == '?')
|
||||
{
|
||||
size = *pend - ++defstr;
|
||||
if (size == 0)
|
||||
wsp->ws_error (_("%.*s: variable null or not set"),
|
||||
(int) i, str);
|
||||
else
|
||||
wsp->ws_error ("%.*s: %.*s",
|
||||
(int) i, str, (int) size, defstr);
|
||||
}
|
||||
}
|
||||
else if (wsp->ws_flags & WRDSF_UNDEF)
|
||||
{
|
||||
wsp->ws_errno = WRDSE_UNDEF;
|
||||
if (wsp->ws_flags & WRDSF_SHOWERR)
|
||||
wordsplit_perror (wsp);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = strdup ("");
|
||||
if (!value)
|
||||
return _wsplt_nomem (wsp);
|
||||
if (wsp->ws_flags & WRDSF_WARNUNDEF)
|
||||
wsp->ws_error (_("warning: undefined variable `%.*s'"),
|
||||
(int) i, str);
|
||||
if (wsp->ws_flags & WRDSF_KEEPUNDEF)
|
||||
value = NULL;
|
||||
else
|
||||
{
|
||||
value = strdup ("");
|
||||
if (!value)
|
||||
return _wsplt_nomem (wsp);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* FIXME: handle defstr */
|
||||
else if (defstr && *defstr == '+')
|
||||
{
|
||||
size_t size = *pend - ++defstr;
|
||||
free (value);
|
||||
value = malloc (size + 1);
|
||||
if (!value)
|
||||
return _wsplt_nomem (wsp);
|
||||
memcpy (value, defstr, size);
|
||||
value[size] = 0;
|
||||
}
|
||||
|
||||
if (value)
|
||||
{
|
||||
if (flg & _WSNF_QUOTE)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue