xargs: code shrink

function                                             old     new   delta
xargs_main                                           827     787     -40

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-08-24 11:21:27 +02:00
parent 9c47c43e07
commit b270be3fb3

View File

@ -14,7 +14,6 @@
* xargs is described in the Single Unix Specification v3 at * xargs is described in the Single Unix Specification v3 at
* http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html * http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html
*/ */
//config:config XARGS //config:config XARGS
//config: bool "xargs (6.7 kb)" //config: bool "xargs (6.7 kb)"
//config: default y //config: default y
@ -105,6 +104,7 @@ struct globals {
#define INIT_G() do { \ #define INIT_G() do { \
setup_common_bufsiz(); \ setup_common_bufsiz(); \
G.eof_str = NULL; /* need to clear by hand because we are NOEXEC applet */ \ G.eof_str = NULL; /* need to clear by hand because we are NOEXEC applet */ \
G.idx = 0; \
IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.repl_str = "{}";) \ IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.repl_str = "{}";) \
IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.eol_ch = '\n';) \ IF_FEATURE_XARGS_SUPPORT_REPL_STR(G.eol_ch = '\n';) \
} while (0) } while (0)
@ -141,7 +141,7 @@ static int xargs_exec(void)
static void store_param(char *s) static void store_param(char *s)
{ {
/* Grow by 256 elements at once */ /* Grow by 256 elements at once */
if (!(G.idx & 0xff)) { /* G.idx == N*256 */ if (!(G.idx & 0xff)) { /* G.idx == N*256? */
/* Enlarge, make G.args[(N+1)*256 - 1] last valid idx */ /* Enlarge, make G.args[(N+1)*256 - 1] last valid idx */
G.args = xrealloc(G.args, sizeof(G.args[0]) * (G.idx + 0x100)); G.args = xrealloc(G.args, sizeof(G.args[0]) * (G.idx + 0x100));
} }
@ -476,8 +476,9 @@ enum {
IF_FEATURE_XARGS_SUPPORT_REPL_STR( "I:i::") IF_FEATURE_XARGS_SUPPORT_REPL_STR( "I:i::")
int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int xargs_main(int argc, char **argv) int xargs_main(int argc UNUSED_PARAM, char **argv)
{ {
int initial_idx;
int i; int i;
int child_error = 0; int child_error = 0;
char *max_args; char *max_args;
@ -513,11 +514,11 @@ int xargs_main(int argc, char **argv)
} }
argv += optind; argv += optind;
argc -= optind; //argc -= optind;
if (!argv[0]) { if (!argv[0]) {
/* default behavior is to echo all the filenames */ /* default behavior is to echo all the filenames */
*--argv = (char*)"echo"; *--argv = (char*)"echo";
argc++; //argc++;
} }
/* /*
@ -572,7 +573,6 @@ int xargs_main(int argc, char **argv)
*/ */
G.args = NULL; G.args = NULL;
G.argv = argv; G.argv = argv;
argc = 0;
read_args = process_stdin_with_replace; read_args = process_stdin_with_replace;
/* Make -I imply -r. GNU findutils seems to do the same: */ /* Make -I imply -r. GNU findutils seems to do the same: */
/* (otherwise "echo -n | xargs -I% echo %" would SEGV) */ /* (otherwise "echo -n | xargs -I% echo %" would SEGV) */
@ -580,30 +580,27 @@ int xargs_main(int argc, char **argv)
} else } else
#endif #endif
{ {
/* Allocate pointers for execvp. /* Store the command to be executed, part 1.
* We can statically allocate (argc + n_max_arg + 1) elements * We can statically allocate (argc + n_max_arg + 1) elements
* and do not bother with resizing args[], but on 64-bit machines * and do not bother with resizing args[], but on 64-bit machines
* this results in args[] vector which is ~8 times bigger * this results in args[] vector which is ~8 times bigger
* than n_max_chars! That is, with n_max_chars == 20k, * than n_max_chars! That is, with n_max_chars == 20k,
* args[] will take 160k (!), which will most likely be * args[] will take 160k (!), which will most likely be
* almost entirely unused. * almost entirely unused.
*
* See store_param() for matching 256-step growth logic
*/ */
G.args = xmalloc(sizeof(G.args[0]) * ((argc + 0xff) & ~0xff));
/* Store the command to be executed, part 1 */
for (i = 0; argv[i]; i++) for (i = 0; argv[i]; i++)
G.args[i] = argv[i]; store_param(argv[i]);
} }
initial_idx = G.idx;
while (1) { while (1) {
char *rem; char *rem;
G.idx = argc; G.idx = initial_idx;
rem = read_args(n_max_chars, n_max_arg, buf); rem = read_args(n_max_chars, n_max_arg, buf);
store_param(NULL); store_param(NULL);
if (!G.args[argc]) { if (!G.args[initial_idx]) { /* not even one ARG was added? */
if (*rem != '\0') if (*rem != '\0')
bb_error_msg_and_die("argument line too long"); bb_error_msg_and_die("argument line too long");
if (opt & OPT_NO_EMPTY) if (opt & OPT_NO_EMPTY)