iomenu

interactive text selection menu
Log | Files | Refs | README | LICENSE

commit 9747f2c9e90a2160e5578b80aa3b91101d338120
parent c1fc5b0c3cfd8ce193fd60d8a4586995b1af7758
Author: Josuah Demangeon <mail@josuah.net>
Date:   Sat,  3 Mar 2018 00:05:42 +0100

fixed CTL macro causing buggy input

Diffstat:
MMakefile | 11+++++++----
Miomenu.c | 57++++++++++++++++++++-------------------------------------
Astr.h | 1+
Astrcasestr.c | 25+++++++++++++++++++++++++
4 files changed, 53 insertions(+), 41 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,6 +1,6 @@ CFLAGS = -std=c89 -pedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L -SRC = iomenu.c utf8.c +SRC = iomenu.c utf8.c strcasestr.c OBJ = ${SRC:.o=.c} all: iomenu @@ -8,16 +8,19 @@ all: iomenu .c.o: ${CC} -c -o $@ ${CFLAGS} $< -iomenu: ${OBJ} +iomenu: ${OBJ} utf8.h str.h ${CC} -o $@ ${LDFLAGS} ${OBJ} -${OBJ}: utf8.h + +utf8.c: utf8.h + +strcasestr.c: str.h test: test.c ${CC} -o $@ ${LDFLAGS} test.c utf8.c ./$@ clean: - rm -f *.o *.core iomenu + rm -f *.o *.core iomenu test install: iomenu mkdir -p ${PREFIX}/share/man/man1 diff --git a/iomenu.c b/iomenu.c @@ -12,13 +12,14 @@ #include <unistd.h> #include "utf8.h" +#include "str.h" #ifndef SIGWINCH #define SIGWINCH 28 #endif #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) -#define CTL(char) ((char) | 0x40) +#define CTL(char) ((char) & ~0x40) #define ALT(char) ((char) + 0x80) #define CSI(char) ((char) + 0x80 + 0x80) @@ -26,32 +27,11 @@ static struct termios termios; struct winsize ws; static int ttyfd; -int linec = 0, matchc = 0, cur = 0; -char **linev = NULL, **matchv = NULL; -char input[LINE_MAX], formatted[LINE_MAX * 8]; +static int linec = 0, matchc = 0, cur = 0; +static char **linev = NULL, **matchv = NULL; +static char input[LINE_MAX], formatted[LINE_MAX * 8]; -int flag_hs = 0; - -static char * -io_strstr(const char *str1, const char *str2) -{ - const char *s1; - const char *s2; - - for (;;) { - s1 = str1; - s2 = str2; - while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) - s1++, s2++; - if (*s2 == '\0') - return (char *) str1; - if (*s1 == '\0') - return NULL; - str1++; - } - - return NULL; -} +static int flag_hs = 0; /* ** Keep the line if it match every token (in no particular order, and allowed to @@ -63,7 +43,7 @@ match_line(char *line, char **tokv) if (flag_hs && line[0] == '#') return 2; for (; *tokv != NULL; tokv++) - if (io_strstr(line, *tokv) == NULL) + if (strcasestr(line, *tokv) == NULL) return 0; return 1; } @@ -267,6 +247,8 @@ key(int k) extern int linec; top: + printf("{%d}", k); + fflush(stdout); switch (k) { case CTL('C'): return -1; @@ -382,7 +364,7 @@ set_terminal(void) perror("tcgetattr"); exit(EXIT_FAILURE); } - new.c_lflag &= ~(ICANON | ECHO | IGNBRK | IEXTEN | ISIG); + new.c_lflag &= ~(ICANON | ECHO | IEXTEN | IGNBRK); tcsetattr(ttyfd, TCSANOW, &new); } @@ -396,18 +378,19 @@ reset_terminal(void) tcsetattr(ttyfd, TCSANOW, &termios); } -/* -** Redraw the whole screen on window resize. -*/ static void -sigwinch() +sighandle(int sig) { extern struct winsize ws; - if (ioctl(ttyfd, TIOCGWINSZ, &ws) < 0) - err("ioctl"); - print_screen(); - signal(SIGWINCH, sigwinch); + switch (sig) { + case SIGWINCH: + if (ioctl(ttyfd, TIOCGWINSZ, &ws) < 0) + err("ioctl"); + print_screen(); + break; + } + signal(sig, sighandle); } static void @@ -453,7 +436,7 @@ init(void) err("open /dev/tty"); set_terminal(); - sigwinch(); + sighandle(SIGWINCH); } /* diff --git a/str.h b/str.h @@ -0,0 +1 @@ +char *strcasestr(const char *, const char *); diff --git a/strcasestr.c b/strcasestr.c @@ -0,0 +1,25 @@ +#include <ctype.h> +#include <stddef.h> + +#include "str.h" + +char * +strcasesstr(const char *str1, const char *str2) +{ + const char *s1; + const char *s2; + + for (;;) { + s1 = str1; + s2 = str2; + while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) + s1++, s2++; + if (*s2 == '\0') + return (char *) str1; + if (*s1 == '\0') + return NULL; + str1++; + } + + return NULL; +}