aboutsummaryrefslogtreecommitdiff
path: root/src/utils/args.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/args.c')
-rw-r--r--src/utils/args.c83
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