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;
}
|