Compare commits

..

No commits in common. "refactor" and "main" have entirely different histories.

2 changed files with 26 additions and 35 deletions

View File

@ -8,16 +8,12 @@
#define INITIAL_SIZE 30 #define INITIAL_SIZE 30
INTERNAL arg_t help_arg = {ARG_TYPE_FLAG, "h", "help"};
void print_usage(argparser_t *parser); void print_usage(argparser_t *parser);
typedef struct {
arg_type_t type;
const char *identifier;
const char *short_name;
} parser_arg_t;
struct argparser { struct argparser {
parser_arg_t *args; arg_t *args;
u64 size; u64 size;
u64 args_count; u64 args_count;
u64 positional_count; u64 positional_count;
@ -25,8 +21,6 @@ struct argparser {
u64 flag_count; 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 *create_parser(parse_func_t parse_func) {
argparser_t *parser = (argparser_t *)malloc(sizeof(argparser_t)); argparser_t *parser = (argparser_t *)malloc(sizeof(argparser_t));
@ -34,7 +28,7 @@ argparser_t *create_parser(parse_func_t parse_func) {
return NULL; return NULL;
} }
parser->args = (parser_arg_t *)malloc(INITIAL_SIZE * sizeof(parser_arg_t)); parser->args = (arg_t *)malloc(INITIAL_SIZE * sizeof(arg_t));
if (!(parser->args)) { if (!(parser->args)) {
free(parser); free(parser);
@ -117,7 +111,7 @@ void parse_args(argparser_t *parser, i32 argc, char *argv[]) {
const char *long_name = &(argv[i][2]); const char *long_name = &(argv[i][2]);
if (strcmp(short_name, help_arg.short_name) == 0 || if (strcmp(short_name, help_arg.short_name) == 0 ||
strcmp(long_name, help_arg.identifier) == 0) { strcmp(long_name, help_arg.long_name) == 0) {
print_usage(parser); print_usage(parser);
exit(0); exit(0);
@ -132,20 +126,20 @@ void parse_args(argparser_t *parser, i32 argc, char *argv[]) {
} }
void print_usage(argparser_t *parser) { void print_usage(argparser_t *parser) {
parser_arg_t positional[parser->positional_count]; arg_t positional[parser->positional_count];
memset(positional, 0, parser->positional_count); memset(positional, 0, parser->positional_count);
u64 positional_index = 0; u64 positional_index = 0;
parser_arg_t named[parser->named_count]; arg_t named[parser->named_count];
memset(named, 0, parser->named_count); memset(named, 0, parser->named_count);
u64 named_index = 0; u64 named_index = 0;
parser_arg_t flag[parser->flag_count]; arg_t flag[parser->flag_count];
memset(flag, 0, parser->flag_count); memset(flag, 0, parser->flag_count);
u64 flag_index = 0; u64 flag_index = 0;
for (u64 i = 0; i < parser->args_count; ++i) { for (u64 i = 0; i < parser->args_count; ++i) {
const parser_arg_t *arg = &(parser->args[i]); const arg_t *arg = &(parser->args[i]);
switch (arg->type) { switch (arg->type) {
case ARG_TYPE_POSITIONAL: case ARG_TYPE_POSITIONAL:
@ -182,7 +176,7 @@ void print_usage(argparser_t *parser) {
} }
for (u64 i = 0; i < flag_index; ++i) { for (u64 i = 0; i < flag_index; ++i) {
const parser_arg_t *arg = &(flag[i]); const arg_t *arg = &(flag[i]);
sprintf(&(usage_line[strlen(usage_line)]), "["); sprintf(&(usage_line[strlen(usage_line)]), "[");
sprintf(&(flag_args[strlen(flag_args)]), "\t"); sprintf(&(flag_args[strlen(flag_args)]), "\t");
@ -192,12 +186,12 @@ void print_usage(argparser_t *parser) {
sprintf(&(flag_args[strlen(flag_args)]), "-%s, ", arg->short_name); sprintf(&(flag_args[strlen(flag_args)]), "-%s, ", arg->short_name);
} }
sprintf(&(usage_line[strlen(usage_line)]), "--%s] ", arg->identifier); sprintf(&(usage_line[strlen(usage_line)]), "--%s] ", arg->long_name);
sprintf(&(flag_args[strlen(flag_args)]), "--%s\n", arg->identifier); sprintf(&(flag_args[strlen(flag_args)]), "--%s\n", arg->long_name);
} }
for (u64 i = 0; i < named_index; ++i) { for (u64 i = 0; i < named_index; ++i) {
const parser_arg_t *arg = &(named[i]); const arg_t *arg = &(named[i]);
sprintf(&(usage_line[strlen(usage_line)]), "["); sprintf(&(usage_line[strlen(usage_line)]), "[");
sprintf(&(named_args[strlen(named_args)]), "\t"); sprintf(&(named_args[strlen(named_args)]), "\t");
@ -207,33 +201,33 @@ void print_usage(argparser_t *parser) {
sprintf(&(named_args[strlen(named_args)]), "-%s, ", arg->short_name); sprintf(&(named_args[strlen(named_args)]), "-%s, ", arg->short_name);
} }
u64 name_length = strlen(arg->identifier); u64 name_length = strlen(arg->long_name);
char capitalised[name_length]; char capitalised[name_length];
memset(capitalised, 0, name_length); memset(capitalised, 0, name_length);
strcpy(capitalised, arg->identifier); strcpy(capitalised, arg->long_name);
for (u64 i = 0; i < name_length; ++i) { for (u64 i = 0; i < name_length; ++i) {
capitalised[i] = toupper(capitalised[i]); capitalised[i] = toupper(capitalised[i]);
} }
sprintf(&(usage_line[strlen(usage_line)]), "--%s %s] ", arg->identifier, sprintf(&(usage_line[strlen(usage_line)]), "--%s %s] ", arg->long_name,
capitalised); capitalised);
sprintf(&(named_args[strlen(named_args)]), "--%s\n", arg->identifier); sprintf(&(named_args[strlen(named_args)]), "--%s\n", arg->long_name);
} }
for (u64 i = 0; i < positional_index; ++i) { for (u64 i = 0; i < positional_index; ++i) {
const parser_arg_t *arg = &(named[i]); const arg_t *arg = &(named[i]);
sprintf(&(positional_args[strlen(positional_args)]), "\t"); sprintf(&(positional_args[strlen(positional_args)]), "\t");
u64 name_length = strlen(arg->identifier); u64 name_length = strlen(arg->long_name);
char capitalised[name_length]; char capitalised[name_length];
memset(capitalised, 0, name_length); memset(capitalised, 0, name_length);
strcpy(capitalised, arg->identifier); strcpy(capitalised, arg->long_name);
for (u64 i = 0; i < name_length; ++i) { for (u64 i = 0; i < name_length; ++i) {
capitalised[i] = toupper(capitalised[i]); capitalised[i] = toupper(capitalised[i]);

View File

@ -2,18 +2,9 @@
#define ARGPARSER_H #define ARGPARSER_H
#include "aliases.h" #include "aliases.h"
#include <stdbool.h>
typedef struct argparser argparser_t; typedef struct argparser argparser_t;
typedef struct {
const char *identifier;
union {
const char *value;
bool flag;
};
} arg_t;
typedef enum { typedef enum {
ARG_TYPE_POSITIONAL, ARG_TYPE_POSITIONAL,
ARG_TYPE_NAMED, ARG_TYPE_NAMED,
@ -22,6 +13,12 @@ typedef enum {
COUNT_ARG_TYPE, COUNT_ARG_TYPE,
} arg_type_t; } 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); typedef void (*parse_func_t)(arg_t arg, void *user_data);
argparser_t *create_parser(parse_func_t parse_func); argparser_t *create_parser(parse_func_t parse_func);