Started refactoring the parser
This commit is contained in:
parent
4dc995b9a6
commit
a7008d3a1e
46
argparser.c
46
argparser.c
@ -8,12 +8,16 @@
|
||||
|
||||
#define INITIAL_SIZE 30
|
||||
|
||||
INTERNAL arg_t help_arg = {ARG_TYPE_FLAG, "h", "help"};
|
||||
|
||||
void print_usage(argparser_t *parser);
|
||||
|
||||
typedef struct {
|
||||
arg_type_t type;
|
||||
const char *identifier;
|
||||
const char *short_name;
|
||||
} parser_arg_t;
|
||||
|
||||
struct argparser {
|
||||
arg_t *args;
|
||||
parser_arg_t *args;
|
||||
u64 size;
|
||||
u64 args_count;
|
||||
u64 positional_count;
|
||||
@ -21,6 +25,8 @@ struct argparser {
|
||||
u64 flag_count;
|
||||
};
|
||||
|
||||
INTERNAL parser_arg_t help_arg = {ARG_TYPE_FLAG, "help", "h"};
|
||||
|
||||
argparser_t *create_parser(parse_func_t parse_func) {
|
||||
argparser_t *parser = (argparser_t *)malloc(sizeof(argparser_t));
|
||||
|
||||
@ -28,7 +34,7 @@ argparser_t *create_parser(parse_func_t parse_func) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
parser->args = (arg_t *)malloc(INITIAL_SIZE * sizeof(arg_t));
|
||||
parser->args = (parser_arg_t *)malloc(INITIAL_SIZE * sizeof(parser_arg_t));
|
||||
if (!(parser->args)) {
|
||||
free(parser);
|
||||
|
||||
@ -111,7 +117,7 @@ void parse_args(argparser_t *parser, i32 argc, char *argv[]) {
|
||||
const char *long_name = &(argv[i][2]);
|
||||
|
||||
if (strcmp(short_name, help_arg.short_name) == 0 ||
|
||||
strcmp(long_name, help_arg.long_name) == 0) {
|
||||
strcmp(long_name, help_arg.identifier) == 0) {
|
||||
print_usage(parser);
|
||||
|
||||
exit(0);
|
||||
@ -126,20 +132,20 @@ void parse_args(argparser_t *parser, i32 argc, char *argv[]) {
|
||||
}
|
||||
|
||||
void print_usage(argparser_t *parser) {
|
||||
arg_t positional[parser->positional_count];
|
||||
parser_arg_t positional[parser->positional_count];
|
||||
memset(positional, 0, parser->positional_count);
|
||||
u64 positional_index = 0;
|
||||
|
||||
arg_t named[parser->named_count];
|
||||
parser_arg_t named[parser->named_count];
|
||||
memset(named, 0, parser->named_count);
|
||||
u64 named_index = 0;
|
||||
|
||||
arg_t flag[parser->flag_count];
|
||||
parser_arg_t flag[parser->flag_count];
|
||||
memset(flag, 0, parser->flag_count);
|
||||
u64 flag_index = 0;
|
||||
|
||||
for (u64 i = 0; i < parser->args_count; ++i) {
|
||||
const arg_t *arg = &(parser->args[i]);
|
||||
const parser_arg_t *arg = &(parser->args[i]);
|
||||
|
||||
switch (arg->type) {
|
||||
case ARG_TYPE_POSITIONAL:
|
||||
@ -176,7 +182,7 @@ void print_usage(argparser_t *parser) {
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < flag_index; ++i) {
|
||||
const arg_t *arg = &(flag[i]);
|
||||
const parser_arg_t *arg = &(flag[i]);
|
||||
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "[");
|
||||
sprintf(&(flag_args[strlen(flag_args)]), "\t");
|
||||
@ -186,12 +192,12 @@ void print_usage(argparser_t *parser) {
|
||||
sprintf(&(flag_args[strlen(flag_args)]), "-%s, ", arg->short_name);
|
||||
}
|
||||
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "--%s] ", arg->long_name);
|
||||
sprintf(&(flag_args[strlen(flag_args)]), "--%s\n", arg->long_name);
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "--%s] ", arg->identifier);
|
||||
sprintf(&(flag_args[strlen(flag_args)]), "--%s\n", arg->identifier);
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < named_index; ++i) {
|
||||
const arg_t *arg = &(named[i]);
|
||||
const parser_arg_t *arg = &(named[i]);
|
||||
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "[");
|
||||
sprintf(&(named_args[strlen(named_args)]), "\t");
|
||||
@ -201,33 +207,33 @@ void print_usage(argparser_t *parser) {
|
||||
sprintf(&(named_args[strlen(named_args)]), "-%s, ", arg->short_name);
|
||||
}
|
||||
|
||||
u64 name_length = strlen(arg->long_name);
|
||||
u64 name_length = strlen(arg->identifier);
|
||||
|
||||
char capitalised[name_length];
|
||||
memset(capitalised, 0, name_length);
|
||||
|
||||
strcpy(capitalised, arg->long_name);
|
||||
strcpy(capitalised, arg->identifier);
|
||||
|
||||
for (u64 i = 0; i < name_length; ++i) {
|
||||
capitalised[i] = toupper(capitalised[i]);
|
||||
}
|
||||
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "--%s %s] ", arg->long_name,
|
||||
sprintf(&(usage_line[strlen(usage_line)]), "--%s %s] ", arg->identifier,
|
||||
capitalised);
|
||||
sprintf(&(named_args[strlen(named_args)]), "--%s\n", arg->long_name);
|
||||
sprintf(&(named_args[strlen(named_args)]), "--%s\n", arg->identifier);
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < positional_index; ++i) {
|
||||
const arg_t *arg = &(named[i]);
|
||||
const parser_arg_t *arg = &(named[i]);
|
||||
|
||||
sprintf(&(positional_args[strlen(positional_args)]), "\t");
|
||||
|
||||
u64 name_length = strlen(arg->long_name);
|
||||
u64 name_length = strlen(arg->identifier);
|
||||
|
||||
char capitalised[name_length];
|
||||
memset(capitalised, 0, name_length);
|
||||
|
||||
strcpy(capitalised, arg->long_name);
|
||||
strcpy(capitalised, arg->identifier);
|
||||
|
||||
for (u64 i = 0; i < name_length; ++i) {
|
||||
capitalised[i] = toupper(capitalised[i]);
|
||||
|
15
argparser.h
15
argparser.h
@ -2,9 +2,18 @@
|
||||
#define ARGPARSER_H
|
||||
|
||||
#include "aliases.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct argparser argparser_t;
|
||||
|
||||
typedef struct {
|
||||
const char *identifier;
|
||||
union {
|
||||
const char *value;
|
||||
bool flag;
|
||||
};
|
||||
} arg_t;
|
||||
|
||||
typedef enum {
|
||||
ARG_TYPE_POSITIONAL,
|
||||
ARG_TYPE_NAMED,
|
||||
@ -13,12 +22,6 @@ typedef enum {
|
||||
COUNT_ARG_TYPE,
|
||||
} arg_type_t;
|
||||
|
||||
typedef struct {
|
||||
arg_type_t type;
|
||||
const char *short_name;
|
||||
const char *long_name;
|
||||
} arg_t;
|
||||
|
||||
typedef void (*parse_func_t)(arg_t arg, void *user_data);
|
||||
|
||||
argparser_t *create_parser(parse_func_t parse_func);
|
||||
|
Loading…
Reference in New Issue
Block a user