aboutsummaryrefslogtreecommitdiff
path: root/src/utils/args.c
blob: e569b15f17e12aca42ec4813840798e15cd96c2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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;
}