Support ${x:-word}, ${x:+word} and ${x:?word}

* src/wordsplit.c (expvar): Support default value.
This commit is contained in:
Sergey Poznyakoff 2014-09-09 01:17:29 +03:00 committed by Sergey Poznyakoff
parent 9765ed3720
commit e082c9923e

View file

@ -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)