diff --git a/argparser.c b/argparser.c index db5096a..2dd6bd1 100644 --- a/argparser.c +++ b/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]); diff --git a/argparser.h b/argparser.h index 9259795..3b442e7 100644 --- a/argparser.h +++ b/argparser.h @@ -2,9 +2,18 @@ #define ARGPARSER_H #include "aliases.h" +#include 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);