SMOLNET PORTAL home about changes
iiomenu.c: horizontal mode with -l 0 - 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 695c25f7dc0613e9aa3e9057b333ec22c0e580f9	/scm/iomenu/commit/695c25f7dc0613e9aa3e9057b333ec22c0e580f9.gph	bitreich.org	70
1parent 5ac10691e817e4bfb903449a99614a1184d03a7e	/scm/iomenu/commit/5ac10691e817e4bfb903449a99614a1184d03a7e.gph	bitreich.org	70
hAuthor: Josuah Demangeon <josuah.demangeon@gandi.net>	URL:mailto:josuah.demangeon@gandi.net	bitreich.org	70
iDate:   Sun,  3 Sep 2017 20:09:12 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iiomenu.c: horizontal mode with -l 0	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M iomenu.c                            |     215 +++++++++++++++++++------------	Err	bitreich.org	70
i	Err	bitreich.org	70
i1 file changed, 135 insertions(+), 80 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@@ -14,6 +14,7 @@	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 	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@@ -53,6 +54,34 @@ die(const char *s)	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+        int    size = 0;	Err	bitreich.org	70
i+        size_t len;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        do {	Err	bitreich.org	70
i+                if (linec >= size) {	Err	bitreich.org	70
i+                        size += BUFSIZ;	Err	bitreich.org	70
i+                        linev  = realloc(linev,  sizeof (char **) * size);	Err	bitreich.org	70
i+                        matchv = realloc(matchv, sizeof (char **) * size);	Err	bitreich.org	70
i+                        if (!linev || !matchv)	Err	bitreich.org	70
i+                                die("realloc");	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                linev[linec] = malloc(LINE_MAX + 1);	Err	bitreich.org	70
i+                if (!(fgets(linev[linec], LINE_MAX, stdin))) {	Err	bitreich.org	70
i+                        free(linev[linec]);	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                len = strlen(linev[linec]);	Err	bitreich.org	70
i+                if (len > 0 && linec[linev][len - 1] == '\n')	Err	bitreich.org	70
i+                        linev[linec][len - 1] = '\0';	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        } while (++linec, ++matchc);	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         struct termios new;	Err	bitreich.org	70
i@@ -83,48 +112,73 @@ reset_terminal(void)	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(ttyfd, TCSANOW, &termios);	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+static size_t	Err	bitreich.org	70
i+str_width(char *s)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        int    size = 0;	Err	bitreich.org	70
i-        size_t len;	Err	bitreich.org	70
i+        int width = 0;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        do {	Err	bitreich.org	70
i-                if (linec >= size) {	Err	bitreich.org	70
i-                        size += BUFSIZ;	Err	bitreich.org	70
i-                        linev  = realloc(linev,  sizeof (char **) * size);	Err	bitreich.org	70
i-                        matchv = realloc(matchv, sizeof (char **) * size);	Err	bitreich.org	70
i-                        if (!linev || !matchv)	Err	bitreich.org	70
i-                                die("realloc");	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i+        while (*s) {	Err	bitreich.org	70
i+                if (*s++ == '\t')	Err	bitreich.org	70
i+                        width += (width + 7) % 8;	Err	bitreich.org	70
i+                else	Err	bitreich.org	70
i+                        width++;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-                linev[linec] = malloc(LINE_MAX + 1);	Err	bitreich.org	70
i-                if (!(fgets(linev[linec], LINE_MAX, stdin))) {	Err	bitreich.org	70
i-                        free(linev[linec]);	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i+        return width;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-                len = strlen(linev[linec]);	Err	bitreich.org	70
i-                if (len > 0 && linec[linev][len - 1] == '\n')	Err	bitreich.org	70
i-                        linev[linec][len - 1] = '\0';	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+prev_page(int pos, int cols)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int col;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        } while (++linec, ++matchc);	Err	bitreich.org	70
i+        pos -= pos > 0 ? 1 : 0;	Err	bitreich.org	70
i+        for (col = 0; pos > 0; pos--)	Err	bitreich.org	70
i+                if ((col += str_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 	Err	bitreich.org	70
i-static size_t	Err	bitreich.org	70
i-string_width(char *s)	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+next_page(int pos, int cols)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        int width = 0;	Err	bitreich.org	70
i+        int col;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        while (*s)	Err	bitreich.org	70
i-                if (*s++ == '\t')	Err	bitreich.org	70
i-                        width += (width + 7) % 8;	Err	bitreich.org	70
i+        for (col = 0; pos < matchc; pos++)	Err	bitreich.org	70
i+                if ((col += str_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 	Err	bitreich.org	70
i-        return width;	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+move(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+        for (i = current + sign; 0 <= i && i < matchc; i += sign) {	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+static void	Err	bitreich.org	70
i+move_page(signed int sign)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i = current - current % rows + rows * sign;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (!opt['l'])	Err	bitreich.org	70
i+                return;	Err	bitreich.org	70
i+	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 	Err	bitreich.org	70
i static char *	Err	bitreich.org	70
i@@ -149,10 +203,10 @@ format(char *str, int cols)	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-                str++;	Err	bitreich.org	70
i+                } else {	Err	bitreich.org	70
i+                        *fmt++ = '?';	Err	bitreich.org	70
i+                        col++;	Err	bitreich.org	70
i+                        str++;	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         *fmt = '\0';	Err	bitreich.org	70
i@@ -165,22 +219,51 @@ print_lines(void)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int printed = 0, i = current - current % rows;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        while (printed < rows && i < matchc) {	Err	bitreich.org	70
i+        for (; printed < rows && i < matchc; i++, printed++) {	Err	bitreich.org	70
i+                fprintf(stderr,	Err	bitreich.org	70
i+                        opt['#'] && matchv[i][0] == '#' ?	Err	bitreich.org	70
i+                        "\n\033[1m\033[K %s\033[m"      :	Err	bitreich.org	70
i+                        i == current                    ?	Err	bitreich.org	70
i+                        "\n\033[47;30m\033[K %s\033[m"      :	Err	bitreich.org	70
i+                        "\n\033[K %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+        while (printed++ < rows)	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-                char *s = format(matchv[i], ws.ws_col - 1);	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+print_segments(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i 	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-                else	Err	bitreich.org	70
i-                        fprintf(stderr, "\n\033[K %s",                  s);	Err	bitreich.org	70
i+        if (current < offset) {	Err	bitreich.org	70
i+                next   = offset;	Err	bitreich.org	70
i+                offset = prev_page(offset, ws.ws_col - MARGIN - 4);	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-                i++; printed++;	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, ws.ws_col - MARGIN - 4);	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+        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+                        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 static void	Err	bitreich.org	70
i@@ -188,10 +271,12 @@ 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-        fputs("\r\033[K", stderr);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        print_lines();	Err	bitreich.org	70
i-        fprintf(stderr, "\033[%dA\r", rows);	Err	bitreich.org	70
i+        if (opt['l'] > 0) {	Err	bitreich.org	70
i+                print_lines();	Err	bitreich.org	70
i+                fprintf(stderr, "\033[%dA\r", rows);	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@@ -219,34 +304,6 @@ match_line(char *line, char **tokv, int tokc)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i-move(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-        for (i = current + sign; 0 <= i && i < matchc; i += sign) {	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-static void	Err	bitreich.org	70
i-move_page(signed int sign)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int i = current - current % rows + rows * sign;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (!opt['l'])	Err	bitreich.org	70
i-                return;	Err	bitreich.org	70
i-	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-	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@@ -333,10 +390,8 @@ print_selection(void)	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static int	Err	bitreich.org	70
i-key(void)	Err	bitreich.org	70
i+key(int key)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        int key = fgetc(stdin);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i top:	Err	bitreich.org	70
i         switch (key) {	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -485,7 +540,7 @@ main(int argc, char *argv[])	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()) == CONTINUE)	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
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/iomenu/commit/695c25f7dc0613e...
Content-Typetext/plain; charset=utf-8