/***** includes *****/ #include /***** defines *****/ #define NUMBER_OF_LOWERCASE_LETTERS_IN_LATIN_ALPHABET 26 /***** enums *****/ enum util_cmdline_arg_type { UTIL_CMDLINE_ARG_TYPE_INTEGER_RANGE, UTIL_CMDLINE_ARG_TYPE_INTEGER, UTIL_CMDLINE_ARG_TYPE_FLAG, UTIL_CMDLINE_ARG_TYPE_STRING, UTIL_CMDLINE_ARG_TYPE_UNSET }; /***** structs *****/ struct util_cmdline_arg_integer_range { int long long unsigned integer_start, integer_end; }; struct util_cmdline_arg_integer { int long long unsigned integer; }; struct util_cmdline_arg_flag { enum flag flag; }; struct util_cmdline_arg_string { char *string; }; union util_cmdline_arg_data { struct util_cmdline_arg_integer_range integer_range; struct util_cmdline_arg_integer integer; struct util_cmdline_arg_flag flag; struct util_cmdline_arg_string string; }; struct util_cmdline_arg_letter_and_data { enum util_cmdline_arg_type arg_type; enum flag processed_flag; union util_cmdline_arg_data arg_data; }; struct util_cmdline_state { struct util_cmdline_arg_letter_and_data args[NUMBER_OF_LOWERCASE_LETTERS_IN_LATIN_ALPHABET]; }; /***** public protoypes *****/ void util_cmdline_init( struct util_cmdline_state *cs ); void util_cmdline_cleanup( struct util_cmdline_state *cs ); void util_cmdline_add_arg( struct util_cmdline_state *cs, char arg_letter, enum util_cmdline_arg_type arg_type ); int util_cmdline_process_args( struct util_cmdline_state *cs, int argc, char **argv ); void util_cmdline_get_arg_data( struct util_cmdline_state *cs, char arg_letter, union util_cmdline_arg_data **arg_data );