#ifndef __SCC_OPTPARSER_H__ #define __SCC_OPTPARSER_H__ typedef struct scc_optparse_opt { char prefix; char short_name; const char *long_name; const char *default_value; void (*invoke)(void *value); int min_args; int max_args; } scc_optparse_opt_t; #define SCC_OPTPARSE_OPT(prefix, short_name, long_name, min_args, max_args, \ default_value, invoke) \ {prefix, short_name, long_name, default_value, invoke, min_args, max_args} #define SCC_OPTPARSE_OPT_END() {0} typedef enum scc_optparse_error { SCC_OPT_ERROR_NONE, SCC_OPT_ERROR_NOT_FOUND_LONG_ARG, SCC_OPT_ERROR_NOT_FOUND_SHORT_ARG, SCC_OPT_ERROR_NOT_ENOUGH_ARGS, SCC_OPT_ERROR_TOO_MANY_ARGS, } scc_optparse_error_t; typedef struct scc_optparse_result { const scc_optparse_opt_t *opt; const char *value; int error; } scc_optparse_result_t; typedef struct { int argc; const char **argv; const scc_optparse_opt_t *opts; int handle_positional; int greedy_mode; struct { const scc_optparse_opt_t *opt; int count; // check for min_args <= count <= max_args int arg_pos; // for argv pos int opt_pos; // for short pos } current; } scc_optparse_t; void scc_optparse_init(scc_optparse_t *parser, int argc, const char **argv); void scc_optparse_drop(scc_optparse_t *parser); void scc_optparse_set(scc_optparse_t *parser, const scc_optparse_opt_t *opts); void scc_optparse_reset(scc_optparse_t *parser); int scc_optparse_parse(scc_optparse_t *parser, scc_optparse_result_t *res); #endif /* __SCC_OPTPARSER_H__ */