diff options
Diffstat (limited to 'src/commands/xargs.c')
-rw-r--r-- | src/commands/xargs.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/src/commands/xargs.c b/src/commands/xargs.c index 8f24441..3008c3c 100644 --- a/src/commands/xargs.c +++ b/src/commands/xargs.c @@ -24,6 +24,7 @@ static void help(void) { static int short_arg(char c, char* next) { UNUSED(next); + switch (c) { case '0': flags.null_seperated = true; @@ -41,14 +42,19 @@ static int short_arg(char c, char* next) { case 'p': flags.prompt_command = true; break; - case 'n': + case 'n': { + long int n; + check_arg(next); - long int n = get_number(next); + n = get_number(next); + if (n < 1) { error("max arg count must be at least 1"); } + flags.max_args = n; return ARG_USED; + } default: return ARG_INVALID; } @@ -57,13 +63,16 @@ static int short_arg(char c, char* next) { char* read_next(FILE* file, int arg_count) { + int size, capacity; + char* buf; + char c; + if (flags.max_args != -1 && arg_count == flags.max_args) return NULL; - int size = 0; - int capacity = 8; - char* buf = malloc(sizeof(char) * capacity); + size = 0; + capacity = 8; + buf = malloc(sizeof(char) * capacity); - char c; while(c = getc(file), true) { if (c == EOF && size == 0) { free(buf); @@ -99,6 +108,12 @@ void read_args(FILE* file, char*** args, int* size, int* capacity) { } COMMAND(xargs) { + + int start, arg_start, arg_on_stack_count; + int size, capacity, i; + char* command; + char** args; + flags.null_seperated = false; flags.ignore_empty = false; flags.print_command = false; @@ -106,17 +121,15 @@ COMMAND(xargs) { flags.max_args = -1; flags.file = stdin; - int start = parse_args(argc, argv, help, short_arg, NULL); + start = parse_args(argc, argv, help, short_arg, NULL); - char* command; if (start >= argc) { command = "echo"; } else { command = argv[start]; } - int arg_start = start + 1; - int arg_on_stack_count; + arg_start = start + 1; if (arg_start >= argc) { arg_on_stack_count = 0; @@ -125,9 +138,10 @@ COMMAND(xargs) { arg_on_stack_count = argc - arg_start; } - int size = arg_on_stack_count + 1; - int capacity = size + 8; - char** args = malloc(sizeof(char*) * capacity); + size = arg_on_stack_count + 1; + capacity = size + 8; + + args = malloc(sizeof(char*) * capacity); args[0] = command; memcpy(&args[1], &argv[arg_start], arg_on_stack_count * sizeof(char*)); read_args(flags.file, &args, &size, &capacity); @@ -135,18 +149,23 @@ COMMAND(xargs) { if (flags.ignore_empty && size < 2) goto cleanup; if (flags.prompt_command || flags.print_command) { - for (int i = 0; i < size - 1; i++) { + for (i = 0; i < size - 1; i++) { fprintf(stderr, "%s ", args[i]); } fprintf(stderr, "\b\n"); } if (flags.prompt_command) { + FILE* in; + char c; + fprintf(stderr, "Run command? "); fflush(stderr); - FILE* in = get_tty_stream("r"); - char c = getc(in); + + in = get_tty_stream("r"); + c = getc(in); fclose(in); + if (c != 'y' && c != 'Y') { fprintf(stderr, "Skipping...\n"); goto cleanup; @@ -159,7 +178,7 @@ COMMAND(xargs) { cleanup: - for (int i = arg_on_stack_count + 1; i < size - 1; i++) { + for (i = arg_on_stack_count + 1; i < size - 1; i++) { free(args[i]); } fclose(flags.file); |