SMOLNET PORTAL home about changes
iit is not that big, a single file will do - 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 251f7a6436516116e1dc7c9e674a9be1f58eb1b7	/scm/iomenu/commit/251f7a6436516116e1dc7c9e674a9be1f58eb1b7.gph	bitreich.org	70
1parent b69d6f5982f4c2b96f8dee1369c48180ed31b035	/scm/iomenu/commit/b69d6f5982f4c2b96f8dee1369c48180ed31b035.gph	bitreich.org	70
hAuthor: Josuah Demangeon <mail@josuah.net>	URL:mailto:mail@josuah.net	bitreich.org	70
iDate:   Thu, 16 Nov 2017 11:09:25 +0100	Err	bitreich.org	70
i	Err	bitreich.org	70
iit is not that big, a single file will do	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |      20 +++++++++++---------	Err	bitreich.org	70
i  D buffer.c                            |     155 -------------------------------	Err	bitreich.org	70
i  D buffer.h                            |       3 ---	Err	bitreich.org	70
i  D control.c                           |     152 -------------------------------	Err	bitreich.org	70
i  D control.h                           |       4 ----	Err	bitreich.org	70
i  D display.c                           |     120 -------------------------------	Err	bitreich.org	70
i  D display.h                           |       2 --	Err	bitreich.org	70
i  A iomenu.c                            |     532 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  D iomenu.h                            |      18 ------------------	Err	bitreich.org	70
i  D main.c                              |     151 -------------------------------	Err	bitreich.org	70
i  D main.h                              |       1 -	Err	bitreich.org	70
i	Err	bitreich.org	70
i11 files changed, 543 insertions(+), 615 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,22 +1,24 @@	Err	bitreich.org	70
i CFLAGS = -std=c89 -pedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-OBJ = buffer.o control.o display.o main.o utf8.o	Err	bitreich.org	70
i-INC = buffer.h control.h display.h main.h utf8.h iomenu.h	Err	bitreich.org	70
i+OBJ = iomenu.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-iomenu: $(OBJ)	Err	bitreich.org	70
i-        $(CC) $(LDFLAGS) $(OBJ) -o $@	Err	bitreich.org	70
i+.c.o:	Err	bitreich.org	70
i+        ${CC} -c -o $@ ${CFLAGS} $<	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-$(OBJ): $(INC)	Err	bitreich.org	70
i+iomenu: ${OBJ}	Err	bitreich.org	70
i+        ${CC} -o $@ ${LDFLAGS} ${OBJ}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+${OBJ}: utf8.h	Err	bitreich.org	70
i 	Err	bitreich.org	70
i clean:	Err	bitreich.org	70
i         rm -f *.o *.core iomenu	Err	bitreich.org	70
i 	Err	bitreich.org	70
i install: iomenu	Err	bitreich.org	70
i-        mkdir -p  $(PREFIX)/share/man/man1	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+        mkdir -p  ${PREFIX}/share/man/man1	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@@ -1,155 +0,0 @@	Err	bitreich.org	70
i-#include <sys/ioctl.h>	Err	bitreich.org	70
i-	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 <limits.h>	Err	bitreich.org	70
i-#include <unistd.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "iomenu.h"	Err	bitreich.org	70
i-#include "buffer.h"	Err	bitreich.org	70
i-#include "main.h"	Err	bitreich.org	70
i-#include "control.h"	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Keep the line if it match every token (in no particular order, and allowed to	Err	bitreich.org	70
i- * be overlapping).	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-        return 1;	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * As we use a single buffer for the whole stdin, we only need to free it once	Err	bitreich.org	70
i- * and it will free all the lines.	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-        extern        char        **linev;	Err	bitreich.org	70
i-        extern        char        **matchv;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        if (linev) {	Err	bitreich.org	70
i-                free(linev[0]);	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-/*	Err	bitreich.org	70
i- * Split a buffer into an array of lines, without allocating memory for every	Err	bitreich.org	70
i- * line, but using the input buffer and replacing characters.	Err	bitreich.org	70
i- */	Err	bitreich.org	70
i-void	Err	bitreich.org	70
i-split_lines(char *buf)	Err	bitreich.org	70
i-{	Err	bitreich.org	70
i-        extern        char        **linev;	Err	bitreich.org	70
i-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        int          linec;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        char         *b;	Err	bitreich.org	70
i-        char        **lv;	Err	bitreich.org	70
i-        char        **mv;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        linec = 0;	Err	bitreich.org	70
i-        b = buf;	Err	bitreich.org	70
i-        while ((b = strchr(b + 1, '\n')))	Err	bitreich.org	70
i-                linec++;	Err	bitreich.org	70
i-        if (!linec)	Err	bitreich.org	70
i-                linec = 1;	Err	bitreich.org	70
i-        if (!(lv = linev = calloc(linec + 1, sizeof (char **))))	Err	bitreich.org	70
i-                die("calloc");	Err	bitreich.org	70
i-        if (!(mv = matchv = calloc(linec + 1, sizeof (char **)))) {	Err	bitreich.org	70
i-                free(linev);	Err	bitreich.org	70
i-                die("calloc");	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        *mv = *lv = b = buf;	Err	bitreich.org	70
i-        while ((b = strchr(b, '\n'))) {	Err	bitreich.org	70
i-                *b = '\0';	Err	bitreich.org	70
i-                mv++, lv++;	Err	bitreich.org	70
i-                *mv = *lv = ++b;	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- * Read stdin in a single malloc-ed buffer, realloc-ed to twice its size every	Err	bitreich.org	70
i- * time the previous buffer is filled.	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-        size_t         size;	Err	bitreich.org	70
i-        size_t         len;	Err	bitreich.org	70
i-        size_t         off;	Err	bitreich.org	70
i-        char        *buf;	Err	bitreich.org	70
i-        char        *b;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        size = BUFSIZ;	Err	bitreich.org	70
i-        off = 0;	Err	bitreich.org	70
i-        buf = malloc(size);	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 >> 1) {	Err	bitreich.org	70
i-                        size <<= 1;	Err	bitreich.org	70
i-                        if (!(b = realloc(buf, size + 1))) {	Err	bitreich.org	70
i-                                free(buf);	Err	bitreich.org	70
i-                                die("realloc");	Err	bitreich.org	70
i-                        }	Err	bitreich.org	70
i-                        buf = b;	Err	bitreich.org	70
i-                }	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        buf[off] = '\0';	Err	bitreich.org	70
i-        split_lines(buf);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * First split input into token, then match every token independently against	Err	bitreich.org	70
i- * every line.  The matching lines fills matchv.	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-        extern        char        **linev;	Err	bitreich.org	70
i-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        int          linec;	Err	bitreich.org	70
i-        extern        int          matchc;	Err	bitreich.org	70
i-        extern        int          current;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        int          tokc;	Err	bitreich.org	70
i-        int          n;	Err	bitreich.org	70
i-        char        **tokv;	Err	bitreich.org	70
i-        char         *s;	Err	bitreich.org	70
i-        char          buf[sizeof (input)];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        tokv = NULL;	Err	bitreich.org	70
i-        current = 0;	Err	bitreich.org	70
i-        strcpy(buf, input);	Err	bitreich.org	70
i-        tokc = 0;	Err	bitreich.org	70
i-        n = 0;	Err	bitreich.org	70
i-        s = strtok(buf, " ");	Err	bitreich.org	70
i-        while (s) {	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-                s = strtok(NULL, " ");	Err	bitreich.org	70
i-                tokc++;	Err	bitreich.org	70
i-        }	Err	bitreich.org	70
i-        matchc = 0;	Err	bitreich.org	70
i-        for (n = 0; n < linec; n++)	Err	bitreich.org	70
i-                if (match_line(linev[n], tokv, tokc))	Err	bitreich.org	70
i-                        matchv[matchc++] = linev[n];	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@@ -1,3 +0,0 @@	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@@ -1,152 +0,0 @@	Err	bitreich.org	70
i-#include <sys/ioctl.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stddef.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <ctype.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "iomenu.h"	Err	bitreich.org	70
i-#include "buffer.h"	Err	bitreich.org	70
i-#include "control.h"	Err	bitreich.org	70
i-#include "display.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-void	Err	bitreich.org	70
i-move(signed int sign)	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-	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-        extern        struct        winsize ws;	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-        int        rows;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        rows = ws.ws_row - 1;	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-static void	Err	bitreich.org	70
i-remove_word()	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 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-        extern        char        input[LINE_MAX];	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-/*	Err	bitreich.org	70
i- * Big case table, that calls itself back for with ALT (aka ESC), CSI	Err	bitreich.org	70
i- * (aka ESC + [).  These last two have values above the range of ASCII.	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-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        char          input[LINE_MAX];	Err	bitreich.org	70
i-        extern        int          linec;	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 -1;	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 0;	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 1;	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@@ -1,4 +0,0 @@	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@@ -1,120 +0,0 @@	Err	bitreich.org	70
i-#include <sys/ioctl.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "iomenu.h"	Err	bitreich.org	70
i-#include "utf8.h"	Err	bitreich.org	70
i-#include "control.h"	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-        extern        struct        winsize ws;	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) && utf8_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_line(char *line, int cur)	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 (opt['#'] && 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 (cur) {	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-}	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-        extern        struct        winsize ws;	Err	bitreich.org	70
i-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        char         *prompt;	Err	bitreich.org	70
i-        extern        char          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;	Err	bitreich.org	70
i-        int          i;	Err	bitreich.org	70
i-        int          cols;	Err	bitreich.org	70
i-        int          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-        i = current - current % rows;	Err	bitreich.org	70
i-        m = matchv + i;	Err	bitreich.org	70
i-        fputs("\x1b[2J", stderr);	Err	bitreich.org	70
i-        while (p < rows && i < matchc) {	Err	bitreich.org	70
i-                print_line(*m, i == current);	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 (*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-        extern        char        **matchv;	Err	bitreich.org	70
i-        extern        char          input[LINE_MAX];	Err	bitreich.org	70
i-        extern        int          matchc;	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-}	Err	bitreich.org	70
1diff --git a/display.h b/display.h	/scm/iomenu/file/display.h.gph	bitreich.org	70
i@@ -1,2 +0,0 @@	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@@ -0,0 +1,532 @@	Err	bitreich.org	70
i+#include <sys/ioctl.h>	Err	bitreich.org	70
i+	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 <signal.h>	Err	bitreich.org	70
i+#include <stddef.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 "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+	Err	bitreich.org	70
i+#define MIN(X, Y)        (((X) < (Y)) ? (X) : (Y))	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        struct        termios termios;	Err	bitreich.org	70
i+static        int        ttyfd;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+struct winsize        ws;	Err	bitreich.org	70
i+int                linec = 0, matchc = 0, current = 0;	Err	bitreich.org	70
i+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+char        *flag_p = "";	Err	bitreich.org	70
i+int        flag_hs = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Keep the line if it match every token (in no particular order, and allowed to	Err	bitreich.org	70
i+ * be overlapping).	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 (flag_hs && 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+        return 1;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * As we use a single buffer for the whole stdin, we only need to free it once	Err	bitreich.org	70
i+ * and it will free all the lines.	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+        extern        char        **linev;	Err	bitreich.org	70
i+        extern        char        **matchv;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (linev) {	Err	bitreich.org	70
i+                free(linev[0]);	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+/*	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	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+/*	Err	bitreich.org	70
i+ * Split a buffer into an array of lines, without allocating memory for every	Err	bitreich.org	70
i+ * line, but using the input buffer and replacing characters.	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+static void	Err	bitreich.org	70
i+split_lines(char *buf)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        extern char        **linev, **matchv;	Err	bitreich.org	70
i+        extern int        linec;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        char        *b, **lv, **mv;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        linec = 0;	Err	bitreich.org	70
i+        b = buf;	Err	bitreich.org	70
i+        while ((b = strchr(b + 1, '\n')))	Err	bitreich.org	70
i+                linec++;	Err	bitreich.org	70
i+        if (!linec)	Err	bitreich.org	70
i+                linec = 1;	Err	bitreich.org	70
i+        if (!(lv = linev = calloc(linec + 1, sizeof (char **))))	Err	bitreich.org	70
i+                die("calloc");	Err	bitreich.org	70
i+        if (!(mv = matchv = calloc(linec + 1, sizeof (char **)))) {	Err	bitreich.org	70
i+                free(linev);	Err	bitreich.org	70
i+                die("calloc");	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        *mv = *lv = b = buf;	Err	bitreich.org	70
i+        while ((b = strchr(b, '\n'))) {	Err	bitreich.org	70
i+                *b = '\0';	Err	bitreich.org	70
i+                mv++, lv++;	Err	bitreich.org	70
i+                *mv = *lv = ++b;	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+ * Read stdin in a single malloc-ed buffer, realloc-ed to twice its size every	Err	bitreich.org	70
i+ * time the previous buffer is filled.	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+        size_t        size, len, off;	Err	bitreich.org	70
i+        char        *buf, *b;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        size = BUFSIZ;	Err	bitreich.org	70
i+        off = 0;	Err	bitreich.org	70
i+        buf = malloc(size);	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 >> 1) {	Err	bitreich.org	70
i+                        size <<= 1;	Err	bitreich.org	70
i+                        if (!(b = realloc(buf, size + 1))) {	Err	bitreich.org	70
i+                                free(buf);	Err	bitreich.org	70
i+                                die("realloc");	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        buf = b;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        buf[off] = '\0';	Err	bitreich.org	70
i+        split_lines(buf);	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+        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 = current + sign; 0 <= i && i < matchc; i += sign) {	Err	bitreich.org	70
i+                if (!flag_hs || 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+/*	Err	bitreich.org	70
i+ * First split input into token, then match every token independently against	Err	bitreich.org	70
i+ * every line.  The matching lines fills matchv.	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+        extern char        **linev, **matchv;	Err	bitreich.org	70
i+        extern int        linec, matchc, current;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        int        tokc, n;	Err	bitreich.org	70
i+        char        **tokv, *s, buf[sizeof (input)];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        tokv = NULL;	Err	bitreich.org	70
i+        current = 0;	Err	bitreich.org	70
i+        strcpy(buf, input);	Err	bitreich.org	70
i+        tokc = 0;	Err	bitreich.org	70
i+        n = 0;	Err	bitreich.org	70
i+        s = strtok(buf, " ");	Err	bitreich.org	70
i+        while (s) {	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+                s = strtok(NULL, " ");	Err	bitreich.org	70
i+                tokc++;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+        matchc = 0;	Err	bitreich.org	70
i+        for (n = 0; n < linec; n++)	Err	bitreich.org	70
i+                if (match_line(linev[n], tokv, tokc))	Err	bitreich.org	70
i+                        matchv[matchc++] = linev[n];	Err	bitreich.org	70
i+        free(tokv);	Err	bitreich.org	70
i+        if (flag_hs && 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+move_page(signed int sign)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        extern        struct        winsize ws;	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+        int        rows;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        rows = ws.ws_row - 1;	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+static void	Err	bitreich.org	70
i+remove_word()	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 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+        extern        char        input[LINE_MAX];	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+static void	Err	bitreich.org	70
i+print_selection(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        extern        char        **matchv;	Err	bitreich.org	70
i+        extern        char          input[LINE_MAX];	Err	bitreich.org	70
i+        extern        int          matchc;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        char **match;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (flag_hs) {	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 || (flag_hs && 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+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Big case table, that calls itself back for with ALT (aka ESC), CSI	Err	bitreich.org	70
i+ * (aka ESC + [).  These last two have values above the range of ASCII.	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+        extern        char        **matchv;	Err	bitreich.org	70
i+        extern        char          input[LINE_MAX];	Err	bitreich.org	70
i+        extern        int          linec;	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 -1;	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 0;	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 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 cols)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        extern        struct        winsize ws;	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) && utf8_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_line(char *line, int cur)	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 (cur) {	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+}	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;	Err	bitreich.org	70
i+        extern        char         *flag_p;	Err	bitreich.org	70
i+        extern        char          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;	Err	bitreich.org	70
i+        int          i;	Err	bitreich.org	70
i+        int          cols;	Err	bitreich.org	70
i+        int          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+        i = current - current % rows;	Err	bitreich.org	70
i+        m = matchv + i;	Err	bitreich.org	70
i+        fputs("\x1b[2J", stderr);	Err	bitreich.org	70
i+        while (p < rows && i < matchc) {	Err	bitreich.org	70
i+                print_line(*m, i == current);	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+        fflush(stderr);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Set terminal in raw mode.	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+        fputs("\x1b[s\x1b[?1049h\x1b[H", stderr);	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+        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+/*	Err	bitreich.org	70
i+ * Take terminal out of raw mode.	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+        fputs("\x1b[u\033[?1049l", stderr);	Err	bitreich.org	70
i+        tcsetattr(ttyfd, TCSANOW, &termios);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Redraw the whole screen on window resize.	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+        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+        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("usage: iomenu [-#] [-p flag_p]\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+/*	Err	bitreich.org	70
i+ * XXX: switch to getopt.	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+        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+                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+/*	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+ * one line by searching words within stdin.  This was inspired from dmenu.	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+        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();	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))) > 0)	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.h b/iomenu.h	/scm/iomenu/file/iomenu.h.gph	bitreich.org	70
i@@ -1,18 +0,0 @@	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        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-extern        struct          winsize ws;	Err	bitreich.org	70
i-extern        char        **linev;	Err	bitreich.org	70
i-extern        int          linec;	Err	bitreich.org	70
i-extern        char        **matchv;	Err	bitreich.org	70
i-extern        int          matchc;	Err	bitreich.org	70
i-extern        char         *prompt;	Err	bitreich.org	70
i-extern        char          input[LINE_MAX];	Err	bitreich.org	70
i-extern        char          formatted[LINE_MAX * 8];	Err	bitreich.org	70
i-extern        int          current;	Err	bitreich.org	70
i-extern        int          opt[128];	Err	bitreich.org	70
1diff --git a/main.c b/main.c	/scm/iomenu/file/main.c.gph	bitreich.org	70
i@@ -1,151 +0,0 @@	Err	bitreich.org	70
i-#include <sys/ioctl.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include <stdio.h>	Err	bitreich.org	70
i-#include <stdlib.h>	Err	bitreich.org	70
i-#include <termios.h>	Err	bitreich.org	70
i-#include <signal.h>	Err	bitreich.org	70
i-#include <string.h>	Err	bitreich.org	70
i-#include <unistd.h>	Err	bitreich.org	70
i-#include <fcntl.h>	Err	bitreich.org	70
i-#include <limits.h>	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-#include "iomenu.h"	Err	bitreich.org	70
i-#include "main.h"	Err	bitreich.org	70
i-#include "buffer.h"	Err	bitreich.org	70
i-#include "control.h"	Err	bitreich.org	70
i-#include "display.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-struct        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          opt[128];	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	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-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-/*	Err	bitreich.org	70
i- * Set terminal in raw mode.	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-        fputs("\x1b[s\x1b[?1049h\x1b[H", stderr);	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-        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-/*	Err	bitreich.org	70
i- * Take terminal out of raw mode.	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-        fputs("\x1b[u\033[?1049l", stderr);	Err	bitreich.org	70
i-        tcsetattr(ttyfd, TCSANOW, &termios);	Err	bitreich.org	70
i-}	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-/*	Err	bitreich.org	70
i- * Redraw the whole screen on window resize.	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-        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-        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("usage: iomenu [-#] [-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-/*	Err	bitreich.org	70
i- * XXX: switch to getopt.	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-        extern        char        *prompt;	Err	bitreich.org	70
i-	Err	bitreich.org	70
i-        memset(opt, 0, 128 * sizeof (int));	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-                        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-                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-/*	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- * one line by searching words within stdin.  This was inspired from dmenu.	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-        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();	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))) > 0)	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@@ -1 +0,0 @@	Err	bitreich.org	70
i-void        die(const char *);	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/iomenu/commit/251f7a643651611...
Content-Typetext/plain; charset=utf-8