Return single empty string on empty input in WRDSF_NOSPLIT mode

* src/wordsplit.c (wordsplit_finish): Make sure at one non-null
argument is always returned in WRDSF_NOSPLIT mode.
* tests/wordsplit.at: Add new test.
This commit is contained in:
Sergey Poznyakoff 2019-05-13 14:24:58 +03:00
parent cfb04c02a5
commit 65d0759a8b
2 changed files with 36 additions and 16 deletions

View file

@ -805,25 +805,35 @@ wordsplit_finish (struct wordsplit *wsp)
n++;
}
if (n == 0 && (wsp->ws_flags & WRDSF_INCREMENTAL))
if (n == 0)
{
/* The loop above have eliminated all nodes. Restart the
processing, if there's any input left. */
if (wsp->ws_endp < wsp->ws_len)
/* The loop above have eliminated all nodes. */
if (wsp->ws_flags & WRDSF_INCREMENTAL)
{
int rc;
if (wsp->ws_flags & WRDSF_SHOWDBG)
wsp->ws_debug (_("Restarting"));
rc = wordsplit_process_list (wsp, skip_delim (wsp));
if (rc)
return rc;
/* Restart the processing, if there's any input left. */
if (wsp->ws_endp < wsp->ws_len)
{
int rc;
if (wsp->ws_flags & WRDSF_SHOWDBG)
wsp->ws_debug (_("Restarting"));
rc = wordsplit_process_list (wsp, skip_delim (wsp));
if (rc)
return rc;
}
else
{
wsp->ws_error = WRDSE_EOF;
return WRDSE_EOF;
}
goto again;
}
else
if (wsp->ws_flags & WRDSF_NOSPLIT)
{
wsp->ws_error = WRDSE_EOF;
return WRDSE_EOF;
if (wordsplit_add_segm (wsp, 0, 0, _WSNF_EMPTYOK))
return wsp->ws_errno;
n = 1;
}
goto again;
}
if (alloc_space (wsp, n + 1))
@ -2412,6 +2422,7 @@ wordsplit_process_list (struct wordsplit *wsp, size_t start)
}
}
}
return wsp->ws_errno;
}

View file

@ -262,7 +262,7 @@ TOTAL: 2
[],
[FOO=bar BAZ=qux])
TESTWSP([nosplit with expansion],[wsp-var-nosplit],[nosplit],
TESTWSP([nosplit with variable expansion],[wsp-var-nosplit],[nosplit],
[a $FOO test],
[NF: 1
0: "a variable expansion test\n"
@ -271,7 +271,7 @@ TOTAL: 1
[],
[FOO="variable expansion"])
TESTWSP([nosplit without expansion],[],[nosplit novar],
TESTWSP([nosplit without variable expansion],[],[nosplit novar],
[a $FOO test],
[NF: 1
0: "a $FOO test\n"
@ -280,6 +280,15 @@ TOTAL: 1
[],
[FOO="variable expansion"])
TESTWSP([nosplit: empty expansion],[],[nosplit trimnl],
[$FOO],
[NF: 1
0: ""
TOTAL: 1
],
[],
[FOO=""])
TESTWSP([default value (defined)],[],[],
[${FOO:-bar}],
[NF: 1