#include #include #include #include typedef int util_main(int, char **); extern util_main true_main; extern util_main false_main; extern util_main basename_main; typedef struct futiles_util futiles_util_t; struct futiles_util { const char *name; util_main *main; }; int display_utils(int, char **); const futiles_util_t utils[] = { { .name = "futiles", .main = display_utils }, { .name = "true", .main = true_main }, { .name = "false", .main = false_main }, { .name = "basename", .main = basename_main } }; #define UTILS_NB (sizeof(utils) / sizeof(futiles_util_t)) int display_utils(int argc, char *argv[]) { (void) argc; (void) argv; printf("Available utils: "); for (size_t i = 1; i < UTILS_NB; i++) { printf("%s ", utils[i].name); } printf("\n"); return EXIT_SUCCESS; } int main(int argc, char *argv[]) { (void) argc; char *called_basename = basename(argv[0]); for (size_t i = 0; i < UTILS_NB; i++) { if (strcmp(called_basename, utils[i].name) == 0) { return utils[i].main(argc, argv); } } return EXIT_FAILURE; }