#include "args.h" #include #include #include "utilities.h" #include 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; }