isupport for tabs in input line and long input string - 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 2c6e76a07ce8fd008e28001c8ab4afcb6acd2b6e /scm/iomenu/commit/2c6e76a07ce8fd008e28001c8ab4afcb6acd2b6e.gph bitreich.org 70 1parent 7563651b88d576f9cf06863ab10c9491f9f82d4e /scm/iomenu/commit/7563651b88d576f9cf06863ab10c9491f9f82d4e.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Sun, 19 Mar 2017 21:13:21 +0100 Err bitreich.org 70 i Err bitreich.org 70 isupport for tabs in input line and long input string Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 65 +++++++++++++------------------ Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 28 insertions(+), 37 deletions(-) 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@@ -9,15 +9,15 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-#define OFFSET 5 Err bitreich.org 70 i-#define CONTINUE 2 /* as opposed to EXIT_SUCCESS and EXIT_FAILURE */ Err bitreich.org 70 i+#define OFFSET 30 /* in horizontal mode, amount of space kept for writing */ 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 MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) Err bitreich.org 70 i #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-static struct winsize winsize; Err bitreich.org 70 i+static struct winsize ws; Err bitreich.org 70 i static struct termios termios; Err bitreich.org 70 i FILE *tty_fp = NULL; Err bitreich.org 70 i int tty_fd; Err bitreich.org 70 i@@ -26,8 +26,8 @@ static char input[BUFSIZ], formatted[BUFSIZ * 8]; 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 *opt_prompt = ""; Err bitreich.org 70 i-static int opt_lines = 0; Err bitreich.org 70 i+static char *opt_p = ""; Err bitreich.org 70 i+static int opt_l = 0; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -132,35 +132,33 @@ screen_width(char *str) 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-format_string(char *dest, char *src, int cols) 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 int j = 0; Err bitreich.org 70 i Err bitreich.org 70 i- for (int i = 0; src[i] && j < cols; i++) { Err bitreich.org 70 i+ for (int i = 0; str[i] && j < cols; i++) { Err bitreich.org 70 i Err bitreich.org 70 i- if (src[i] == '\t') { Err bitreich.org 70 i+ if (str[i] == '\t') { Err bitreich.org 70 i for (int t = (j + 7) % 8 + 1; t > 0 && j < cols; t--) Err bitreich.org 70 i- dest[j++] = ' '; Err bitreich.org 70 i+ formatted[j++] = ' '; Err bitreich.org 70 i } else { Err bitreich.org 70 i- dest[j++] = src[i]; Err bitreich.org 70 i+ formatted[j++] = str[i]; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- dest[j] = '\0'; Err bitreich.org 70 i+ formatted[j] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i- return j; 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_string(char *str, int current) Err bitreich.org 70 i { Err bitreich.org 70 i- format_string(formatted, str, winsize.ws_col - 2); Err bitreich.org 70 i- Err bitreich.org 70 i fputs(current ? "\033[30;47m" : "", stderr); Err bitreich.org 70 i- fputs(opt_lines ? "\033[K " : " ", stderr); Err bitreich.org 70 i- fprintf(stderr, "%s \033[m", formatted); Err bitreich.org 70 i+ fputs(opt_l ? "\033[K " : " ", stderr); Err bitreich.org 70 i+ fprintf(stderr, "%s \033[m", format(str, ws.ws_col - 2)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -206,11 +204,11 @@ print_columns(void) Err bitreich.org 70 i { Err bitreich.org 70 i if (current < offset) { Err bitreich.org 70 i next = offset; Err bitreich.org 70 i- offset = prev_page(offset, winsize.ws_col - 30 - 4); Err bitreich.org 70 i+ offset = prev_page(offset, ws.ws_col - OFFSET - 4); 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, winsize.ws_col - 30 - 4); Err bitreich.org 70 i+ next = next_page(offset, ws.ws_col - OFFSET - 4); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i fputs(offset > 0 ? "< " : " ", stderr); Err bitreich.org 70 i@@ -219,7 +217,7 @@ print_columns(void) Err bitreich.org 70 i print_string(matchv[i], i == current); Err bitreich.org 70 i Err bitreich.org 70 i if (next < matchc) Err bitreich.org 70 i- fprintf(stderr, "\033[%dC>", winsize.ws_col - 30); Err bitreich.org 70 i+ fprintf(stderr, "\033[%dC>", ws.ws_col - OFFSET); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -228,14 +226,14 @@ print_screen(void) Err bitreich.org 70 i { Err bitreich.org 70 i int count; Err bitreich.org 70 i Err bitreich.org 70 i- if (ioctl(tty_fd, TIOCGWINSZ, &winsize) < 0) Err bitreich.org 70 i+ if (ioctl(tty_fd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70 i die("ioctl"); Err bitreich.org 70 i Err bitreich.org 70 i- count = MIN(opt_lines, winsize.ws_row - 2); Err bitreich.org 70 i+ count = MIN(opt_l, ws.ws_row - 2); 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- if (opt_lines) { Err bitreich.org 70 i+ if (opt_l) { Err bitreich.org 70 i print_lines(count); Err bitreich.org 70 i fprintf(stderr, "\033[%dA", count + 1); Err bitreich.org 70 i Err bitreich.org 70 i@@ -244,7 +242,8 @@ print_screen(void) Err bitreich.org 70 i print_columns(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- fprintf(stderr, "\r%s %s", opt_prompt, input); Err bitreich.org 70 i+ format(input, opt_l || matchc == 0 ? ws.ws_col : OFFSET - 3); Err bitreich.org 70 i+ fprintf(stderr, "\r%s %s", opt_p, formatted); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -318,19 +317,11 @@ add_character(char key) 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- * Send the selection to stdout. 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 fputs("\r\033[K", stderr); Err bitreich.org 70 i- Err bitreich.org 70 i- if (matchc > 0) { Err bitreich.org 70 i- puts(matchv[current]); Err bitreich.org 70 i- } else { Err bitreich.org 70 i- puts(input); Err bitreich.org 70 i- } Err bitreich.org 70 i+ puts(matchc > 0 ? matchv[current] : input); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -345,7 +336,7 @@ input_key(void) Err bitreich.org 70 i switch (key) { Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('C'): Err bitreich.org 70 i- print_clear(opt_lines); Err bitreich.org 70 i+ print_clear(opt_l); Err bitreich.org 70 i return EXIT_FAILURE; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('U'): Err bitreich.org 70 i@@ -435,13 +426,13 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i switch (argv[i][1]) { Err bitreich.org 70 i case 'l': Err bitreich.org 70 i- if (++i >= argc || sscanf(argv[i], "%d", &opt_lines) <= 0) Err bitreich.org 70 i+ if (++i >= argc || sscanf(argv[i], "%d", &opt_l) <= 0) Err bitreich.org 70 i usage(); Err bitreich.org 70 i break; Err bitreich.org 70 i case 'p': Err bitreich.org 70 i if (++i >= argc) Err bitreich.org 70 i usage(); Err bitreich.org 70 i- opt_prompt = argv[i]; Err bitreich.org 70 i+ opt_p = argv[i]; Err bitreich.org 70 i break; Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i@@ -457,7 +448,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i exit_code = input_get(); Err bitreich.org 70 i Err bitreich.org 70 i tcsetattr(tty_fd, TCSANOW, &termios); Err bitreich.org 70 i- print_clear(opt_lines); Err bitreich.org 70 i+ print_clear(opt_l); Err bitreich.org 70 i fclose(tty_fp); Err bitreich.org 70 i close(tty_fd); Err bitreich.org 70 i free_all(); Err bitreich.org 70 .