summaryrefslogtreecommitdiff
path: root/src/options.c
diff options
context:
space:
mode:
authorJohn Hawthorn <john.hawthorn@gmail.com>2016-06-19 18:03:47 -0700
committerJohn Hawthorn <john.hawthorn@gmail.com>2016-06-19 18:03:47 -0700
commit45be23beb4f6b33f1764c64817062b213fd45e7d (patch)
tree2b736de10518d428a37a090fabad74c74cc10753 /src/options.c
parent26452f2efa488df369263d2a5ff661147ede5640 (diff)
Extract option parsing to separate file
Diffstat (limited to 'src/options.c')
-rw-r--r--src/options.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/options.c b/src/options.c
new file mode 100644
index 0000000..3150ead
--- /dev/null
+++ b/src/options.c
@@ -0,0 +1,104 @@
+#include <getopt.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "options.h"
+
+static const char *usage_str =
+ ""
+ "Usage: fzy [OPTION]...\n"
+ " -l, --lines=LINES Specify how many lines of results to show (default 10)\n"
+ " -p, --prompt=PROMPT Input prompt (default '> ')\n"
+ " -q, --query=QUERY Use QUERY as the initial search string\n"
+ " -e, --show-matches=QUERY Output the sorted matches of QUERY\n"
+ " -t, --tty=TTY Specify file to use as TTY device (default /dev/tty)\n"
+ " -s, --show-scores Show the scores of each match\n"
+ " -h, --help Display this help and exit\n"
+ " -v, --version Output version information and exit\n";
+
+static void usage(const char *argv0) {
+ fprintf(stderr, usage_str, argv0);
+}
+
+static struct option longopts[] = {{"show-matches", required_argument, NULL, 'e'},
+ {"query", required_argument, NULL, 'q'},
+ {"lines", required_argument, NULL, 'l'},
+ {"tty", required_argument, NULL, 't'},
+ {"prompt", required_argument, NULL, 'p'},
+ {"show-scores", no_argument, NULL, 's'},
+ {"version", no_argument, NULL, 'v'},
+ {"benchmark", optional_argument, NULL, 'b'},
+ {"help", no_argument, NULL, 'h'},
+ {NULL, 0, NULL, 0}};
+
+void options_set_defaults(options_t *options) {
+ /* set defaults */
+ options->benchmark = 0;
+ options->filter = NULL;
+ options->init_search = NULL;
+ options->tty_filename = "/dev/tty";
+ options->show_scores = 0;
+ options->num_lines = 10;
+ options->scrolloff = 1;
+ options->prompt = "> ";
+}
+
+void options_parse(options_t *options, int argc, char *argv[]) {
+ options_set_defaults(options);
+
+ char c;
+ while ((c = getopt_long(argc, argv, "vhse:q:l:t:p:", longopts, NULL)) != -1) {
+ switch (c) {
+ case 'v':
+ printf("%s " VERSION " (c) 2014 John Hawthorn\n", argv[0]);
+ exit(EXIT_SUCCESS);
+ case 's':
+ options->show_scores = 1;
+ break;
+ case 'q':
+ options->init_search = optarg;
+ break;
+ case 'e':
+ options->filter = optarg;
+ break;
+ case 'b':
+ if (optarg) {
+ if (sscanf(optarg, "%d", &options->benchmark) != 1) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ } else {
+ options->benchmark = 100;
+ }
+ break;
+ case 't':
+ options->tty_filename = optarg;
+ break;
+ case 'p':
+ options->prompt = optarg;
+ break;
+ case 'l': {
+ int l;
+ if (!strcmp(optarg, "max")) {
+ l = INT_MAX;
+ } else if (sscanf(optarg, "%d", &l) != 1 || l < 3) {
+ fprintf(stderr, "Invalid format for --lines: %s\n", optarg);
+ fprintf(stderr, "Must be integer in range 3..\n");
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ options->num_lines = l;
+ } break;
+ case 'h':
+ default:
+ usage(argv[0]);
+ exit(EXIT_SUCCESS);
+ }
+ }
+ if (optind != argc) {
+ usage(argv[0]);
+ exit(EXIT_FAILURE);
+ }
+}