diff options
-rwxr-xr-x | sor | 42 | ||||
-rw-r--r-- | walk.c | 39 |
2 files changed, 78 insertions, 3 deletions
@@ -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 <<EOF +For each line from standard input, evaluate the specified SNIPPETs under Bash +with the line as the argument. Print the line if any snippet exits with +status 0. + + --help display this help and exit +EOF +} + +ask_for_help() { + echo "Try 'sor --help' for more information." +} + +if ! temp=$(getopt -s bash -n sor -o '' -l help -- "$@"); then + ask_for_help >&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 @@ -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]); |