From 66cdcec22a236171d2f630747e04d69c590f7dfc Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Mon, 16 Sep 2019 11:21:44 -0400 Subject: Support --help option --- sor | 42 ++++++++++++++++++++++++++++++++++++++++++ walk.c | 39 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/sor b/sor index 12f5652..0960db8 100755 --- a/sor +++ b/sor @@ -13,6 +13,48 @@ # See the License for the specific language governing permissions and # limitations under the License. +short_usage() { + echo 'Usage: sor SNIPPET...' +} + +help() { + short_usage + cat <&2 + exit 1 +fi +eval set -- "$temp" +unset temp +while true; do + case "$1" in + --help) + help + exit 0 + ;; + --) + shift + break + ;; + *) + echo >&2 'Internal error; please report.' + exit 1 + ;; + esac +done + while read file; do for test in "$@"; do if eval "$test \"$file\""; then diff --git a/walk.c b/walk.c index 6cce89a..8c20fd0 100644 --- a/walk.c +++ b/walk.c @@ -13,11 +13,22 @@ // limitations under the License. #include +#include #include #include #include #include +#include + +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]); -- cgit v1.2.3