#include #include enum { CMD_TEST, CMD_SUB, OPT_NAME, OPT_NAME_VALUE, OPT_OTHER, OPT_OTHER_VALUE, OPT_VERBOSE, OPT_REALLY_VERBOSE, OPT_MODE, OPT_MODE_VALUE, OPT_MODE_VALUE2, ARG_FILE, ARG_MORE, }; const char *text = "No one rejects, dislikes, or avoids pleasure itself, because it is " "pleasure, but because those who do not know how to pursue pleasure " "rationally encounter consequences that are extremely painful. Nor " "again is there anyone who loves or pursues or desires to obtain " "pain of itself, because it is pain, but because occasionally " "circumstances occur in which toil and pain can procure him some " "great pleasure."; static int test_command( const b_command *self, const b_arglist *opt, const b_array *args) { printf("Hello, world!\n"); b_arglist_iterator it; b_arglist_iterator_begin( opt, B_COMMAND_INVALID_ID, B_COMMAND_INVALID_ID, &it); while (b_arglist_iterator_is_valid(&it)) { printf("opt:%u,arg:%u,i:%zu,value: %s\n", it.opt_id, it.value->val_id, it.i, it.value->val_str); b_arglist_iterator_next(&it); } return 0; } B_COMMAND(CMD_TEST, B_COMMAND_INVALID_ID) { B_COMMAND_NAME("test"); B_COMMAND_DESC("A test command."); B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); B_COMMAND_FUNCTION(test_command); B_COMMAND_OPTION(OPT_NAME) { B_OPTION_LONG_NAME("name"); B_OPTION_SHORT_NAME('n'); B_OPTION_DESC("The name of the data."); B_OPTION_ARG(OPT_NAME_VALUE) { B_ARG_NAME("name"); B_ARG_NR_VALUES(2); } } B_COMMAND_OPTION(OPT_OTHER) { B_OPTION_LONG_NAME("other"); B_OPTION_DESC(text); B_OPTION_ARG(OPT_OTHER_VALUE) { B_ARG_NAME("value"); B_ARG_NR_VALUES(B_ARG_1_OR_MORE_VALUES); } } B_COMMAND_OPTION(OPT_VERBOSE) { B_OPTION_LONG_NAME("verbose"); B_OPTION_SHORT_NAME('v'); B_OPTION_DESC("Show detailed log output."); } B_COMMAND_OPTION(OPT_REALLY_VERBOSE) { B_OPTION_LONG_NAME("really-verbose"); B_OPTION_SHORT_NAME('V'); B_OPTION_DESC("Show REALLY detailed log output."); } B_COMMAND_OPTION(OPT_MODE) { B_OPTION_SHORT_NAME('m'); B_OPTION_LONG_NAME("mode"); B_OPTION_DESC("modes to operate in."); B_OPTION_ARG(OPT_MODE_VALUE) { B_ARG_NAME("mode"); B_ARG_NR_VALUES(1); B_ARG_ALLOWED_VALUES("fast", "slow"); } B_OPTION_ARG(OPT_MODE_VALUE2) { B_ARG_NAME("mode2"); B_ARG_NR_VALUES(1); B_ARG_ALLOWED_VALUES("very-fast", "very-slow"); } } B_COMMAND_ARG(ARG_FILE) { B_ARG_NAME("file"); B_ARG_DESC("The file(s) to use"); B_ARG_NR_VALUES(2); } B_COMMAND_ARG(ARG_MORE) { B_ARG_NAME("more"); B_ARG_DESC("More args to use"); B_ARG_ALLOWED_VALUES("how", "wow"); B_ARG_NR_VALUES(2); } B_COMMAND_HELP_OPTION(); B_COMMAND_USAGE() { B_COMMAND_USAGE_OPT(OPT_NAME); B_COMMAND_USAGE_ARG(ARG_FILE); B_COMMAND_USAGE_ARG(ARG_MORE); } } B_COMMAND(CMD_SUB, CMD_TEST) { B_COMMAND_NAME("sub"); B_COMMAND_LONG_NAME("sub"); B_COMMAND_SHORT_NAME('S'); B_COMMAND_DESC("A test subcommand"); B_COMMAND_FLAGS(B_COMMAND_SHOW_HELP_BY_DEFAULT); B_COMMAND_FUNCTION(test_command); B_COMMAND_OPTION(OPT_NAME) { B_OPTION_LONG_NAME("name"); B_OPTION_SHORT_NAME('n'); B_OPTION_DESC("The name of the data"); B_OPTION_ARG(OPT_NAME_VALUE) { B_ARG_NAME("name"); } } B_COMMAND_OPTION(OPT_OTHER) { B_OPTION_LONG_NAME("other"); B_OPTION_SHORT_NAME('o'); B_OPTION_DESC("The other argument"); B_OPTION_ARG(OPT_OTHER_VALUE) { B_ARG_NAME("value"); } } B_COMMAND_HELP_OPTION(); } int main(int argc, const char **argv) { return b_command_dispatch(CMD_TEST, argc, argv); }