switch to arg.h - iomenu - interactive terminal-based selection menu HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit bdefd3e959d83d05d65b5df6ce45e6d30b771984 DIR parent d6c740ae9f36ae68149a9c438664213aaff06e97 HTML Author: Josuah Demangeon <mail@josuah.net> Date: Sat, 17 Mar 2018 16:38:00 +0100 switch to arg.h Diffstat: A arg.h | 27 +++++++++++++++++++++++++++ M iomenu.c | 43 ++++++++++++------------------- 2 files changed, 43 insertions(+), 27 deletions(-) --- DIR diff --git a/arg.h b/arg.h @@ -0,0 +1,27 @@ +#ifndef ARG_H +#define ARG_H + +extern char *argv0; + +#define ARGBEGIN(argc, argv) \ + for (argv0 = *argv, argv++, argc--; \ + argv[0] != NULL && argv[0][0] == '-' && argv[0][1] != '\0'; \ + argc--, argv++) { \ + char **_argv, *_a; \ + if (argv[0][1] == '-' && argv[0][2] == '\0') { \ + argv++, argc--; \ + break; \ + } \ + for (_argv = argv, _a = *argv + 1; *_a != '\0'; _a++) { \ + switch (*_a) + +#define ARGEND \ + if (_argv != argv) \ + break; \ + } \ + } + +#define EARGF(x) \ + ((argv[1] == NULL) ? ((x), (char *)0) : (argc--, argv++, argv[0])) + +#endif DIR diff --git a/iomenu.c b/iomenu.c @@ -10,10 +10,10 @@ #include <string.h> #include <termios.h> #include <unistd.h> -#include <getopt.h> #include "utf8.h" #include "str.h" +#include "arg.h" #ifndef SIGWINCH #define SIGWINCH 28 @@ -27,12 +27,11 @@ static struct termios termios; struct winsize ws; static int ttyfd; - static int linec = 0, matchc = 0, cur = 0; static char **linev = NULL, **matchv = NULL; static char input[LINE_MAX], formatted[LINE_MAX * 8]; - -static int flag_hs = 0; +static int hsflag = 0; +char *argv0; /* ** Keep the line if it match every token (in no particular order, and allowed to @@ -41,7 +40,7 @@ static int flag_hs = 0; static int match_line(char *line, char **tokv) { - if (flag_hs && line[0] == '#') + if (hsflag && line[0] == '#') return 2; for (; *tokv != NULL; tokv++) if (strcasestr(line, *tokv) == NULL) @@ -122,7 +121,7 @@ move(int direction) int i; for (i = cur + direction; 0 <= i && i < matchc; i += direction) { - if (!flag_hs || matchv[i][0] != '#') { + if (!hsflag || matchv[i][0] != '#') { cur = i; break; } @@ -162,7 +161,7 @@ filter(int searchc, char **searchv) for (n = 0; n < searchc; n++) if (match_line(searchv[n], tokv)) matchv[matchc++] = searchv[n]; - if (flag_hs && matchv[cur][0] == '#') + if (hsflag && matchv[cur][0] == '#') move(+1); } @@ -221,7 +220,7 @@ print_selection(void) char **match; - if (flag_hs) { + if (hsflag) { match = matchv + cur; while (--match >= matchv) { if ((*match)[0] == '#') { @@ -231,7 +230,7 @@ print_selection(void) } putchar('\t'); } - if (matchc == 0 || (flag_hs && matchv[cur][0] == '#')) + if (matchc == 0 || (hsflag && matchv[cur][0] == '#')) puts(input); else puts(matchv[cur]); @@ -314,7 +313,7 @@ print_line(char *line, int highlight) { extern struct winsize ws; - if (flag_hs && line[0] == '#') + if (hsflag && line[0] == '#') fprintf(stderr, "\n\x1b[1m\r%.*s\x1b[m", utf8_col(line + 1, ws.ws_col, 0), line + 1); else if (highlight) @@ -399,22 +398,6 @@ usage(void) exit(EXIT_FAILURE); } -static void -parse_opt(int argc, char *argv[]) -{ - int c; - - while ((c = getopt(argc, argv, "#")) != -1) { - switch (c) { - case '#': - flag_hs = 1; - break; - default: - usage(); - } - } -} - void init(void) { @@ -445,7 +428,13 @@ main(int argc, char *argv[]) { int exit_code; - parse_opt(argc, argv); + ARGBEGIN(argc, argv) { + case '#': + hsflag = 1; + break; + default: + usage(); + } ARGEND init(); #ifdef __OpenBSD__