From 07930c5ee74b8d2645fc55465833ab84e2f4444a Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Mon, 13 May 2019 14:24:58 +0300 Subject: wordsplit: 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. --- src/wordsplit.c | 39 +++++++++++++++++++++++++-------------- tests/wordsplit.at | 13 +++++++++++-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/wordsplit.c b/src/wordsplit.c index f94015a..e979f27 100644 --- a/src/wordsplit.c +++ b/src/wordsplit.c @@ -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; } diff --git a/tests/wordsplit.at b/tests/wordsplit.at index 631d939..e3af703 100644 --- a/tests/wordsplit.at +++ b/tests/wordsplit.at @@ -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 -- cgit v1.2.1