iiomenu.c, Makefile: style change and making it work on OpenBSD - 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 84dbca0112c08a49515d4bd94a37a6c859e19a7f /scm/iomenu/commit/84dbca0112c08a49515d4bd94a37a6c859e19a7f.gph bitreich.org 70
1parent 376d9cfc1451c3e416065b0fdd958c491b9b4a93 /scm/iomenu/commit/376d9cfc1451c3e416065b0fdd958c491b9b4a93.gph bitreich.org 70
hAuthor: Josuah Demangeon <mail@josuah.net> URL:mailto:mail@josuah.net bitreich.org 70
iDate: Mon, 23 Oct 2017 01:21:34 +0200 Err bitreich.org 70
i Err bitreich.org 70
iiomenu.c, Makefile: style change and making it work on OpenBSD Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M Makefile | 5 ++++- Err bitreich.org 70
i M iomenu.c | 103 +++++++++++-------------------- Err bitreich.org 70
i Err bitreich.org 70
i2 files changed, 41 insertions(+), 67 deletions(-) Err bitreich.org 70
i--- Err bitreich.org 70
1diff --git a/Makefile b/Makefile /scm/iomenu/file/Makefile.gph bitreich.org 70
i@@ -1,8 +1,11 @@ Err bitreich.org 70
i CFLAGS = -std=c89 -Wpedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L Err bitreich.org 70
i Err bitreich.org 70
i+OBJ = iomenu.o utf8.o Err bitreich.org 70
i+ Err bitreich.org 70
i all: iomenu Err bitreich.org 70
i Err bitreich.org 70
i-iomenu: iomenu.o utf8.o Err bitreich.org 70
i+iomenu: $(OBJ) Err bitreich.org 70
i+ $(CC) $(LDFLAGS) $(OBJ) -o $@ Err bitreich.org 70
i Err bitreich.org 70
i clean: Err bitreich.org 70
i rm -f *.o iomenu Err bitreich.org 70
1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70
i@@ -13,8 +13,11 @@ Err bitreich.org 70
i Err bitreich.org 70
i #include "utf8.h" 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-#define MARGIN 30 /* space for the input before the horizontal list */ Err bitreich.org 70
i+#ifndef SIGWINCH Err bitreich.org 70
i+#define SIGWINCH 28 Err bitreich.org 70
i+#endif Err bitreich.org 70
i+#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */ Err bitreich.org 70
i+#define MARGIN 30 /* space for the input before the horizontal list */ Err bitreich.org 70
i Err bitreich.org 70
i #define CTL(char) (char ^ 0x40) Err bitreich.org 70
i #define ALT(char) (char + 0x80) Err bitreich.org 70
i@@ -180,8 +183,10 @@ move(signed int sign) Err bitreich.org 70
i static void Err bitreich.org 70
i move_page(signed int sign) Err bitreich.org 70
i { Err bitreich.org 70
i+ int i; Err bitreich.org 70
i+ Err bitreich.org 70
i if (opt['l'] <= 0) { Err bitreich.org 70
i- if (sign > 0) { Err bitreich.org 70
i+ if (sign > 0) { Err bitreich.org 70
i offset = current = next; Err bitreich.org 70
i next = next_page(next); Err bitreich.org 70
i } else if (sign < 0) { Err bitreich.org 70
i@@ -189,11 +194,9 @@ move_page(signed int sign) Err bitreich.org 70
i offset = current = prev_page(offset); Err bitreich.org 70
i } Err bitreich.org 70
i } else { Err bitreich.org 70
i- int i = current - current % rows + rows * sign; Err bitreich.org 70
i- Err bitreich.org 70
i+ i = current - current % rows + rows * sign; Err bitreich.org 70
i if (!(0 < i && i < matchc)) Err bitreich.org 70
i return; Err bitreich.org 70
i- Err bitreich.org 70
i current = i - 1; Err bitreich.org 70
i move(+1); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -214,13 +217,11 @@ format(char *str, int cols) Err bitreich.org 70
i col++; Err bitreich.org 70
i } Err bitreich.org 70
i str++; Err bitreich.org 70
i- Err bitreich.org 70
i } else if (utf8_to_rune(&rune, str) && rune_is_print(rune)) { Err bitreich.org 70
i int i = utf8_len(str); Err bitreich.org 70
i while (i--) Err bitreich.org 70
i *fmt++ = *str++; Err bitreich.org 70
i col++; Err bitreich.org 70
i- Err bitreich.org 70
i } else { Err bitreich.org 70
i *fmt++ = '?'; Err bitreich.org 70
i col++; Err bitreich.org 70
i@@ -247,10 +248,8 @@ print_lines(void) Err bitreich.org 70
i format(matchv[i], ws.ws_col - 1) Err bitreich.org 70
i ); Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i while (printed++ < rows) Err bitreich.org 70
i fputs("\n\033[K", stderr); Err bitreich.org 70
i- Err bitreich.org 70
i fprintf(stderr, "\033[%dA\r\033[K", rows); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -262,27 +261,21 @@ print_segments(void) Err bitreich.org 70
i if (current < offset) { Err bitreich.org 70
i next = offset; Err bitreich.org 70
i offset = prev_page(offset); Err bitreich.org 70
i- Err bitreich.org 70
i } else if (current >= next) { Err bitreich.org 70
i offset = next; Err bitreich.org 70
i next = next_page(offset); Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i fprintf(stderr, "\r\033[K\033[%dC", MARGIN); Err bitreich.org 70
i fputs(offset > 0 ? "< " : " ", stderr); Err bitreich.org 70
i- Err bitreich.org 70
i for (i = offset; i < next && i < matchc; i++) { Err bitreich.org 70
i fprintf(stderr, Err bitreich.org 70
i opt['#'] && matchv[i][0] == '#' ? "\033[1m %s \033[m" : Err bitreich.org 70
i- i == current ? "\033[7m %s \033[m" : Err bitreich.org 70
i- " %s ", Err bitreich.org 70
i+ i == current ? "\033[7m %s \033[m" : " %s ", Err bitreich.org 70
i format(matchv[i], ws.ws_col - 1) Err bitreich.org 70
i ); Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i if (next < matchc) Err bitreich.org 70
i fprintf(stderr, "\033[%dC\b>", ws.ws_col - MARGIN); Err bitreich.org 70
i- Err bitreich.org 70
i fputc('\r', stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -291,21 +284,17 @@ print_screen(void) Err bitreich.org 70
i { Err bitreich.org 70
i int cols = ws.ws_col - 1; Err bitreich.org 70
i Err bitreich.org 70
i- if (opt['l'] > 0) { Err bitreich.org 70
i+ if (opt['l'] > 0) Err bitreich.org 70
i print_lines(); Err bitreich.org 70
i- } else { Err bitreich.org 70
i+ else Err bitreich.org 70
i print_segments(); Err bitreich.org 70
i- } Err bitreich.org 70
i- Err bitreich.org 70
i if (*prompt) { Err bitreich.org 70
i format(prompt, cols - 2); Err bitreich.org 70
i fprintf(stderr, "\033[30;47m %s \033[m", formatted); Err bitreich.org 70
i cols -= strlen(formatted) + 2; Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i fputc(' ', stderr); Err bitreich.org 70
i fputs(format(input, cols), stderr); Err bitreich.org 70
i- Err bitreich.org 70
i fflush(stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -314,7 +303,6 @@ match_line(char *line, char **tokv, int tokc) Err bitreich.org 70
i { 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 if (strstr(line, tokv[tokc]) == NULL) Err bitreich.org 70
i return 0; Err bitreich.org 70
i@@ -325,32 +313,28 @@ match_line(char *line, char **tokv, int tokc) Err bitreich.org 70
i static void Err bitreich.org 70
i filter(void) Err bitreich.org 70
i { Err bitreich.org 70
i- char **tokv = NULL, *s, buffer[sizeof (input)]; Err bitreich.org 70
i- int tokc = 0, n = 0, i; Err bitreich.org 70
i+ int tokc = 0; Err bitreich.org 70
i+ int n = 0; Err bitreich.org 70
i+ int i; Err bitreich.org 70
i+ char **tokv = NULL; Err bitreich.org 70
i+ char *s; Err bitreich.org 70
i+ char buffer[sizeof (input)]; Err bitreich.org 70
i Err bitreich.org 70
i current = offset = next = 0; Err bitreich.org 70
i- Err bitreich.org 70
i strcpy(buffer, input); Err bitreich.org 70
i- Err bitreich.org 70
i for (s = strtok(buffer, " "); s; s = strtok(NULL, " "), tokc++) { Err bitreich.org 70
i- Err bitreich.org 70
i if (tokc >= n) { Err bitreich.org 70
i tokv = realloc(tokv, ++n * sizeof (*tokv)); Err bitreich.org 70
i- Err bitreich.org 70
i if (tokv == NULL) Err bitreich.org 70
i die("realloc"); Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i tokv[tokc] = s; Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i matchc = 0; Err bitreich.org 70
i for (i = 0; i < linec; i++) Err bitreich.org 70
i if (match_line(linev[i], tokv, tokc)) Err bitreich.org 70
i matchv[matchc++] = linev[i]; Err bitreich.org 70
i- Err bitreich.org 70
i free(tokv); Err bitreich.org 70
i- Err bitreich.org 70
i if (opt['#'] && matchv[current][0] == '#') Err bitreich.org 70
i move(+1); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -358,53 +342,50 @@ filter(void) Err bitreich.org 70
i static void Err bitreich.org 70
i remove_word() Err bitreich.org 70
i { Err bitreich.org 70
i- int len = strlen(input) - 1, i; Err bitreich.org 70
i+ int len; Err bitreich.org 70
i+ int i; Err bitreich.org 70
i Err bitreich.org 70
i+ len = strlen(input) - 1; Err bitreich.org 70
i for (i = len; i >= 0 && isspace(input[i]); i--) Err bitreich.org 70
i input[i] = '\0'; Err bitreich.org 70
i- Err bitreich.org 70
i len = strlen(input) - 1; Err bitreich.org 70
i for (i = len; i >= 0 && !isspace(input[i]); i--) Err bitreich.org 70
i input[i] = '\0'; Err bitreich.org 70
i- Err bitreich.org 70
i filter(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i add_char(char key) Err bitreich.org 70
i { Err bitreich.org 70
i- int len = strlen(input); Err bitreich.org 70
i+ int len; Err bitreich.org 70
i Err bitreich.org 70
i+ len = strlen(input); Err bitreich.org 70
i if (isprint(key)) { Err bitreich.org 70
i input[len] = key; Err bitreich.org 70
i input[len + 1] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i filter(); 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- if (opt['#']) { Err bitreich.org 70
i- char **match = matchv + current; Err bitreich.org 70
i+ char **match; Err bitreich.org 70
i Err bitreich.org 70
i+ if (opt['#']) { Err bitreich.org 70
i+ match = matchv + current; Err bitreich.org 70
i while (--match >= matchv) { Err bitreich.org 70
i if ((*match)[0] == '#') { Err bitreich.org 70
i- fputs(*match, stdout); Err bitreich.org 70
i+ fputs(*match + 1, stdout); 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 putchar('\t'); Err bitreich.org 70
i } Err bitreich.org 70
i- Err bitreich.org 70
i- if (matchc == 0 || (opt['#'] && matchv[current][0] == '#')) { 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+ else Err bitreich.org 70
i puts(matchv[current]); Err bitreich.org 70
i- } 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 Err bitreich.org 70
i@@ -446,6 +427,7 @@ top: Err bitreich.org 70
i if (fgetc(stdin) != '~') Err bitreich.org 70
i break; Err bitreich.org 70
i /* fallthrough */ Err bitreich.org 70
i+ Err bitreich.org 70
i case ALT('v'): Err bitreich.org 70
i move_page(-1); Err bitreich.org 70
i break; Err bitreich.org 70
i@@ -454,12 +436,14 @@ top: Err bitreich.org 70
i if (fgetc(stdin) != '~') Err bitreich.org 70
i break; Err bitreich.org 70
i /* fallthrough */ Err bitreich.org 70
i+ Err bitreich.org 70
i case CTL('V'): Err bitreich.org 70
i move_page(+1); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CTL('I'): /* tab */ Err bitreich.org 70
i- if (linec > 0) strcpy(input, matchv[current]); Err bitreich.org 70
i+ if (linec > 0) Err bitreich.org 70
i+ strcpy(input, matchv[current]); Err bitreich.org 70
i filter(); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i@@ -488,10 +472,8 @@ sigwinch() Err bitreich.org 70
i { 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 rows = MIN(opt['l'], ws.ws_row - 1); 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@@ -506,35 +488,28 @@ static void Err bitreich.org 70
i parse_opt(int argc, char *argv[]) Err bitreich.org 70
i { 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- Err bitreich.org 70
i case 'l': Err bitreich.org 70
i if (!--argc || 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 'p': Err bitreich.org 70
i if (!--argc) Err bitreich.org 70
i usage(); Err bitreich.org 70
i prompt = *++argv; Err bitreich.org 70
i break; Err bitreich.org 70
i- 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 case 's': Err bitreich.org 70
i if (!--argc) Err bitreich.org 70
i usage(); Err bitreich.org 70
i opt['s'] = (int) **++argv; Err bitreich.org 70
i break; Err bitreich.org 70
i- Err bitreich.org 70
i default: Err bitreich.org 70
i usage(); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -547,23 +522,19 @@ main(int argc, char *argv[]) Err bitreich.org 70
i int exit_code; Err bitreich.org 70
i Err bitreich.org 70
i parse_opt(argc, argv); Err bitreich.org 70
i- Err bitreich.org 70
i read_stdin(); Err bitreich.org 70
i filter(); Err bitreich.org 70
i- Err bitreich.org 70
i- if (!freopen("/dev/tty", "r", stdin)) die("freopen /dev/tty"); Err bitreich.org 70
i- if (!freopen("/dev/tty", "w", stderr)) die("freopen /dev/tty"); Err bitreich.org 70
i- Err bitreich.org 70
i+ if (!freopen("/dev/tty", "r", stdin)) Err bitreich.org 70
i+ die("freopen /dev/tty"); Err bitreich.org 70
i+ if (!freopen("/dev/tty", "w", stderr)) Err bitreich.org 70
i+ die("freopen /dev/tty"); 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- Err bitreich.org 70
i input[0] = '\0'; Err bitreich.org 70
i while ((exit_code = key(fgetc(stdin))) == CONTINUE) Err bitreich.org 70
i print_screen(); Err bitreich.org 70
i print_screen(); Err bitreich.org 70
i- Err bitreich.org 70
i reset_terminal(); Err bitreich.org 70
i close(ttyfd); Err bitreich.org 70
i free_lines(); Err bitreich.org 70
.
Response:
text/plain