Fix expansion of ${...}

* src/wordsplit.c (expvar): Ensure value is set.
Pass WRDSF_QUOTE to wordsplit
(scan_word): Treat ${...} as a single word.
* tests/wordsplit.at: Add more tests.
* tests/wsp.c: Fix error message.
This commit is contained in:
Sergey Poznyakoff 2014-09-09 08:52:06 +03:00 committed by Sergey Poznyakoff
parent e082c9923e
commit 07a7d68690
3 changed files with 80 additions and 6 deletions

View file

@ -612,8 +612,7 @@ node_split_prefix (struct wordsplit *wsp,
static int
find_closing_cbrace (const char *str, size_t i, size_t len, size_t * poff)
{
enum
{ st_init, st_squote, st_dquote } state = st_init;
enum { st_init, st_squote, st_dquote } state = st_init;
size_t level = 1;
for (; i < len; i++)
@ -779,7 +778,9 @@ 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
value = NULL;
if (!value)
{
if (defstr)
@ -866,7 +867,8 @@ expvar (struct wordsplit *wsp, const char *str, size_t len,
ws.ws_delim = wsp->ws_delim;
rc = wordsplit (value, &ws,
WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM | WRDSF_WS);
WRDSF_NOVAR | WRDSF_NOCMD | WRDSF_DELIM |
WRDSF_WS | WRDSF_QUOTE);
free (value);
if (rc)
{
@ -1192,7 +1194,11 @@ scan_word (struct wordsplit *wsp, size_t start)
}
}
if (ISDELIM (wsp, command[i]))
if (!(wsp->ws_flags & WRDSF_NOVAR)
&& command[i] == '$' && command[i+1] == '{'
&& find_closing_cbrace (command, i + 2, len, &i) == 0)
continue;
else if (ISDELIM (wsp, command[i]))
break;
else
i++;

View file

@ -438,4 +438,72 @@ NF: 1
[input exhausted
])
TESTWSP([default value (defined)],[wsp-var wsp-var13 wsp39],[],
[${FOO:-bar}],
[NF: 1
0: qux
],
[],
[FOO=qux])
TESTWSP([default value],[wsp-var wsp-var14 wsp40],[],
[${FOO:-bar}],
[NF: 1
0: bar
])
TESTWSP([default error message (var defined)],[wsp-var wsp-var15 wsp41],[],
[a ${FOO:?} test],
[NF: 3
0: a
1: bar
2: test
],
[],
[FOO=bar])
TESTWSP([default error message],[wsp-var wsp-var16 wsp42],[],
[${FOO:?}],
[NF: 0
],
[FOO: variable null or not set
])
TESTWSP([custom error message (defined)],[wsp-var wsp-var17 wsp43],[],
[a ${FOO:?please define it} test],
[NF: 3
0: a
1: bar
2: test
],
[],
[FOO=bar])
TESTWSP([custom error message],[wsp-var wsp-var18 wsp44],[],
[a ${FOO:?please define it} test],
[NF: 2
0: a
1: test
],
[FOO: please define it
])
TESTWSP([alternate value (defined)],[wsp-var wsp-var19 wsp45],[],
[a ${FOO:+isset} test],
[NF: 3
0: a
1: isset
2: test
],
[],
[FOO=bar])
TESTWSP([alternate value],[wsp-var wsp-var20 wsp46],[],
[a ${FOO:+isset} test],
[NF: 2
0: a
1: test
])
m4_popdef([TESTWSP])

View file

@ -296,7 +296,7 @@ main (int argc, char **argv)
continue;
}
fprintf (stderr, "%s: unrecognized argument for %s\n",
fprintf (stderr, "%s: unrecognized argument: %s\n",
progname, opt);
exit (1);
}