SMOLNET PORTAL home about changes
iuse utf8_col() instead of format() which used a buffer, remove -p flag - 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 1a73e9911476f01c8a4548f020b8def4e62bfe2b	/scm/iomenu/commit/1a73e9911476f01c8a4548f020b8def4e62bfe2b.gph	bitreich.org	70
1parent 00bb578f57d039ac6e6c2ce2835da575c78c76f3	/scm/iomenu/commit/00bb578f57d039ac6e6c2ce2835da575c78c76f3.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Thu, 18 Jan 2018 23:43:01 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
iuse utf8_col() instead of format() which used a buffer, remove -p flag	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M iomenu.1                            |      51 +++++++++++++++++++++++++++----	Err	bitreich.org	70
i  M iomenu.c                            |     149 ++++++++++++-------------------	Err	bitreich.org	70
i  M test.c                              |       6 +++---	Err	bitreich.org	70
i  M utf8.c                              |       4 ++--	Err	bitreich.org	70
i	Err	bitreich.org	70
i4 files changed, 107 insertions(+), 103 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,81 +1,120 @@	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+.	Err	bitreich.org	70
i .Sh NAME	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Nm iomenu	Err	bitreich.org	70
i .Nd interactive selection menu	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh SYNOPSIS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i .Op Fl #	Err	bitreich.org	70
i-.Op Fl p Ar prompt	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh DESCRIPTION	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Nm	Err	bitreich.org	70
i is an interactive filtering and selection tool for the terminal.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i It reads lines from standard input, and prompt for a selection.	Err	bitreich.org	70
i The selected line is printed to standard output.	Err	bitreich.org	70
i-.Bl -tag -width XXXXXXXXXXXXXXXX	Err	bitreich.org	70
i-.It Fl p Ar prompt	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+.Bl -tag -width 6n	Err	bitreich.org	70
i+.	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-.Pp	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh KEY BINDINGS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i An active selection is highlighted, and can be controlled with keybindings.	Err	bitreich.org	70
i As printable keys are entered, the lines are filtered to match each	Err	bitreich.org	70
i word from the input.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Bl -tag -width XXXXXXXXXXXXXXX	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Up Ns , Ic Down Ns , Ic Ctrl + p Ns , Ic Ctrl + n	Err	bitreich.org	70
i Move selection to the previous/next item.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic PageUp Ns , Ic PageDown Ns , Ic Alt + v Ns , Ic Ctrl + v	Err	bitreich.org	70
i Move one page up or down.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Ctrl + m Ns , Ic Ctrl + j Ns , Ic Enter	Err	bitreich.org	70
i Print the selection to the standard output, and exit 0.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Ctrl + h Ns , Ic Bakcspace	Err	bitreich.org	70
i Remove last character from current input.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Ctrl + w	Err	bitreich.org	70
i Remove last word from current input.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Ctrl + u	Err	bitreich.org	70
i Remove the whole input string.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .It Ic Ctrl + i Ns , Ic Tab	Err	bitreich.org	70
i Fill the input with current selection.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .El	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh EXIT STATUS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Ex -std	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh EXAMPLES	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i Go to a subdirectory:	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Bd -literal -offset XX	Err	bitreich.org	70
i cd "$(find . -type d | iomenu)"	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i Edit a file located in	Err	bitreich.org	70
i .Ev HOME :	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Bd -literal -offset XX	Err	bitreich.org	70
i $EDITOR "$(find "$HOME" -type f | iomenu)"	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i Play an audio file:	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Bd -literal -offset XX	Err	bitreich.org	70
i mplayer "$(find ~/Music | iomenu)"	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i Select a background job to attach to:	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Bd -literal -offset XX	Err	bitreich.org	70
i fg "%$(jobs | iomenu | cut -c 2)"	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Pp	Err	bitreich.org	70
i Filter "ps" output and print a process ID	Err	bitreich.org	70
i .Bd -literal -offset XX	Err	bitreich.org	70
i { printf '#'; ps ax; } | iomenu -# | sed -r 's/ *([0-9]*).*/\1/'	Err	bitreich.org	70
i .Ed	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh SEE ALSO	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Xr dmenu 1 ,	Err	bitreich.org	70
i .Xr slmenu 1 ,	Err	bitreich.org	70
i .Xr vis-menu 1	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .Sh AUTORS	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i .An Josuah Demangeon Aq Mt mail@josuah.net	Err	bitreich.org	70
1diff --git a/iomenu.c b/iomenu.c	/scm/iomenu/file/iomenu.c.gph	bitreich.org	70
i@@ -31,7 +31,6 @@ char                        **linev = NULL, **matchv = NULL;	Err	bitreich.org	70
i char                        input[LINE_MAX], formatted[LINE_MAX * 8];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i int                        flag_hs = 0;	Err	bitreich.org	70
i-char                        *flag_p = "";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i static char *	Err	bitreich.org	70
i io_strstr(const char *str1, const char *str2)	Err	bitreich.org	70
i@@ -39,7 +38,7 @@ io_strstr(const char *str1, const char *str2)	Err	bitreich.org	70
i         const char        *s1;	Err	bitreich.org	70
i         const char        *s2;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        while (1) {	Err	bitreich.org	70
i+        for (;;) {	Err	bitreich.org	70
i                 s1 = str1;	Err	bitreich.org	70
i                 s2 = str2;	Err	bitreich.org	70
i                 while (*s1 != '\0' && tolower(*s1) == tolower(*s2))	Err	bitreich.org	70
i@@ -73,7 +72,7 @@ match_line(char *line, char **tokv)	Err	bitreich.org	70
i  * Free the structures, reset the terminal state and exit with an error message.	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(const char *s)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         tcsetattr(ttyfd, TCSANOW, &termios);	Err	bitreich.org	70
i         close(ttyfd);	Err	bitreich.org	70
i@@ -96,10 +95,10 @@ split_lines(char *buf)	Err	bitreich.org	70
i         linec = 1;	Err	bitreich.org	70
i         for (b = buf; (b = strchr(b, '\n')) != NULL && b[1] != '\0'; b++)	Err	bitreich.org	70
i                 linec++;	Err	bitreich.org	70
i-        if ((lv = linev = calloc(linec + 1, sizeof (char **))) == NULL)	Err	bitreich.org	70
i-                die("calloc");	Err	bitreich.org	70
i-        if ((mv = matchv = calloc(linec + 1, sizeof (char **))) == NULL)	Err	bitreich.org	70
i-                die("calloc");	Err	bitreich.org	70
i+        if ((lv = linev = calloc(linec + 1, sizeof(char **))) == NULL)	Err	bitreich.org	70
i+                err("calloc");	Err	bitreich.org	70
i+        if ((mv = matchv = calloc(linec + 1, sizeof(char **))) == NULL)	Err	bitreich.org	70
i+                err("calloc");	Err	bitreich.org	70
i         *mv = *lv = b = buf;	Err	bitreich.org	70
i         while ((b = strchr(b, '\n')) != NULL) {	Err	bitreich.org	70
i                 *b = '\0';	Err	bitreich.org	70
i@@ -120,13 +119,13 @@ read_stdin(void)	Err	bitreich.org	70
i         size = BUFSIZ;	Err	bitreich.org	70
i         off = 0;	Err	bitreich.org	70
i         if ((buf = malloc(size)) == NULL)	Err	bitreich.org	70
i-                die("malloc");	Err	bitreich.org	70
i+                err("malloc");	Err	bitreich.org	70
i         while ((len = read(STDIN_FILENO, buf + off, size - off)) > 0) {	Err	bitreich.org	70
i                 off += len;	Err	bitreich.org	70
i                 if (off == size) {	Err	bitreich.org	70
i                         size *= 2;	Err	bitreich.org	70
i                         if ((buf = realloc(buf, size + 1)) == NULL)	Err	bitreich.org	70
i-                                die("realloc");	Err	bitreich.org	70
i+                                err("realloc");	Err	bitreich.org	70
i                 }	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         buf[off] = '\0';	Err	bitreich.org	70
i@@ -134,14 +133,14 @@ read_stdin(void)	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+move(int direction)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        int          matchc;	Err	bitreich.org	70
i+        extern char        **matchv;	Err	bitreich.org	70
i+        extern int        matchc;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         int        i;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (i = cur + sign; 0 <= i && i < matchc; i += sign) {	Err	bitreich.org	70
i+        for (i = cur + direction; 0 <= i && i < matchc; i += direction) {	Err	bitreich.org	70
i                 if (!flag_hs || matchv[i][0] != '#') {	Err	bitreich.org	70
i                         cur = i;	Err	bitreich.org	70
i                         break;	Err	bitreich.org	70
i@@ -171,7 +170,7 @@ filter(int searchc, char **searchv)	Err	bitreich.org	70
i         extern int        matchc, cur;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         int        n;	Err	bitreich.org	70
i-        char        *tokv[sizeof(input) / 2 * sizeof(char *) + sizeof(NULL)];	Err	bitreich.org	70
i+        char        *tokv[sizeof(input) * sizeof(char *) + sizeof(NULL)];	Err	bitreich.org	70
i         char        *s, buf[sizeof(input)];	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         strncpy(buf, input, sizeof(input));	Err	bitreich.org	70
i@@ -329,71 +328,35 @@ top:	Err	bitreich.org	70
i         return 1;	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 col)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        extern struct winsize        ws;	Err	bitreich.org	70
i-        extern char                formatted[LINE_MAX * 8];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        int        c, n, w;	Err	bitreich.org	70
i-        long        rune = 0;	Err	bitreich.org	70
i-        char        *fmt;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        fmt = formatted;	Err	bitreich.org	70
i-        for (c = 0; *str != '\0' && c < col; ) {	Err	bitreich.org	70
i-                if (*str == '\t') {	Err	bitreich.org	70
i-                        int t = 8 - c % 8;	Err	bitreich.org	70
i-                        while (t-- && c < col) {	Err	bitreich.org	70
i-                                *fmt++ = ' ';	Err	bitreich.org	70
i-                                c++;	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                        str++;	Err	bitreich.org	70
i-                } else if ((n = utf8_torune(&rune, str)) > 0 &&	Err	bitreich.org	70
i-                    (w = utf8_wcwidth(rune)) > 0) {	Err	bitreich.org	70
i-                        while (n--)	Err	bitreich.org	70
i-                                *fmt++ = *str++;	Err	bitreich.org	70
i-                        c += w;	Err	bitreich.org	70
i-                } else {	Err	bitreich.org	70
i-                        *fmt++ = '?';	Err	bitreich.org	70
i-                        str += n;	Err	bitreich.org	70
i-                        c ++;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        *fmt = '\0';	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return formatted;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i print_line(char *line, int highlight)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         extern        struct        winsize ws;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        if (flag_hs && line[0] == '#') {	Err	bitreich.org	70
i-                format(line + 1, ws.ws_col - 1);	Err	bitreich.org	70
i-                fprintf(stderr, "\n\x1b[1m %s\x1b[m", formatted);	Err	bitreich.org	70
i-        } else if (highlight) {	Err	bitreich.org	70
i-                format(line, ws.ws_col - 1);	Err	bitreich.org	70
i-                fprintf(stderr, "\n\x1b[47;30m\x1b[K %s\x1b[m", formatted);	Err	bitreich.org	70
i-        } else {	Err	bitreich.org	70
i-                format(line, ws.ws_col - 1);	Err	bitreich.org	70
i-                fprintf(stderr, "\n %s", formatted);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i+        if (flag_hs && line[0] == '#')	Err	bitreich.org	70
i+                fprintf(stderr, "\n\x1b[1m\r%.*s\x1b[m",	Err	bitreich.org	70
i+                    utf8_col(line + 1, ws.ws_col, 0), line + 1);	Err	bitreich.org	70
i+        else if (highlight)	Err	bitreich.org	70
i+                fprintf(stderr, "\n\x1b[47;30m\x1b[K\r%.*s\x1b[m",	Err	bitreich.org	70
i+                    utf8_col(line, ws.ws_col, 0), line);	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                fprintf(stderr, "\n%.*s",	Err	bitreich.org	70
i+                    utf8_col(line, ws.ws_col, 0), line);	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 struct winsize        ws;	Err	bitreich.org	70
i-        extern char                **matchv, *flag_p, input[LINE_MAX];	Err	bitreich.org	70
i+        extern char                **matchv, input[LINE_MAX];	Err	bitreich.org	70
i         extern int                matchc;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         char        **m;	Err	bitreich.org	70
i-        int          p, i, cols, rows;	Err	bitreich.org	70
i+        int          p, i, c, cols, rows;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        cols = ws.ws_col - 1;	Err	bitreich.org	70
i-        rows = ws.ws_row - 1;	Err	bitreich.org	70
i-        p = 0;	Err	bitreich.org	70
i+        cols = ws.ws_col;	Err	bitreich.org	70
i+        rows = ws.ws_row - 1;        /* keep one line for user input */	Err	bitreich.org	70
i+        p = c = 0;	Err	bitreich.org	70
i         i = cur - cur % rows;	Err	bitreich.org	70
i         m = matchv + i;	Err	bitreich.org	70
i         fputs("\x1b[2J", stderr);	Err	bitreich.org	70
i@@ -402,13 +365,7 @@ print_screen(void)	Err	bitreich.org	70
i                 p++, i++, m++;	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         fputs("\x1b[H", stderr);	Err	bitreich.org	70
i-        if (*flag_p) {	Err	bitreich.org	70
i-                format(flag_p, cols - 2);	Err	bitreich.org	70
i-                fprintf(stderr, "\x1b[30;47m %s \x1b[m", formatted);	Err	bitreich.org	70
i-                cols -= strlen(formatted) + 2;	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+        fprintf(stderr, "%.*s", utf8_col(input, cols, c), input);	Err	bitreich.org	70
i         fflush(stderr);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -448,7 +405,7 @@ sigwinch()	Err	bitreich.org	70
i         extern struct winsize        ws;	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("ioctl");	Err	bitreich.org	70
i         print_screen();	Err	bitreich.org	70
i         signal(SIGWINCH, sigwinch);	Err	bitreich.org	70
i }	Err	bitreich.org	70
i@@ -456,7 +413,7 @@ sigwinch()	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i usage(void)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        fputs("usage: iomenu [-#] [-p flag_p]\n", stderr);	Err	bitreich.org	70
i+        fputs("usage: iomenu [-#]\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@@ -466,17 +423,10 @@ usage(void)	Err	bitreich.org	70
i static void	Err	bitreich.org	70
i parse_opt(int argc, char *argv[])	Err	bitreich.org	70
i {	Err	bitreich.org	70
i-        extern char        *flag_p;	Err	bitreich.org	70
i-	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                 switch ((*argv)[1]) {	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-                        flag_p = *++argv;	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i                 case '#':	Err	bitreich.org	70
i                         flag_hs = 1;	Err	bitreich.org	70
i                         break;	Err	bitreich.org	70
i@@ -486,6 +436,26 @@ parse_opt(int argc, char *argv[])	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+init(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        extern char        input[LINE_MAX];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        input[0] = '\0';	Err	bitreich.org	70
i+        read_stdin();	Err	bitreich.org	70
i+        filter(linec, linev);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (freopen("/dev/tty", "r", stdin) == NULL)	Err	bitreich.org	70
i+                err("freopen /dev/tty");	Err	bitreich.org	70
i+        if (freopen("/dev/tty", "w", stderr) == NULL)	Err	bitreich.org	70
i+                err("freopen /dev/tty");	Err	bitreich.org	70
i+        if ((ttyfd = open("/dev/tty", O_RDWR)) < 0)	Err	bitreich.org	70
i+                err("open /dev/tty");	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+	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * Read stdin in a buffer, filling a table of lines, then re-open stdin to	Err	bitreich.org	70
i  * /dev/tty for an interactive (raw) session to let the user filter and select	Err	bitreich.org	70
i@@ -494,23 +464,18 @@ parse_opt(int argc, char *argv[])	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        input[LINE_MAX];	Err	bitreich.org	70
i-	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-        read_stdin();	Err	bitreich.org	70
i-        filter(linec, linev);	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-        set_terminal();	Err	bitreich.org	70
i-        sigwinch();	Err	bitreich.org	70
i-        input[0] = '\0';	Err	bitreich.org	70
i+        init();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#ifdef __OpenBSD__	Err	bitreich.org	70
i+        pledge("stdio tty", NULL);	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         while ((exit_code = key(fgetc(stdin))) > 0)	Err	bitreich.org	70
i                 print_screen();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i         print_screen();	Err	bitreich.org	70
i         reset_terminal();	Err	bitreich.org	70
i         close(ttyfd);	Err	bitreich.org	70
1diff --git a/test.c b/test.c	/scm/iomenu/file/test.c.gph	bitreich.org	70
i@@ -6,10 +6,10 @@ int	Err	bitreich.org	70
i main(void)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         int c, col, o, off;	Err	bitreich.org	70
i-        char s[] = "        浪漫的夢想";	Err	bitreich.org	70
i+        char s[] = "\t\t浪漫的夢想";	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (off = 0; off < 10; off++) {	Err	bitreich.org	70
i-                for (col = off + 1; col < 25; col++) {	Err	bitreich.org	70
i+        for (off = 0; off < 15; off++) {	Err	bitreich.org	70
i+                for (col = off + 1; col < 30; col++) {	Err	bitreich.org	70
i                         for (c = 0; c < col; c++)	Err	bitreich.org	70
i                                 putchar(c % 8 == 0 ? '>' : '_');	Err	bitreich.org	70
i                         printf(" %d\n", col);	Err	bitreich.org	70
1diff --git a/utf8.c b/utf8.c	/scm/iomenu/file/utf8.c.gph	bitreich.org	70
i@@ -173,14 +173,14 @@ utf8_col(char *str, int col, int off)	Err	bitreich.org	70
i         long rune;	Err	bitreich.org	70
i         char *pos, *s;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-        for (s = str; off < col;) {	Err	bitreich.org	70
i+        for (s = str; off <= col;) {	Err	bitreich.org	70
i                 pos = s;	Err	bitreich.org	70
i                 if (*s == '\0')	Err	bitreich.org	70
i                         break;	Err	bitreich.org	70
i 	Err	bitreich.org	70
i                 s += utf8_torune(&rune, s);	Err	bitreich.org	70
i                 if (rune == '\t')	Err	bitreich.org	70
i-                        off += 7 - (off) % 8;	Err	bitreich.org	70
i+                        off += 8 - (off % 8);	Err	bitreich.org	70
i                 else	Err	bitreich.org	70
i                         off += utf8_wcwidth(rune);	Err	bitreich.org	70
i         }	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/iomenu/commit/1a73e9911476f01...
Content-Typetext/plain; charset=utf-8