itab int stdin and multiple selection support. - 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 7563651b88d576f9cf06863ab10c9491f9f82d4e /scm/iomenu/commit/7563651b88d576f9cf06863ab10c9491f9f82d4e.gph bitreich.org 70 1parent 601965c26a8164917e4b817273a5af3c901bc98f /scm/iomenu/commit/601965c26a8164917e4b817273a5af3c901bc98f.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Sun, 19 Mar 2017 20:53:38 +0100 Err bitreich.org 70 i Err bitreich.org 70 itab int stdin and multiple selection support. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 48 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 44 insertions(+), 4 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@@ -22,7 +22,7 @@ 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 Err bitreich.org 70 i-static char input[BUFSIZ]; Err bitreich.org 70 i+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@@ -119,12 +119,48 @@ match_line(char *line, char **tokv, int tokc) 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+screen_width(char *str) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int len = 0; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (int i = 0; str[i]; i++, len++) Err bitreich.org 70 i+ if (str[i] == '\t') Err bitreich.org 70 i+ len += (len + 7) % 8; Err bitreich.org 70 i+ Err bitreich.org 70 i+ return len; 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+{ 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+ Err bitreich.org 70 i+ if (src[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+ } else { Err bitreich.org 70 i+ dest[j++] = src[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+ Err bitreich.org 70 i+ return j; 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", str); Err bitreich.org 70 i+ fprintf(stderr, "%s \033[m", formatted); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -149,7 +185,7 @@ prev_page(int pos, int cols) Err bitreich.org 70 i { Err bitreich.org 70 i pos -= pos > 0 ? 1 : 0; Err bitreich.org 70 i for (int col = 0; pos > 0; pos--) Err bitreich.org 70 i- if ((col += strlen(matchv[pos]) + 2) > cols) Err bitreich.org 70 i+ if ((col += screen_width(matchv[pos]) + 2) > cols) Err bitreich.org 70 i return pos + 1; Err bitreich.org 70 i return pos; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -159,7 +195,7 @@ static int Err bitreich.org 70 i next_page(int pos, int cols) Err bitreich.org 70 i { Err bitreich.org 70 i for (int col = 0; pos < matchc; pos++) Err bitreich.org 70 i- if ((col += strlen(matchv[pos]) + 2) > cols) Err bitreich.org 70 i+ if ((col += screen_width(matchv[pos]) + 2) > cols) Err bitreich.org 70 i return pos; Err bitreich.org 70 i return pos; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -341,6 +377,10 @@ input_key(void) Err bitreich.org 70 i filter_lines(); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i+ case CONTROL('Y'): Err bitreich.org 70 i+ print_selection(); Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ Err bitreich.org 70 i case CONTROL('J'): Err bitreich.org 70 i case CONTROL('M'): /* enter */ Err bitreich.org 70 i print_selection(); Err bitreich.org 70 .