aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2014-09-09 01:17:29 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2015-12-17 15:24:37 +0200
commitfe9bc685c39e79c892bf234163e7fed903c1362d (patch)
treeeda50987826022a2002dc8c7305ca00c05883995 /src
parent3d7ee4dacf54e8000fd126d49881dd322f5926b9 (diff)
downloadgrecs-fe9bc685c39e79c892bf234163e7fed903c1362d.tar.gz
grecs-fe9bc685c39e79c892bf234163e7fed903c1362d.tar.bz2
wordsplit: support ${x:-word}, ${x:+word} and ${x:?word}
* src/wordsplit.c (expvar): Support default value.
Diffstat (limited to 'src')
-rw-r--r--src/wordsplit.c70
1 files changed, 54 insertions, 16 deletions
diff --git a/src/wordsplit.c b/src/wordsplit.c
index b5a757f..dbb5aa5 100644
--- a/src/wordsplit.c
+++ b/src/wordsplit.c
@@ -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)
- {
- wsp->ws_errno = WRDSE_UNDEF;
- if (wsp->ws_flags & WRDSF_SHOWERR)
- wordsplit_perror (wsp);
- return 1;
- }
- else
+
+ if (!value)
{
- 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)

Return to:

Send suggestions and report system problems to the System administrator.