diff options
author | Benjamin Barenblat <bbaren@google.com> | 2019-09-16 11:21:44 -0400 |
---|---|---|
committer | Benjamin Barenblat <bbaren@google.com> | 2019-09-16 11:21:44 -0400 |
commit | 66cdcec22a236171d2f630747e04d69c590f7dfc (patch) | |
tree | 9b0c19ea67aad041f54c1be207b37c4609e44f40 /walk.c | |
parent | 82cd3de3f4acb0e7a19ebec91baa0eba0d23bd9b (diff) |
Support --help option
Diffstat (limited to 'walk.c')
-rw-r--r-- | walk.c | 39 |
1 files changed, 36 insertions, 3 deletions
@@ -13,11 +13,22 @@ // limitations under the License. #include <errno.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> +#include <getopt.h> + +static const char SHORT_USAGE[] = "Usage: walk [DIRECTORY...]\n"; + +static const char HELP[] = + "Recursively walk the specified directories (or current directory, if none is\n" + "specified.\n\n" + " --help display this help and exit\n"; + +static const char ASK_FOR_HELP[] = "Try 'walk --help' for more information.\n"; static const char *const JUST_CURRENT_DIRECTORY[] = {".", NULL}; @@ -86,11 +97,33 @@ static int walk(const char dirname[]) return r; } -int main(const int argc, const char *const argv[]) +int main(const int argc, char *const argv[]) { + static const struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0}, + }; + while (true) { + const int c = getopt_long(argc, argv, "", long_options, NULL); + if (c == -1) + break; + switch (c) { + case 'h': + fputs(SHORT_USAGE, stdout); + fputs(HELP, stdout); + return 0; + case '?': + fputs(ASK_FOR_HELP, stderr); + return 1; + default: + fputs("Internal error; please report.\n", stderr); + return 1; + } + } + int r = 0; - const char *const *const dirs = - argc == 1 ? JUST_CURRENT_DIRECTORY : argv + 1; + const char *const *const dirs = argc == optind ? JUST_CURRENT_DIRECTORY + : (const char *const *)argv + optind; for (int i = 0; dirs[i]; ++i) { puts(dirs[i]); r |= walk(dirs[i]); |