「🏗️」 wip: parsing should be good
This commit is contained in:
@ -10,39 +10,58 @@
|
||||
int handle_long_args(char **av, args_t *args) {
|
||||
OPT_WHILE {
|
||||
if (strncmp((*av) + 2, options[i].name, strlen(options[i].name)) == 0) {
|
||||
OPT_HANDLE(i)
|
||||
OPT_HANDLE(i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
print_parse_err(INVALID_OPT, (*av) + 2);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
int opt_parse(char **av, args_t *args) {
|
||||
char *exec_name = *av;
|
||||
|
||||
av++;
|
||||
while (*av != NULL) {
|
||||
char *a = *av;
|
||||
|
||||
if (*a == '-') {
|
||||
char opt = *(a + 1);
|
||||
if (!opt) {
|
||||
print_no_host(exec_name);
|
||||
print_parse_err(MISSING_HOST, 0);
|
||||
return EX_USAGE;
|
||||
} else if (opt == '-') {
|
||||
int ret = handle_long_args(av, args);
|
||||
if (ret == EX_USAGE) {
|
||||
print_no_host(exec_name);
|
||||
return EX_USAGE;
|
||||
if (ret != EXIT_SUCCESS) {
|
||||
if (ret == EX_USAGE)
|
||||
print_parse_err(NEED_ARG, (*av) + 2);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
OPT_WHILE {
|
||||
if (opt == options[i].opt) {
|
||||
OPT_HANDLE(i)
|
||||
} else {
|
||||
print_parse_err(INVALID_OPT, a);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (args->hosts == NULL) {
|
||||
args->hosts = calloc(sizeof(char *), 2);
|
||||
args->hosts[0] = *av;
|
||||
args->hosts[1] = NULL;
|
||||
} else {
|
||||
int i;
|
||||
for (i = 0; args->hosts[i] != NULL; ++i)
|
||||
;
|
||||
char **old = args->hosts;
|
||||
args->hosts = reallocarray(old, i + 2, sizeof(char *));
|
||||
if (args->hosts == NULL)
|
||||
return EXIT_FAILURE;
|
||||
args->hosts[i] = *av;
|
||||
args->hosts[i + 1] = NULL;
|
||||
}
|
||||
}
|
||||
av++;
|
||||
}
|
||||
|
Reference in New Issue
Block a user