diff options
-rw-r--r-- | bfs.h | 3 | ||||
-rw-r--r-- | eval.c | 4 | ||||
-rw-r--r-- | parse.c | 61 |
3 files changed, 66 insertions, 2 deletions
@@ -18,6 +18,9 @@ #include <sys/types.h> #include <time.h> +#define BFS_VERSION "0.0" +#define BFS_HOMEPAGE "https://github.com/tavianator/bfs" + /** * A command line expression. */ @@ -568,6 +568,10 @@ static int infer_fdlimit() { * Evaluate the command line. */ int eval_cmdline(const struct cmdline *cmdline) { + if (!cmdline->expr) { + return 0; + } + int nopenfd = infer_fdlimit(); struct callback_args args = { @@ -144,6 +144,8 @@ struct parser_state { bool warn; /** Whether any non-option arguments have been encountered. */ bool non_option_seen; + /** Whether an information option like -help or -version was passed. */ + bool just_info; /** The current time. */ struct timespec now; @@ -521,6 +523,37 @@ static struct expr *parse_type(struct parser_state *state, const char *option, e } /** + * "Parse" -help. + */ +static struct expr *parse_help(struct parser_state *state) { + printf("Usage: %s [arguments...]\n\n", state->argv[0]); + + printf("bfs is compatible with find; see find -help or man find for help with find-\n" + "compatible options :)\n\n"); + + printf("Extra features:\n" + " -color, -nocolor: Turn on or off file type colorization.\n\n" + " -hidden, -nohidden: Match hidden files, or filter them out.\n\n"); + + printf("%s\n", BFS_HOMEPAGE); + + state->just_info = true; + return NULL; +} + +/** + * "Parse" -version. + */ +static struct expr *parse_version(struct parser_state *state) { + printf("bfs %s\n\n", BFS_VERSION); + + printf("%s\n", BFS_HOMEPAGE); + + state->just_info = true; + return NULL; +} + +/** * LITERAL : OPTION * | TEST * | ACTION @@ -616,7 +649,9 @@ static struct expr *parse_literal(struct parser_state *state) { break; case 'h': - if (strcmp(arg, "-hidden") == 0) { + if (strcmp(arg, "-help") == 0) { + return parse_help(state); + } else if (strcmp(arg, "-hidden") == 0) { return new_test(state, eval_hidden); } break; @@ -693,6 +728,7 @@ static struct expr *parse_literal(struct parser_state *state) { if (strcmp(arg, "-samefile") == 0) { return parse_samefile(state, arg); } + break; case 't': if (strcmp(arg, "-true") == 0) { @@ -708,6 +744,12 @@ static struct expr *parse_literal(struct parser_state *state) { } break; + case 'v': + if (strcmp(arg, "-version") == 0) { + return parse_version(state); + } + break; + case 'w': if (strcmp(arg, "-warn") == 0) { state->warn = true; @@ -723,6 +765,15 @@ static struct expr *parse_literal(struct parser_state *state) { if (strcmp(arg, "-xtype") == 0) { return parse_type(state, arg, eval_xtype); } + break; + + case '-': + if (strcmp(arg, "--help") == 0) { + return parse_help(state); + } else if (strcmp(arg, "--version") == 0) { + return parse_version(state); + } + break; } fprintf(stderr, "Unknown argument '%s'.\n", arg); @@ -955,6 +1006,7 @@ struct cmdline *parse_cmdline(int argc, char *argv[]) { .implicit_print = true, .warn = true, .non_option_seen = false, + .just_info = false, }; if (clock_gettime(CLOCK_REALTIME, &state.now) != 0) { @@ -965,7 +1017,11 @@ struct cmdline *parse_cmdline(int argc, char *argv[]) { if (skip_paths(&state)) { cmdline->expr = parse_expr(&state); if (!cmdline->expr) { - goto fail; + if (state.just_info) { + goto done; + } else { + goto fail; + } } } @@ -996,6 +1052,7 @@ struct cmdline *parse_cmdline(int argc, char *argv[]) { cmdline->colors = parse_colors(getenv("LS_COLORS")); } +done: return cmdline; fail: |