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 <josuah.demangeon@gandi.net> 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 <sys/ioctl.h> 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
.
Response:
text/plain