#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 fx_command *self, const fx_arglist *opt, const fx_array *args) { printf("Hello, world!\n"); fx_arglist_iterator it; fx_arglist_iterator_begin( opt, FX_COMMAND_INVALID_ID, FX_COMMAND_INVALID_ID, &it); while (fx_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); fx_arglist_iterator_next(&it); } return 0; } FX_COMMAND(CMD_TEST, FX_COMMAND_INVALID_ID) { FX_COMMAND_NAME("test"); FX_COMMAND_DESC("A test command."); FX_COMMAND_FLAGS(FX_COMMAND_SHOW_HELP_BY_DEFAULT); FX_COMMAND_FUNCTION(test_command); FX_COMMAND_OPTION(OPT_NAME) { FX_OPTION_LONG_NAME("name"); FX_OPTION_SHORT_NAME('n'); FX_OPTION_DESC("The name of the data."); FX_OPTION_ARG(OPT_NAME_VALUE) { FX_ARG_NAME("name"); FX_ARG_NR_VALUES(2); } } FX_COMMAND_OPTION(OPT_OTHER) { FX_OPTION_LONG_NAME("other"); FX_OPTION_DESC(text); FX_OPTION_ARG(OPT_OTHER_VALUE) { FX_ARG_NAME("value"); FX_ARG_NR_VALUES(FX_ARG_1_OR_MORE_VALUES); } } FX_COMMAND_OPTION(OPT_VERBOSE) { FX_OPTION_LONG_NAME("verbose"); FX_OPTION_SHORT_NAME('v'); FX_OPTION_DESC("Show detailed log output."); } FX_COMMAND_OPTION(OPT_REALLY_VERBOSE) { FX_OPTION_LONG_NAME("really-verbose"); FX_OPTION_SHORT_NAME('V'); FX_OPTION_DESC("Show REALLY detailed log output."); } FX_COMMAND_OPTION(OPT_MODE) { FX_OPTION_SHORT_NAME('m'); FX_OPTION_LONG_NAME("mode"); FX_OPTION_DESC("modes to operate in."); FX_OPTION_ARG(OPT_MODE_VALUE) { FX_ARG_NAME("mode"); FX_ARG_NR_VALUES(1); FX_ARG_ALLOWED_VALUES("fast", "slow"); } FX_OPTION_ARG(OPT_MODE_VALUE2) { FX_ARG_NAME("mode2"); FX_ARG_NR_VALUES(1); FX_ARG_ALLOWED_VALUES("very-fast", "very-slow"); } } FX_COMMAND_ARG(ARG_FILE) { FX_ARG_NAME("file"); FX_ARG_DESC("The file(s) to use"); FX_ARG_NR_VALUES(2); } FX_COMMAND_ARG(ARG_MORE) { FX_ARG_NAME("more"); FX_ARG_DESC("More args to use"); FX_ARG_ALLOWED_VALUES("how", "wow"); FX_ARG_NR_VALUES(2); } FX_COMMAND_HELP_OPTION(); FX_COMMAND_USAGE() { FX_COMMAND_USAGE_OPT(OPT_NAME); FX_COMMAND_USAGE_ARG(ARG_FILE); FX_COMMAND_USAGE_ARG(ARG_MORE); } } FX_COMMAND(CMD_SUB, CMD_TEST) { FX_COMMAND_NAME("sub"); FX_COMMAND_LONG_NAME("sub"); FX_COMMAND_SHORT_NAME('S'); FX_COMMAND_DESC("A test subcommand"); FX_COMMAND_FLAGS(FX_COMMAND_SHOW_HELP_BY_DEFAULT); FX_COMMAND_FUNCTION(test_command); FX_COMMAND_OPTION(OPT_NAME) { FX_OPTION_LONG_NAME("name"); FX_OPTION_SHORT_NAME('n'); FX_OPTION_DESC("The name of the data"); FX_OPTION_ARG(OPT_NAME_VALUE) { FX_ARG_NAME("name"); } } FX_COMMAND_OPTION(OPT_OTHER) { FX_OPTION_LONG_NAME("other"); FX_OPTION_SHORT_NAME('o'); FX_OPTION_DESC("The other argument"); FX_OPTION_ARG(OPT_OTHER_VALUE) { FX_ARG_NAME("value"); } } FX_COMMAND_HELP_OPTION(); } int main(int argc, const char **argv) { return fx_command_dispatch(CMD_TEST, argc, argv); }