summaryrefslogtreecommitdiff
path: root/src/commands/xargs.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/commands/xargs.c53
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);