xargs: fix -I SUBSTR behaviour

function                                             old     new   delta
process_stdin_with_replace                           165     204     +39

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-09-30 00:00:43 +02:00
parent d4dd48f294
commit bd202a5ec1
2 changed files with 24 additions and 5 deletions

View File

@ -80,9 +80,11 @@
/* This is a NOEXEC applet. Be very careful! */ /* This is a NOEXEC applet. Be very careful! */
//#define dbg_msg(...) bb_error_msg(__VA_ARGS__) #if 0
#define dbg_msg(...) ((void)0) # define dbg_msg(...) bb_error_msg(__VA_ARGS__)
#else
# define dbg_msg(...) ((void)0)
#endif
#ifdef TEST #ifdef TEST
# ifndef ENABLE_FEATURE_XARGS_SUPPORT_CONFIRMATION # ifndef ENABLE_FEATURE_XARGS_SUPPORT_CONFIRMATION
@ -466,9 +468,18 @@ static char* FAST_FUNC process_stdin_with_replace(int n_max_chars, int n_max_arg
while (1) { while (1) {
int c = getchar(); int c = getchar();
if (p == buf) {
if (c == EOF)
goto ret; /* last line is empty, return "" */
if (c == G.eol_ch)
continue; /* empty line, ignore */
/* Skip leading whitespace of each line: try
* echo -e ' \t\v1 2 3 ' | xargs -I% echo '[%]'
*/
if (ISSPACE(c))
continue;
}
if (c == EOF || c == G.eol_ch) { if (c == EOF || c == G.eol_ch) {
if (p == buf)
goto ret; /* empty line */
c = '\0'; c = '\0';
} }
*p++ = c; *p++ = c;

View File

@ -61,4 +61,12 @@ testing "xargs -n2" \
SKIP= SKIP=
optional FEATURE_XARGS_SUPPORT_QUOTES
testing "xargs -I skips empty lines and leading whitespace" \
"xargs -I% echo '[%]'" \
"[2]\n[4]\n[6 6 ]\n[7]\n" \
"" " \n2\n\n4\n\n 6 6 \n \v \t 7\n\t\n\v\n"
SKIP=
exit $FAILCOUNT exit $FAILCOUNT