SMOLNET PORTAL home about changes
isplit into multiple files - 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 2743c784dbce7910cbec895c42a723f06fa7b620	/scm/iomenu/commit/2743c784dbce7910cbec895c42a723f06fa7b620.gph	bitreich.org	70
1parent e24cea688e69bd009ef52ea40891a0a386b881ea	/scm/iomenu/commit/e24cea688e69bd009ef52ea40891a0a386b881ea.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Sun, 29 Oct 2017 22:05:58 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
isplit into multiple files	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       4 +++-	Err	bitreich.org	70
i  A buffer.c                            |      93 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A buffer.h                            |       3 +++	Err	bitreich.org	70
i  A control.c                           |     169 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A control.h                           |       4 ++++	Err	bitreich.org	70
i  A display.c                           |     119 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A display.h                           |       2 ++	Err	bitreich.org	70
i  D iomenu.c                            |     543 -------------------------------	Err	bitreich.org	70
i  A iomenu.core                         |       0 	Err	bitreich.org	70
i  A main.c                              |     123 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A main.h                              |      29 +++++++++++++++++++++++++++++	Err	bitreich.org	70
i  M utf8.c                              |      13 +++++--------	Err	bitreich.org	70
i  M utf8.h                              |      12 ++++++------	Err	bitreich.org	70
i	Err	bitreich.org	70
i13 files changed, 556 insertions(+), 558 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,6 +1,6 @@	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+OBJ = buffer.o control.o display.o main.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@@ -15,3 +15,5 @@ install: iomenu	Err	bitreich.org	70
i         cp *.1    $(PREFIX)/share/man/man1	Err	bitreich.org	70
i         mkdir -p  $(PREFIX)/bin	Err	bitreich.org	70
i         cp iomenu $(PREFIX)/bin	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+.PHONY: all clean install	Err	bitreich.org	70
1diff --git a/buffer.c b/buffer.c	/scm/iomenu/file/buffer.c.gph	bitreich.org	70
i@@ -0,0 +1,93 @@	Err	bitreich.org	70
i+#include "buffer.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static char *	Err	bitreich.org	70
i+read_line(FILE *fp)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *line;	Err	bitreich.org	70
i+        size_t len;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        line = malloc(LINE_MAX + 1);	Err	bitreich.org	70
i+        if (!(fgets(line, LINE_MAX, fp))) {	Err	bitreich.org	70
i+                free(line);	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        len = strlen(line);	Err	bitreich.org	70
i+        if (len > 0 && line[len - 1] == '\n')	Err	bitreich.org	70
i+                line[len - 1] = '\0';	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return (line);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static int	Err	bitreich.org	70
i+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+        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+	Err	bitreich.org	70
i+        return 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+free_lines(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        if (linev) {	Err	bitreich.org	70
i+                for (; linec > 0; linec--)	Err	bitreich.org	70
i+                        free(linev[linec - 1]);	Err	bitreich.org	70
i+                free(linev);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        if (matchv)	Err	bitreich.org	70
i+                free(matchv);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+read_stdin(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int    size = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        while (1) {	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+                if ((linev[linec] = read_line(stdin)) == NULL)	Err	bitreich.org	70
i+                        break;	Err	bitreich.org	70
i+                linec++;	Err	bitreich.org	70
i+                matchc++;	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+filter(void)	Err	bitreich.org	70
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+        strcpy(buffer, input);	Err	bitreich.org	70
i+        for (s = strtok(buffer, " "); s; s = strtok(NULL, " "), tokc++) {	Err	bitreich.org	70
i+                if (tokc >= n) {	Err	bitreich.org	70
i+                        tokv = realloc(tokv, ++n * sizeof (*tokv));	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+                tokv[tokc] = s;	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+        free(tokv);	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
1diff --git a/buffer.h b/buffer.h	/scm/iomenu/file/buffer.h.gph	bitreich.org	70
i@@ -0,0 +1,3 @@	Err	bitreich.org	70
i+void free_lines (void);	Err	bitreich.org	70
i+void read_stdin (void);	Err	bitreich.org	70
i+void filter(void);	Err	bitreich.org	70
1diff --git a/control.c b/control.c	/scm/iomenu/file/control.c.gph	bitreich.org	70
i@@ -0,0 +1,169 @@	Err	bitreich.org	70
i+#include "control.h"	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+#define CSI(char) ((char) + 0x80 + 0x80)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static size_t	Err	bitreich.org	70
i+width(char *s)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int width = 0;	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 += 8 - (width % 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+        return width;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+prev_page(int pos)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int col, cols = ws.ws_col - MARGIN - 4;	Err	bitreich.org	70
i+	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 += 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+int	Err	bitreich.org	70
i+next_page(int pos)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int col, cols = ws.ws_col - MARGIN - 4;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (col = 0; pos < matchc; pos++)	Err	bitreich.org	70
i+                if ((col += 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+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;	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+                        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+                        next   = offset;	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+                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+                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+	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;	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+        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+        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 c)	Err	bitreich.org	70
i+{	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(c)) {	Err	bitreich.org	70
i+                input[len]     = c;	Err	bitreich.org	70
i+                input[len + 1] = '\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+int	Err	bitreich.org	70
i+key(int k)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+top:	Err	bitreich.org	70
i+        switch (k) {	Err	bitreich.org	70
i+        case CTL('C'):	Err	bitreich.org	70
i+                return EXIT_FAILURE;	Err	bitreich.org	70
i+        case CTL('U'):	Err	bitreich.org	70
i+                input[0] = '\0';	Err	bitreich.org	70
i+                filter();	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CTL('W'):	Err	bitreich.org	70
i+                remove_word();	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case 127:	Err	bitreich.org	70
i+        case CTL('H'):  /* backspace */	Err	bitreich.org	70
i+                input[strlen(input) - 1] = '\0';	Err	bitreich.org	70
i+                filter();	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CSI('A'):  /* up */	Err	bitreich.org	70
i+        case CTL('P'):	Err	bitreich.org	70
i+                move(-1);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CSI('B'):  /* down */	Err	bitreich.org	70
i+        case CTL('N'):	Err	bitreich.org	70
i+                move(+1);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CSI('5'):  /* page up */	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+        case ALT('v'):	Err	bitreich.org	70
i+                move_page(-1);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CSI('6'):  /* page down */	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+        case CTL('V'):	Err	bitreich.org	70
i+                move_page(+1);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case CTL('I'):  /* tab */	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+        case CTL('J'):  /* enter */	Err	bitreich.org	70
i+        case CTL('M'):	Err	bitreich.org	70
i+                print_selection();	Err	bitreich.org	70
i+                return EXIT_SUCCESS;	Err	bitreich.org	70
i+        case ALT('['):	Err	bitreich.org	70
i+                k = CSI(fgetc(stdin));	Err	bitreich.org	70
i+                goto top;	Err	bitreich.org	70
i+        case 0x1b: /* escape / alt */	Err	bitreich.org	70
i+                k = ALT(fgetc(stdin));	Err	bitreich.org	70
i+                goto top;	Err	bitreich.org	70
i+        default:	Err	bitreich.org	70
i+                add_char((char) k);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return CONTINUE;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/control.h b/control.h	/scm/iomenu/file/control.h.gph	bitreich.org	70
i@@ -0,0 +1,4 @@	Err	bitreich.org	70
i+int  prev_page (int);	Err	bitreich.org	70
i+int  next_page (int);	Err	bitreich.org	70
i+void move      (signed int);	Err	bitreich.org	70
i+int  key       (int);	Err	bitreich.org	70
1diff --git a/display.c b/display.c	/scm/iomenu/file/display.c.gph	bitreich.org	70
i@@ -0,0 +1,119 @@	Err	bitreich.org	70
i+#include "display.h"	Err	bitreich.org	70
i+	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   col = 0;	Err	bitreich.org	70
i+        long  rune = 0;	Err	bitreich.org	70
i+        char *fmt = formatted;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        while (*str && col < cols) {	Err	bitreich.org	70
i+                if (*str == '\t') {	Err	bitreich.org	70
i+                        int t = 8 - col % 8;	Err	bitreich.org	70
i+                        while (t-- && col < cols) {	Err	bitreich.org	70
i+                                *fmt++ = ' ';	Err	bitreich.org	70
i+                                col++;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        str++;	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+                } 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+	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_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+        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\x1b[1m\x1b[K %s\x1b[m"      :	Err	bitreich.org	70
i+                        i == current                    ?	Err	bitreich.org	70
i+                        "\n\x1b[47;30m\x1b[K %s\x1b[m"      :	Err	bitreich.org	70
i+                        "\n\x1b[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+        while (printed++ < rows)	Err	bitreich.org	70
i+                fputs("\n\x1b[K", stderr);	Err	bitreich.org	70
i+        fprintf(stderr, "\x1b[%dA\r\x1b[K", rows);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	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 (current < offset) {	Err	bitreich.org	70
i+                next   = offset;	Err	bitreich.org	70
i+                offset = prev_page(offset);	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+        fprintf(stderr, "\r\x1b[K\x1b[%dC", MARGIN);	Err	bitreich.org	70
i+        fputs(offset > 0 ? "< " : "  ", stderr);	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] == '#' ? "\x1b[1m %s \x1b[m" :	Err	bitreich.org	70
i+                        i == current ? "\x1b[7m %s \x1b[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+        if (next < matchc)	Err	bitreich.org	70
i+                fprintf(stderr, "\x1b[%dC\b>", ws.ws_col - MARGIN);	Err	bitreich.org	70
i+        fputc('\r', stderr);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+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+                print_lines();	Err	bitreich.org	70
i+        else	Err	bitreich.org	70
i+                print_segments();	Err	bitreich.org	70
i+        if (*prompt) {	Err	bitreich.org	70
i+                format(prompt, 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+        fflush(stderr);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+print_selection(void)	Err	bitreich.org	70
i+{	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 + 1, stdout);	Err	bitreich.org	70
i+                                break;	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+        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+                puts(matchv[current]);	Err	bitreich.org	70
i+        fputs("\r\x1b[K", stderr);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/display.h b/display.h	/scm/iomenu/file/display.h.gph	bitreich.org	70
i@@ -0,0 +1,2 @@	Err	bitreich.org	70
i+void print_screen    (void);	Err	bitreich.org	70
i+void print_selection (void);	Err	bitreich.org	70
1diff --git a/iomenu.c b/iomenu.c	/scm/iomenu/file/iomenu.c.gph	bitreich.org	70
i@@ -1,543 +0,0 @@	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i-#include <fcntl.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-#include <locale.h>	Err	bitreich.org	70
i-#include <signal.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <termios.h>	Err	bitreich.org	70
i-#include <unistd.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <sys/ioctl.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "utf8.h"	Err	bitreich.org	70
i-	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-#define  CSI(char) (char + 0x80 + 0x80)	Err	bitreich.org	70
i-#define  MIN(X, Y) (((X) < (Y)) ? (X) : (Y))	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static struct winsize ws;	Err	bitreich.org	70
i-static struct termios termios;	Err	bitreich.org	70
i-static int            ttyfd;	Err	bitreich.org	70
i-static int            current = 0, offset = 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           input[LINE_MAX], formatted[LINE_MAX * 8];	Err	bitreich.org	70
i-static int            opt[128], rows = 0;	Err	bitreich.org	70
i-static char          *prompt = "";	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-free_lines(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        if (linev) {	Err	bitreich.org	70
i-                for (; linec > 0; linec--)	Err	bitreich.org	70
i-                        free(linev[linec - 1]);	Err	bitreich.org	70
i-                free(linev);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        if (matchv)	Err	bitreich.org	70
i-                free(matchv);	Err	bitreich.org	70
i-}	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	bitreich.org	70
i-        tcsetattr(ttyfd, TCSANOW, &termios);	Err	bitreich.org	70
i-        close(ttyfd);	Err	bitreich.org	70
i-        free_lines();	Err	bitreich.org	70
i-        perror(s);	Err	bitreich.org	70
i-        exit(EXIT_FAILURE);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static char *	Err	bitreich.org	70
i-read_line(FILE *fp)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        char *line;	Err	bitreich.org	70
i-        size_t len;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        line = malloc(LINE_MAX + 1);	Err	bitreich.org	70
i-        if (!(fgets(line, LINE_MAX, fp))) {	Err	bitreich.org	70
i-                free(line);	Err	bitreich.org	70
i-                return NULL;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        len = strlen(line);	Err	bitreich.org	70
i-        if (len > 0 && line[len - 1] == '\n')	Err	bitreich.org	70
i-                line[len - 1] = '\0';	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return (line);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-read_stdin(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int    size = 0;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        while (1) {	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-                if ((linev[linec] = read_line(stdin)) == NULL)	Err	bitreich.org	70
i-                        break;	Err	bitreich.org	70
i-                linec++;	Err	bitreich.org	70
i-                matchc++;	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-set_terminal(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        struct termios new;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* save currentsor postition */	Err	bitreich.org	70
i-        fputs("\x1b[s", stderr);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* save attributes to `termios` */	Err	bitreich.org	70
i-        if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) {	Err	bitreich.org	70
i-                perror("tcgetattr");	Err	bitreich.org	70
i-                exit(EXIT_FAILURE);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* change to raw mode */	Err	bitreich.org	70
i-        new.c_lflag &= ~(ICANON | ECHO | IGNBRK | IEXTEN | ISIG);	Err	bitreich.org	70
i-        tcsetattr(ttyfd, TCSANOW, &new);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-reset_terminal(void)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int i;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* clear terminal */	Err	bitreich.org	70
i-        for (i = 0; i < rows + 1; i++)	Err	bitreich.org	70
i-                fputs("\r\x1b[K\n", stderr);	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        /* reset currentsor position */	Err	bitreich.org	70
i-        fputs("\x1b[u", stderr);	Err	bitreich.org	70
i-	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 size_t	Err	bitreich.org	70
i-width(char *s)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int width = 0;	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 += 8 - (width % 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-        return width;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-prev_page(int pos)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int col, cols = ws.ws_col - MARGIN - 4;	Err	bitreich.org	70
i-	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 += 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 int	Err	bitreich.org	70
i-next_page(int pos)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        int col, cols = ws.ws_col - MARGIN - 4;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        for (col = 0; pos < matchc; pos++)	Err	bitreich.org	70
i-                if ((col += 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-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;	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-                        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-                        next   = offset;	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-                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-                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-	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   col = 0;	Err	bitreich.org	70
i-        long  rune = 0;	Err	bitreich.org	70
i-        char *fmt = formatted;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        while (*str && col < cols) {	Err	bitreich.org	70
i-                if (*str == '\t') {	Err	bitreich.org	70
i-                        int t = 8 - col % 8;	Err	bitreich.org	70
i-                        while (t-- && col < cols) {	Err	bitreich.org	70
i-                                *fmt++ = ' ';	Err	bitreich.org	70
i-                                col++;	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                        str++;	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-                } 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-	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_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-        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\x1b[1m\x1b[K %s\x1b[m"      :	Err	bitreich.org	70
i-                        i == current                    ?	Err	bitreich.org	70
i-                        "\n\x1b[47;30m\x1b[K %s\x1b[m"      :	Err	bitreich.org	70
i-                        "\n\x1b[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-        while (printed++ < rows)	Err	bitreich.org	70
i-                fputs("\n\x1b[K", stderr);	Err	bitreich.org	70
i-        fprintf(stderr, "\x1b[%dA\r\x1b[K", rows);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	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 (current < offset) {	Err	bitreich.org	70
i-                next   = offset;	Err	bitreich.org	70
i-                offset = prev_page(offset);	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-        fprintf(stderr, "\r\x1b[K\x1b[%dC", MARGIN);	Err	bitreich.org	70
i-        fputs(offset > 0 ? "< " : "  ", stderr);	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] == '#' ? "\x1b[1m %s \x1b[m" :	Err	bitreich.org	70
i-                        i == current ? "\x1b[7m %s \x1b[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-        if (next < matchc)	Err	bitreich.org	70
i-                fprintf(stderr, "\x1b[%dC\b>", ws.ws_col - MARGIN);	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-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-                print_lines();	Err	bitreich.org	70
i-        else	Err	bitreich.org	70
i-                print_segments();	Err	bitreich.org	70
i-        if (*prompt) {	Err	bitreich.org	70
i-                format(prompt, 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-        fflush(stderr);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-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-        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-	Err	bitreich.org	70
i-        return 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-        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-        strcpy(buffer, input);	Err	bitreich.org	70
i-        for (s = strtok(buffer, " "); s; s = strtok(NULL, " "), tokc++) {	Err	bitreich.org	70
i-                if (tokc >= n) {	Err	bitreich.org	70
i-                        tokv = realloc(tokv, ++n * sizeof (*tokv));	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-                tokv[tokc] = s;	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-        free(tokv);	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-	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;	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-        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-        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;	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-        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-        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 + 1, stdout);	Err	bitreich.org	70
i-                                break;	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-        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-                puts(matchv[current]);	Err	bitreich.org	70
i-        fputs("\r\x1b[K", stderr);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static int	Err	bitreich.org	70
i-key(int key)	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-        case CTL('C'):	Err	bitreich.org	70
i-                return EXIT_FAILURE;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case CTL('U'):	Err	bitreich.org	70
i-                input[0] = '\0';	Err	bitreich.org	70
i-                filter();	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case CTL('W'):	Err	bitreich.org	70
i-                remove_word();	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case 127:	Err	bitreich.org	70
i-        case CTL('H'):  /* backspace */	Err	bitreich.org	70
i-                input[strlen(input) - 1] = '\0';	Err	bitreich.org	70
i-                filter();	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case CSI('A'):  /* up */	Err	bitreich.org	70
i-        case CTL('P'):	Err	bitreich.org	70
i-                move(-1);	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case CSI('B'):  /* down */	Err	bitreich.org	70
i-        case CTL('N'):	Err	bitreich.org	70
i-                move(+1);	Err	bitreich.org	70
i-                break;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case CSI('5'):  /* page up */	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-	Err	bitreich.org	70
i-        case CSI('6'):  /* page down */	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)	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-        case CTL('J'):  /* enter */	Err	bitreich.org	70
i-        case CTL('M'):	Err	bitreich.org	70
i-                print_selection();	Err	bitreich.org	70
i-                return EXIT_SUCCESS;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case ALT('['):	Err	bitreich.org	70
i-                key = CSI(fgetc(stdin));	Err	bitreich.org	70
i-                goto top;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        case 0x1b: /* escape / alt */	Err	bitreich.org	70
i-                key = ALT(fgetc(stdin));	Err	bitreich.org	70
i-                goto top;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        default:	Err	bitreich.org	70
i-                add_char((char) key);	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return CONTINUE;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-static void	Err	bitreich.org	70
i-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-        rows = MIN(opt['l'], ws.ws_row - 1);	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-	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("iomenu [-#] [-l lines] [-p prompt]\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-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-        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-                switch ((*argv)[1]) {	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-                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-                case '#':	Err	bitreich.org	70
i-                        opt['#'] = 1;	Err	bitreich.org	70
i-                        break;	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-                default:	Err	bitreich.org	70
i-                        usage();	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-int	Err	bitreich.org	70
i-main(int argc, char *argv[])	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();	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-        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-        reset_terminal();	Err	bitreich.org	70
i-        close(ttyfd);	Err	bitreich.org	70
i-        free_lines();	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        return exit_code;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
1diff --git a/iomenu.core b/iomenu.core	/scm/iomenu/file/iomenu.core.gph	bitreich.org	70
iBinary files differ.	Err	bitreich.org	70
1diff --git a/main.c b/main.c	/scm/iomenu/file/main.c.gph	bitreich.org	70
i@@ -0,0 +1,123 @@	Err	bitreich.org	70
i+#include "main.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static struct termios termios;	Err	bitreich.org	70
i+static int            ttyfd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+die(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+        free_lines();	Err	bitreich.org	70
i+        perror(s);	Err	bitreich.org	70
i+        exit(EXIT_FAILURE);	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+	Err	bitreich.org	70
i+        /* save currentsor postition */	Err	bitreich.org	70
i+        fputs("\x1b[s", stderr);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* save attributes to `termios` */	Err	bitreich.org	70
i+        if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) {	Err	bitreich.org	70
i+                perror("tcgetattr");	Err	bitreich.org	70
i+                exit(EXIT_FAILURE);	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* change to raw mode */	Err	bitreich.org	70
i+        new.c_lflag &= ~(ICANON | ECHO | IGNBRK | IEXTEN | ISIG);	Err	bitreich.org	70
i+        tcsetattr(ttyfd, TCSANOW, &new);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+reset_terminal(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        int i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* clear terminal */	Err	bitreich.org	70
i+        for (i = 0; i < rows + 1; i++)	Err	bitreich.org	70
i+                fputs("\r\x1b[K\n", stderr);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        /* reset currentsor position */	Err	bitreich.org	70
i+        fputs("\x1b[u", stderr);	Err	bitreich.org	70
i+	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+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+        rows = MIN(opt['l'], ws.ws_row - 1);	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+	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("iomenu [-#] [-l lines] [-p prompt]\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+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+        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+                switch ((*argv)[1]) {	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+                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+                case '#':	Err	bitreich.org	70
i+                        opt['#'] = 1;	Err	bitreich.org	70
i+                        break;	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+                default:	Err	bitreich.org	70
i+                        usage();	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+int	Err	bitreich.org	70
i+main(int argc, char *argv[])	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();	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+        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+        reset_terminal();	Err	bitreich.org	70
i+        close(ttyfd);	Err	bitreich.org	70
i+        free_lines();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return exit_code;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/main.h b/main.h	/scm/iomenu/file/main.h.gph	bitreich.org	70
i@@ -0,0 +1,29 @@	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+	Err	bitreich.org	70
i+#define CONTINUE (EXIT_SUCCESS + EXIT_FAILURE + 1)	Err	bitreich.org	70
i+#define MARGIN   30	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+winsize   ws;	Err	bitreich.org	70
i+char    **linev   = NULL;	Err	bitreich.org	70
i+int       linec   = 0;	Err	bitreich.org	70
i+char    **matchv  = NULL;	Err	bitreich.org	70
i+int       matchc  = 0;	Err	bitreich.org	70
i+char     *prompt  = "";	Err	bitreich.org	70
i+char      input[LINE_MAX];	Err	bitreich.org	70
i+char      formatted[LINE_MAX * 8];	Err	bitreich.org	70
i+int       current = 0;	Err	bitreich.org	70
i+int       offset  = 0;	Err	bitreich.org	70
i+int       next    = 0;	Err	bitreich.org	70
i+int       opt[128];	Err	bitreich.org	70
i+int       rows    = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t utf8_len        (char *);	Err	bitreich.org	70
i+size_t rune_len        (long);	Err	bitreich.org	70
i+size_t utf8_to_rune    (long *, char *);	Err	bitreich.org	70
i+int    utf8_is_unicode (long);	Err	bitreich.org	70
i+int    utf8_check      (char *);	Err	bitreich.org	70
i+int    utf8_is_print   (long);	Err	bitreich.org	70
1diff --git a/utf8.c b/utf8.c	/scm/iomenu/file/utf8.c.gph	bitreich.org	70
i@@ -1,3 +1,5 @@	Err	bitreich.org	70
i+#include "utf8.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * ASCII all have a leading '0' byte:	Err	bitreich.org	70
i  *	Err	bitreich.org	70
i@@ -28,7 +30,6 @@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i #include "utf8.h"	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-	Err	bitreich.org	70
i /*	Err	bitreich.org	70
i  * Return the number of bytes in rune for the `n` next char in `s`,	Err	bitreich.org	70
i  * or 0 if ti is misencoded.	Err	bitreich.org	70
i@@ -56,20 +57,18 @@ utf8_len(char *s)	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 /*	Err	bitreich.org	70
i  * Return the number of bytes required to encode `rune` into UTF-8, or	Err	bitreich.org	70
i  * 0 if rune is too long.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i size_t	Err	bitreich.org	70
i-rune_len(long r)	Err	bitreich.org	70
i+utf8_rune_len(long r)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         return (r <= 0x0000007f) ? 1 : (r <= 0x000007ff) ? 2 :	Err	bitreich.org	70
i                (r <= 0x0000ffff) ? 3 : (r <= 0x001fffff) ? 4 :	Err	bitreich.org	70
i                (r <= 0x03ffffff) ? 5 : (r <= 0x7fffffff) ? 6 : 0;	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  * Sets 'r' to a rune corresponding to the firsts 'n' bytes of 's'.	Err	bitreich.org	70
i  *	Err	bitreich.org	70
i@@ -92,13 +91,12 @@ utf8_to_rune(long *r, char *s)	Err	bitreich.org	70
i                 *r = (*r << 6) | (*s++ & 0x3f);  /* 10xxxxxx */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i         /* overlong sequences */	Err	bitreich.org	70
i-        if (rune_len(*r) != len)	Err	bitreich.org	70
i+        if (utf8_rune_len(*r) != len)	Err	bitreich.org	70
i                 return 0;	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 /*	Err	bitreich.org	70
i  * Returns 1 if the rune is a valid unicode code point and 0 if not.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i@@ -119,7 +117,6 @@ rune_is_unicode(long r)	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 /*	Err	bitreich.org	70
i  * Return 1 if '*s' is correctly encoded in UTF-8 with allowed Unicode	Err	bitreich.org	70
i  * code points.	Err	bitreich.org	70
i@@ -146,7 +143,7 @@ utf8_check(char *s)	Err	bitreich.org	70
i  * Return 1 if the rune is a printable character, and 0 otherwise.	Err	bitreich.org	70
i  */	Err	bitreich.org	70
i int	Err	bitreich.org	70
i-rune_is_print(long r)	Err	bitreich.org	70
i+utf8_is_print(long r)	Err	bitreich.org	70
i {	Err	bitreich.org	70
i         return (0x1f < r && r != 0x7f && r < 0x80) || 0x9f < r;	Err	bitreich.org	70
i }	Err	bitreich.org	70
1diff --git a/utf8.h b/utf8.h	/scm/iomenu/file/utf8.h.gph	bitreich.org	70
i@@ -1,6 +1,6 @@	Err	bitreich.org	70
i-size_t utf8_len(char *);	Err	bitreich.org	70
i-size_t rune_len(long);	Err	bitreich.org	70
i-size_t utf8_to_rune(long *, char *);	Err	bitreich.org	70
i-int    utf8_is_unicode(long);	Err	bitreich.org	70
i-int    utf8_check(char *);	Err	bitreich.org	70
i-int    rune_is_print(long);	Err	bitreich.org	70
i+size_t utf8_len        (char *);	Err	bitreich.org	70
i+size_t rune_len        (long);	Err	bitreich.org	70
i+size_t utf8_to_rune    (long *, char *);	Err	bitreich.org	70
i+int    utf8_is_unicode (long);	Err	bitreich.org	70
i+int    utf8_check      (char *);	Err	bitreich.org	70
i+int    utf8_is_print   (long);	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/iomenu/commit/2743c784dbce791...
Content-Typetext/plain; charset=utf-8