#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; extern util_main cat_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 }, { .name = "cat", .main = cat_main } }; #define UTILS_NB (sizeof(utils) / sizeof(futiles_util_t)) int display_utils([[maybe_unused]] int argc, [[maybe_unused]] char *argv[]) { fputs("Available utils: ", stdout); for (size_t i = 1; i < UTILS_NB; i++) { printf("%s ", utils[i].name); } putc('\n', stdout); return EXIT_SUCCESS; } int main(int argc, char *argv[]) { 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; }