22 parser.initialised =
true;
23 parser.error.status = PARSER_STATUS_OK;
24 parser.error.msg =
"";
27 parser.addArg = ArgParser_addArg;
28 parser.addMutexGroup = ArgParser_addMutexGroup;
29 parser.parseArgs = ArgParser_parseArgs;
42int ArgParser_addArg(
ArgParser *parser,
const char *name,
char shorthand, ArgType type,
bool required) {
43 if (parser->numArgs >= MAX_ARGS) {
44 parser->error.status = PARSER_STATUS_ERROR;
45 parser->error.msg =
"Error: Too many arguments";
48 Argument *arg = &parser->args[parser->numArgs++];
49 strncpy(arg->name, name, MAX_ARG_LEN - 1);
50 arg->name[MAX_ARG_LEN - 1] =
'\0';
51 arg->shorthand = shorthand;
53 arg->required = required;
54 arg->provided =
false;
56 return parser->numArgs - 1;
68int ArgParser_addMutexGroup(
ArgParser *parser,
int indices[],
int count) {
69 if (parser->numGroups >= MAX_GROUPS) {
70 parser->error.status = PARSER_STATUS_ERROR;
71 parser->error.msg =
"Error: Too many exclusion groups";
76 for (
int i = 0; i < count; i++) {
77 group->indices[i] = indices[i];
79 return parser->numGroups - 1;
91bool ArgParser_parseArgs(
ArgParser *parser,
int argc,
char *argv[]) {
92 for (
int i = 0; i < argc; i++) {
94 for (
int j = 0; j < parser->numArgs; j++) {
97 if (strcmp(argv[i], arg->name) == 0 || (strlen(argv[i]) == 2 && argv[i][0] ==
'-' && argv[i][1] == arg->shorthand)) {
98 if (arg->type == ARG_TYPE_BOOL) {
100 }
else if (arg->type == ARG_TYPE_STRING) {
102 strncpy(arg->value, argv[++i], MAX_VALUE_LEN - 1);
103 arg->value[MAX_VALUE_LEN - 1] =
'\0';
104 arg->provided =
true;
107 parser->error.status = PARSER_STATUS_ERROR;
108 parser->error.msg =
"Error: Missing value for argument";
118 parser->error.status = PARSER_STATUS_ERROR;
119 parser->error.msg =
"Error: Unknown argument";
125 for (
int i = 0; i < parser->numArgs; i++) {
127 if (arg->required && !arg->provided) {
128 parser->error.status = PARSER_STATUS_ERROR;
129 parser->error.msg =
"Error: Missing required argument";
135 for (
int i = 0; i < parser->numGroups; i++) {
138 for (
int j = 0; j < group->count; j++) {
139 if (parser->args[group->indices[j]].provided) {
144 parser->error.status = PARSER_STATUS_ERROR;
145 parser->error.msg =
"Error: Mutually exclusive arguments provided in group";