-
Notifications
You must be signed in to change notification settings - Fork 0
/
arguments_basic.c
115 lines (87 loc) · 3.31 KB
/
arguments_basic.c
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <stdbool.h>
#include <stdio.h>
#include "../src/debug.h"
#include "../src/arguments/arguments.h"
/** Main verb that will contain all options and sub-verbs. */
static Verb *rootVerb;
/** Simple non-repeatable flag option. */
static Option *versionOption;
/** Simple repeatable flag option. */
static Option *verbosityLevelOption;
/** Simple repeatable option with values. */
static Option *inputFilesOption;
bool prepareArguments() {
rootVerb = args_createVerb(TEXT("root"), TEXT("Test"));
versionOption = args_createOption('\0', TEXT("version"), TEXT("Prints the version"),
FLAG_OPTION_NONE);
verbosityLevelOption = args_createOption('v', TEXT("verbose"), TEXT("Increase the verbosity"),
FLAG_OPTION_REPEATABLE);
inputFilesOption = args_createOption('i', TEXT("input"), TEXT("Add a file to the processing queue"),
FLAG_OPTION_DEFAULT | FLAG_OPTION_HAS_MULTIPLE_VALUE);
// Checking if no error occurred and if we can register all the options.
return rootVerb != NULL && versionOption != NULL && verbosityLevelOption != NULL && inputFilesOption != NULL &&
args_registerOption(versionOption, rootVerb) &&
args_registerOption(verbosityLevelOption, rootVerb) &&
args_registerOption(inputFilesOption, rootVerb);
}
int main() {
// Preparing variables
int errorCode = 0;
// Preparing fake launch arguments
int argc = 9;
text_char *argv[] = {
TEXT("example.exe"), // ???
TEXT("-vvv"), // Increasing the verbosity by 3
TEXT("--verbose"), // Increasing the verbosity by 1
TEXT("-i"), // Adding a file
TEXT("file1.txt"),
TEXT("--"), // No longer parsing options, only values for `-i,--input`.
TEXT("file2.txt"),
TEXT("--version"), // Will be interpreted as a filename
TEXT("file3.txt"),
};
// Preparing launch arguments
if(!prepareArguments()) {
fprintf(stderr, "Failed to prepare launch arguments !");
return 1;
}
// Parsing the launch arguments
enum EArgumentParserErrors parserError = args_parseArguments(rootVerb, argv, 1, argc, NULL);
if(parserError != ERROR_ARGUMENTS_NONE) {
fprintf(stderr, "Unable to parse launch arguments ! (Error #%d) \n", parserError);
errorCode = 2;
goto END_CLEAN_VERB;
}
// Processing the launch arguments
// We can check for usage in 2 identical ways.
if(versionOption->occurrences > 0) {
printf("The version is 1.0.0 :D\n");
}
if(args_wasOptionUsed(versionOption)) {
printf("The version is still 1.0.0 :D\n");
}
// We can also get the usage count
if(args_wasOptionUsed(verbosityLevelOption)) {
printf("Activating verbosity level '%zu' !\n", verbosityLevelOption->occurrences);
}
// And we can iterate on values too
if(args_wasOptionUsed(inputFilesOption)) {
// We grab the first value
text_char *currentValue = dllist_selectFirstData(inputFilesOption->arguments);
while(currentValue != NULL) {
// We either print a `char` or `wchar_t` value.
#if defined(NP_GOODIES_ARGUMENTS_USE_WCHAR)
printf("Value => '%ls'\n", currentValue);
#else
printf("Value => '%s'\n", currentValue);
#endif
// We go to the next value.
currentValue = dllist_selectNextData(inputFilesOption->arguments);
}
}
// Cleaning up
END_CLEAN_VERB:
trace_printlnA("Cleaning verbs and options...");
args_freeVerb(rootVerb);
return errorCode;
}