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

View file

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