diff options
Diffstat (limited to 'src/utils/args.c')
-rw-r--r-- | src/utils/args.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/utils/args.c b/src/utils/args.c new file mode 100644 index 0000000..e569b15 --- /dev/null +++ b/src/utils/args.c @@ -0,0 +1,83 @@ +#include "args.h" +#include <stdlib.h> +#include <string.h> +#include "utilities.h" + +#include <stdio.h> +enum alr process_args(int argc, char **argv, struct option *options, int opt_length, void *args) +{ + // Processing + for (int i = 1; i < argc; i++) + { + //printf("%d: Init variables.\n", i); + // Init variables. + char *arg_name = argv[i]; + char *arg_param = NULL; + bool long_name = false; + //printf("%d: Extract name.\n", i); + // Extract name. + if (arg_name[0] == '-') + arg_name++; + if (arg_name[0] == '-') + { + arg_name++; + long_name = true; + } + if (arg_name[0] == 0) + { + // Syntax error + } + + //printf("%d: Find option (%s)(%s).\n", i, arg_name, long_name ? "long" : "short"); + // Find option. + struct option *option = NULL; + for (int i = 0; i < opt_length; i++) + { + //printf("option[i]: %s\n", options[i].short_name); + if (long_name) + { + if (cmpstr_tillchar(arg_name, options[i].name, '\0', '=') == 0) + option = &options[i]; + } + else + { + if (cmpstr_tillchar(arg_name, options[i].short_name, '\0', '\0') == 0) + option = &options[i]; + } + } + if (option == NULL) + return ALR_INVALID_OPTION; + + //printf("%d: Find param.\n", i); + // Find param. + if (option->has_param) + { + if (long_name) + { + arg_param = strchr(arg_name, '='); + if (arg_param != NULL) + { + arg_param++; + if (arg_param[0] == '\0') + arg_param = NULL; + } + } + else + { + i++; + if (i < argc) + arg_param = argv[i]; + } + + if (arg_param == NULL) + { + // Error: Missing param. + } + } + + //printf("%d: Process.\n", i); + // Process. + option->handle(args, arg_param); + } + return ALR_OK; +}
\ No newline at end of file |