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:
parent
9c47c43e07
commit
b270be3fb3
@ -14,7 +14,6 @@
|
||||
* xargs is described in the Single Unix Specification v3 at
|
||||
* http://www.opengroup.org/onlinepubs/007904975/utilities/xargs.html
|
||||
*/
|
||||
|
||||
//config:config XARGS
|
||||
//config: bool "xargs (6.7 kb)"
|
||||
//config: default y
|
||||
@ -105,6 +104,7 @@ struct globals {
|
||||
#define INIT_G() do { \
|
||||
setup_common_bufsiz(); \
|
||||
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.eol_ch = '\n';) \
|
||||
} while (0)
|
||||
@ -141,7 +141,7 @@ static int xargs_exec(void)
|
||||
static void store_param(char *s)
|
||||
{
|
||||
/* 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 */
|
||||
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::")
|
||||
|
||||
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 child_error = 0;
|
||||
char *max_args;
|
||||
@ -513,11 +514,11 @@ int xargs_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
argv += optind;
|
||||
argc -= optind;
|
||||
//argc -= optind;
|
||||
if (!argv[0]) {
|
||||
/* default behavior is to echo all the filenames */
|
||||
*--argv = (char*)"echo";
|
||||
argc++;
|
||||
//argc++;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -572,7 +573,6 @@ int xargs_main(int argc, char **argv)
|
||||
*/
|
||||
G.args = NULL;
|
||||
G.argv = argv;
|
||||
argc = 0;
|
||||
read_args = process_stdin_with_replace;
|
||||
/* Make -I imply -r. GNU findutils seems to do the same: */
|
||||
/* (otherwise "echo -n | xargs -I% echo %" would SEGV) */
|
||||
@ -580,30 +580,27 @@ int xargs_main(int argc, char **argv)
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
/* Allocate pointers for execvp.
|
||||
/* Store the command to be executed, part 1.
|
||||
* We can statically allocate (argc + n_max_arg + 1) elements
|
||||
* and do not bother with resizing args[], but on 64-bit machines
|
||||
* this results in args[] vector which is ~8 times bigger
|
||||
* than n_max_chars! That is, with n_max_chars == 20k,
|
||||
* args[] will take 160k (!), which will most likely be
|
||||
* 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++)
|
||||
G.args[i] = argv[i];
|
||||
store_param(argv[i]);
|
||||
}
|
||||
|
||||
initial_idx = G.idx;
|
||||
while (1) {
|
||||
char *rem;
|
||||
|
||||
G.idx = argc;
|
||||
G.idx = initial_idx;
|
||||
rem = read_args(n_max_chars, n_max_arg, buf);
|
||||
store_param(NULL);
|
||||
|
||||
if (!G.args[argc]) {
|
||||
if (!G.args[initial_idx]) { /* not even one ARG was added? */
|
||||
if (*rem != '\0')
|
||||
bb_error_msg_and_die("argument line too long");
|
||||
if (opt & OPT_NO_EMPTY)
|
||||
|
Loading…
Reference in New Issue
Block a user