iSimplified the options. - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit f764d7df1ae0d98852309ebce4ed01bb25e0af38 /scm/iomenu/commit/f764d7df1ae0d98852309ebce4ed01bb25e0af38.gph bitreich.org 70 1parent 6b29b825670b511f255ef2f8bbd19db35aa68c58 /scm/iomenu/commit/6b29b825670b511f255ef2f8bbd19db35aa68c58.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:josuah.demangeon@gandi.net bitreich.org 70 iDate: Mon, 21 Aug 2017 02:05:47 +0200 Err bitreich.org 70 i Err bitreich.org 70 iSimplified the options. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.1 | 13 +++---------- Err bitreich.org 70 i M iomenu.c | 137 +++++++++---------------------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 42 insertions(+), 108 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/iomenu.1 b/iomenu.1 /scm/iomenu/file/iomenu.1.gph bitreich.org 70 i@@ -1,4 +1,4 @@ Err bitreich.org 70 i-.Dd mar 19, 2017 Err bitreich.org 70 i+.Dd aug 21, 2017 Err bitreich.org 70 i .Dt IOMENU 1 Err bitreich.org 70 i .Os Err bitreich.org 70 i . Err bitreich.org 70 i@@ -14,9 +14,7 @@ Err bitreich.org 70 i . Err bitreich.org 70 i . Err bitreich.org 70 i .Nm Err bitreich.org 70 i-.Op Fl t Err bitreich.org 70 i-.Op Fl b Err bitreich.org 70 i-.Op Fl s Err bitreich.org 70 i+.Op Fl # Err bitreich.org 70 i .Op Fl l Ar lines Err bitreich.org 70 i .Op Fl p Ar prompt Err bitreich.org 70 i . Err bitreich.org 70 i@@ -48,18 +46,13 @@ lines. Err bitreich.org 70 i Set the prompt to display at the beginning of the input to Err bitreich.org 70 i .Ar prompt . Err bitreich.org 70 i . Err bitreich.org 70 i-.It Fl s Err bitreich.org 70 i+.It Fl # Err bitreich.org 70 i If a line starts with Err bitreich.org 70 i .Li # , Err bitreich.org 70 i .Nm Err bitreich.org 70 i will interprete it as a header, which always matches, and can not be Err bitreich.org 70 i printed. Err bitreich.org 70 i . Err bitreich.org 70 i-.It Fl t Ns / Ns Fl b Err bitreich.org 70 i-Print the menu at the top / bottom rather than at current cursor Err bitreich.org 70 i-position. Err bitreich.org 70 i-Reset the cursor postition afterward. Err bitreich.org 70 i-.El Err bitreich.org 70 i . Err bitreich.org 70 i .Ss Selection control Err bitreich.org 70 i . Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -10,25 +10,21 @@ Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i #define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */ Err bitreich.org 70 i Err bitreich.org 70 i #define CONTROL(char) (char ^ 0x40) Err bitreich.org 70 i #define ALT(char) (char + 0x80) Err bitreich.org 70 i #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static struct winsize ws; Err bitreich.org 70 i static struct termios termios; Err bitreich.org 70 i-int tty_fd; Err bitreich.org 70 i- Err bitreich.org 70 i-static int current = 0, offset = 0, prev = 0, next = 0; Err bitreich.org 70 i+static int ttyfd; Err bitreich.org 70 i+static int current = 0, offset = 0, prev = 0, next = 0; Err bitreich.org 70 i static int linec = 0, matchc = 0; Err bitreich.org 70 i static char **linev = NULL, **matchv = NULL; Err bitreich.org 70 i-static char input[BUFSIZ], formatted[BUFSIZ * 8]; Err bitreich.org 70 i-static int opt_tb = 0, opt_l = 255, opt_h = 0; Err bitreich.org 70 i-static char *argv0, *opt_p = "", opt_s = '\0'; Err bitreich.org 70 i- Err bitreich.org 70 i+static char input[BUFSIZ], formatted[BUFSIZ * 8]; Err bitreich.org 70 i+static int opt[128]; Err bitreich.org 70 i+static char *prompt = ""; Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i free_all(void) Err bitreich.org 70 i@@ -42,18 +38,16 @@ free_all(void) Err bitreich.org 70 i free(matchv); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i die(const char *s) Err bitreich.org 70 i { Err bitreich.org 70 i- tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i- close(tty_fd); Err bitreich.org 70 i+ tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70 i+ close(ttyfd); Err bitreich.org 70 i free_all(); Err bitreich.org 70 i perror(s); Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i set_terminal(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -62,44 +56,33 @@ set_terminal(void) Err bitreich.org 70 i /* save cursor postition */ Err bitreich.org 70 i fputs("\033[s", stderr); Err bitreich.org 70 i Err bitreich.org 70 i- /* put cursor at the top / bottom */ Err bitreich.org 70 i- switch (opt_tb) { Err bitreich.org 70 i- case 't': fputs("\033[H", stderr); break; Err bitreich.org 70 i- case 'b': fprintf(stderr, "\033[%dH", ws.ws_row - opt_l); break; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i /* save attributes to `termios` */ Err bitreich.org 70 i- if (tcgetattr(tty_fd, &termios) < 0 || tcgetattr(tty_fd, &new) < 0) { Err bitreich.org 70 i+ if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) { Err bitreich.org 70 i perror("tcgetattr"); Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* change to raw mode */ Err bitreich.org 70 i new.c_lflag &= ~(ICANON | ECHO | IGNBRK); Err bitreich.org 70 i- tcsetattr(tty_fd, TCSANOW, &new); Err bitreich.org 70 i+ tcsetattr(ttyfd, TCSANOW, &new); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i reset_terminal(void) Err bitreich.org 70 i { Err bitreich.org 70 i- extern struct termios termios; Err bitreich.org 70 i- extern struct winsize ws; Err bitreich.org 70 i- Err bitreich.org 70 i int i; Err bitreich.org 70 i Err bitreich.org 70 i /* clear terminal */ Err bitreich.org 70 i- for (i = 0; i < opt_l + 1; i++) Err bitreich.org 70 i+ for (i = 0; i < opt['l'] + 1; i++) Err bitreich.org 70 i fputs("\r\033[K\n", stderr); Err bitreich.org 70 i Err bitreich.org 70 i /* reset cursor position */ Err bitreich.org 70 i fputs("\033[u", stderr); Err bitreich.org 70 i Err bitreich.org 70 i /* set terminal back to normal mode */ Err bitreich.org 70 i- tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i+ tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i read_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -136,12 +119,9 @@ read_lines(void) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static char * Err bitreich.org 70 i format(char *str, int cols) Err bitreich.org 70 i { Err bitreich.org 70 i- extern char formatted[BUFSIZ * 8]; Err bitreich.org 70 i- Err bitreich.org 70 i int i, j; Err bitreich.org 70 i Err bitreich.org 70 i for (i = j = 0; str[i] && j < cols; i++) { Err bitreich.org 70 i@@ -164,19 +144,15 @@ format(char *str, int cols) Err bitreich.org 70 i return formatted; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i print_lines(int count) Err bitreich.org 70 i { Err bitreich.org 70 i- extern int opt_l; Err bitreich.org 70 i- extern char opt_s; Err bitreich.org 70 i- Err bitreich.org 70 i int printed = 0, i = current / count * count; Err bitreich.org 70 i Err bitreich.org 70 i while (printed < count && i < matchc) { Err bitreich.org 70 i char *s = format(matchv[i], ws.ws_col - 1); Err bitreich.org 70 i Err bitreich.org 70 i- if (opt_s && matchv[i][0] == opt_s) { Err bitreich.org 70 i+ if (opt['#'] && matchv[i][0] == '#') { Err bitreich.org 70 i fprintf(stderr, "\n\033[1m\033[K %s\033[m", s); Err bitreich.org 70 i } else if (i == current) { Err bitreich.org 70 i fprintf(stderr, "\n\033[30;47m\033[K %s\033[m", s); Err bitreich.org 70 i@@ -191,14 +167,11 @@ print_lines(int count) Err bitreich.org 70 i fputs("\n\033[K", stderr); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i print_screen(void) Err bitreich.org 70 i { Err bitreich.org 70 i- extern char formatted[BUFSIZ * 8]; Err bitreich.org 70 i- Err bitreich.org 70 i int cols = ws.ws_col - 1, i; Err bitreich.org 70 i- int count = MIN(opt_l, ws.ws_row - 1); Err bitreich.org 70 i+ int count = MIN(opt['l'], ws.ws_row - 1); Err bitreich.org 70 i Err bitreich.org 70 i fputs("\r\033[K", stderr); Err bitreich.org 70 i Err bitreich.org 70 i@@ -209,8 +182,8 @@ print_screen(void) Err bitreich.org 70 i fputs("\r", stderr); Err bitreich.org 70 i Err bitreich.org 70 i /* prompt */ Err bitreich.org 70 i- if (opt_p[0] != '\0') { Err bitreich.org 70 i- format(opt_p, cols); Err bitreich.org 70 i+ if (*prompt) { Err bitreich.org 70 i+ format(prompt, cols); Err bitreich.org 70 i fputs("\033[30;47m ", stderr); Err bitreich.org 70 i for (i = 0; formatted[i]; i++) Err bitreich.org 70 i fputc(formatted[i], stderr); Err bitreich.org 70 i@@ -226,11 +199,10 @@ print_screen(void) Err bitreich.org 70 i fflush(stderr); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static int Err bitreich.org 70 i match_line(char *line, char **tokv, int tokc) Err bitreich.org 70 i { Err bitreich.org 70 i- if (opt_s && line[0] == opt_s) Err bitreich.org 70 i+ if (opt['#'] && line[0] == '#') Err bitreich.org 70 i return 2; Err bitreich.org 70 i Err bitreich.org 70 i while (tokc-- > 0) Err bitreich.org 70 i@@ -240,24 +212,19 @@ match_line(char *line, char **tokv, int tokc) Err bitreich.org 70 i return 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i move_line(signed int n) Err bitreich.org 70 i { Err bitreich.org 70 i- extern int current; Err bitreich.org 70 i- extern char **matchv; Err bitreich.org 70 i- Err bitreich.org 70 i int i; Err bitreich.org 70 i Err bitreich.org 70 i for (i = current + n; 0 <= i && i < matchc; i += n) { Err bitreich.org 70 i- if (!opt_s || matchv[i][0] != opt_s) { Err bitreich.org 70 i+ if (!opt['#'] || matchv[i][0] != '#') { Err bitreich.org 70 i current = i; Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i filter_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -287,11 +254,10 @@ filter_lines(void) Err bitreich.org 70 i Err bitreich.org 70 i free(tokv); Err bitreich.org 70 i Err bitreich.org 70 i- if (opt_s && matchv[current][0] == opt_s) Err bitreich.org 70 i+ if (opt['#'] && matchv[current][0] == '#') Err bitreich.org 70 i move_line(+1); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i remove_word_input() Err bitreich.org 70 i { Err bitreich.org 70 i@@ -307,7 +273,6 @@ remove_word_input() Err bitreich.org 70 i filter_lines(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i add_character(char key) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -321,19 +286,15 @@ add_character(char key) Err bitreich.org 70 i filter_lines(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i print_selection(void) Err bitreich.org 70 i { Err bitreich.org 70 i- extern int current; Err bitreich.org 70 i- extern char **matchv, input[BUFSIZ]; Err bitreich.org 70 i- Err bitreich.org 70 i /* header */ Err bitreich.org 70 i- if (opt_h && opt_s) { Err bitreich.org 70 i+ if (opt['#']) { Err bitreich.org 70 i char **match = matchv + current; Err bitreich.org 70 i Err bitreich.org 70 i while (--match >= matchv) { Err bitreich.org 70 i- if ((*match)[0] == opt_s) { Err bitreich.org 70 i+ if ((*match)[0] == '#') { Err bitreich.org 70 i fputs(*match, stdout); Err bitreich.org 70 i break; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -343,7 +304,7 @@ print_selection(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* input or selection */ Err bitreich.org 70 i- if (matchc == 0 || (opt_s && matchv[current][0] == opt_s)) { Err bitreich.org 70 i+ if (matchc == 0 || (opt['#'] && matchv[current][0] == '#')) { Err bitreich.org 70 i puts(input); Err bitreich.org 70 i } else { Err bitreich.org 70 i puts(matchv[current]); Err bitreich.org 70 i@@ -352,7 +313,6 @@ print_selection(void) Err bitreich.org 70 i fputs("\r\033[K", stderr); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static int Err bitreich.org 70 i input_key(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -407,11 +367,8 @@ top: Err bitreich.org 70 i return EXIT_SUCCESS; Err bitreich.org 70 i Err bitreich.org 70 i case 033: /* escape / alt */ Err bitreich.org 70 i- if (fgetc(stdin) == 'v') { Err bitreich.org 70 i- key = ALT('v'); Err bitreich.org 70 i- goto top; Err bitreich.org 70 i- } Err bitreich.org 70 i- break; Err bitreich.org 70 i+ key = ALT(fgetc(stdin)); Err bitreich.org 70 i+ goto top; Err bitreich.org 70 i Err bitreich.org 70 i default: Err bitreich.org 70 i add_character((char) key); Err bitreich.org 70 i@@ -420,7 +377,6 @@ top: Err bitreich.org 70 i return CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i /* Err bitreich.org 70 i * Listen for the user input and call the appropriate functions. Err bitreich.org 70 i */ Err bitreich.org 70 i@@ -434,71 +390,56 @@ input_get(void) Err bitreich.org 70 i while ((exit_code = input_key()) == CONTINUE) Err bitreich.org 70 i print_screen(); Err bitreich.org 70 i Err bitreich.org 70 i- tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i+ tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70 i Err bitreich.org 70 i return exit_code; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i sigwinch() Err bitreich.org 70 i { Err bitreich.org 70 i- extern struct winsize ws; Err bitreich.org 70 i- Err bitreich.org 70 i- /* get window size */ Err bitreich.org 70 i- if (ioctl(tty_fd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70 i+ if (ioctl(ttyfd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70 i die("ioctl"); Err bitreich.org 70 i- Err bitreich.org 70 i print_screen(); Err bitreich.org 70 i Err bitreich.org 70 i signal(SIGWINCH, sigwinch); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i usage(void) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "%s [-b] [-t] [-s] [-l lines] [-p prompt]\n", argv0); Err bitreich.org 70 i- Err bitreich.org 70 i+ fputs("iomenu [-#] [-l lines] [-p prompt]\n", stderr); Err bitreich.org 70 i exit(EXIT_FAILURE); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- Err bitreich.org 70 i int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i- extern char *opt_p, *argv0; Err bitreich.org 70 i- extern int opt_l; Err bitreich.org 70 i- Err bitreich.org 70 i int exit_code; Err bitreich.org 70 i Err bitreich.org 70 i- for (argv0 = argv[0], argv++, argc--; argc > 0; argv++, argc--) { Err bitreich.org 70 i+ memset(opt, 0, 128 * sizeof (int)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ opt['l'] = 255; Err bitreich.org 70 i+ for (argv++, argc--; argc > 0; argv++, argc--) { Err bitreich.org 70 i if (argv[0][0] != '-') Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i switch ((*argv)[1]) { Err bitreich.org 70 i case 'l': Err bitreich.org 70 i argv++; argc--; Err bitreich.org 70 i- if (argc == 0 || sscanf(*argv, "%d", &opt_l) <= 0) Err bitreich.org 70 i+ if (argc == 0 || sscanf(*argv, "%d", &opt['l']) <= 0) Err bitreich.org 70 i usage(); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i- case 't': opt_tb = 't'; break; Err bitreich.org 70 i- case 'b': opt_tb = 'b'; break; Err bitreich.org 70 i- Err bitreich.org 70 i case 'p': Err bitreich.org 70 i- argc--; argv++; Err bitreich.org 70 i+ argv++; argc--; Err bitreich.org 70 i if (argc == 0) Err bitreich.org 70 i usage(); Err bitreich.org 70 i- opt_p = *argv; Err bitreich.org 70 i- break; Err bitreich.org 70 i- Err bitreich.org 70 i- case 's': Err bitreich.org 70 i- opt_s = '#'; Err bitreich.org 70 i+ prompt = *argv; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i- case 'h': Err bitreich.org 70 i- opt_h = 1; Err bitreich.org 70 i+ case '#': Err bitreich.org 70 i+ opt['#'] = 1; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i default: Err bitreich.org 70 i@@ -513,14 +454,14 @@ main(int argc, char *argv[]) Err bitreich.org 70 i if (!freopen("/dev/tty", "r", stdin) || Err bitreich.org 70 i !freopen("/dev/tty", "w", stderr)) Err bitreich.org 70 i die("freopen"); Err bitreich.org 70 i- tty_fd = open("/dev/tty", O_RDWR); Err bitreich.org 70 i+ ttyfd = open("/dev/tty", O_RDWR); Err bitreich.org 70 i Err bitreich.org 70 i set_terminal(); Err bitreich.org 70 i sigwinch(); Err bitreich.org 70 i exit_code = input_get(); /* main loop */ Err bitreich.org 70 i reset_terminal(); Err bitreich.org 70 i- close(tty_fd); Err bitreich.org 70 i- free_all(); Err bitreich.org 70 i+ close(ttyfd); Err bitreich.org 70 i+ freeall(); Err bitreich.org 70 i Err bitreich.org 70 i- return exit_code; Err bitreich.org 70 i+ return exitcode; Err bitreich.org 70 i } Err bitreich.org 70 .