improve different libc compatibility thanks to _anthk feedback - iomenu - interactive terminal-based selection menu HTML git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit 0332f4dd490ea3fe6421a8f064142c3747938653 DIR parent 61d1c7b96e038a9af18330f8a2efa1b648441575 HTML Author: Josuah Demangeon <me@josuah.net> Date: Fri, 29 Oct 2021 19:45:58 +0200 improve different libc compatibility thanks to _anthk feedback Diffstat: M Makefile | 13 +++++++------ M iomenu.c | 20 ++++++++++---------- M term.c | 17 +++++++++-------- M term.h | 2 +- 4 files changed, 27 insertions(+), 25 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -1,7 +1,8 @@ NAME = iomenu -VERSION = 0.1 +V = 0.1 -CFLAGS = -DVERSION='"${VERSION}"' -I./src -Wall -Wextra -std=c99 --pedantic -g +D = -DVERSION='"$V"' -D_POSIX_C_SOURCE=200809L -D_BSD_SOURCE +CFLAGS = $D -Wall -Wextra -std=c99 -pedantic -g LDFLAGS = -static PREFIX = /usr/local MANPREFIX = ${PREFIX}/man @@ -22,7 +23,7 @@ ${BIN}: ${OBJ} ${BIN:=.o} ${CC} ${LDFLAGS} -o $@ $@.o ${OBJ} ${LIB} clean: - rm -rf *.o ${BIN} ${NAME}-${VERSION} *.gz + rm -rf *.o ${BIN} ${NAME}-$V *.gz install: mkdir -p ${DESTDIR}${PREFIX}/bin @@ -31,6 +32,6 @@ install: cp -rf ${MAN1} ${DESTDIR}${MANPREFIX}/man1 dist: clean - mkdir -p ${NAME}-${VERSION} - cp -r README Makefile bin ${MAN1} ${SRC} ${NAME}-${VERSION} - tar -cf - ${NAME}-${VERSION} | gzip -c >${NAME}-${VERSION}.tar.gz + mkdir -p ${NAME}-$V + cp -r README Makefile bin ${MAN1} ${SRC} ${NAME}-$V + tar -cf - ${NAME}-$V | gzip -c >${NAME}-$V.tar.gz DIR diff --git a/iomenu.c b/iomenu.c @@ -16,7 +16,7 @@ #include "utf8.h" struct { - char input[LINE_MAX]; + char input[256]; size_t cur; char **lines_buf; @@ -26,7 +26,7 @@ struct { size_t match_count; } ctx; -int opt_comment; +int flag_comment; /* * Keep the line if it match every token (in no particular order, @@ -35,7 +35,7 @@ int opt_comment; static int match_line(char *line, char **tokv) { - if (opt_comment && line[0] == '#') + if (flag_comment && line[0] == '#') return 2; for (; *tokv != NULL; tokv++) if (strcasestr(line, *tokv) == NULL) @@ -86,7 +86,7 @@ do_move(int sign) { /* integer overflow will do what we need */ for (size_t i = ctx.cur + sign; i < ctx.match_count; i += sign) { - if (opt_comment == 0 || ctx.match_buf[i][0] != '#') { + if (flag_comment == 0 || ctx.match_buf[i][0] != '#') { ctx.cur = i; break; } @@ -114,7 +114,7 @@ do_filter(char **search_buf, size_t search_count) for (size_t n = 0; n < search_count; n++) if (match_line(search_buf[n], tokv)) ctx.match_buf[ctx.match_count++] = search_buf[n]; - if (opt_comment && ctx.match_buf[ctx.cur][0] == '#') + if (flag_comment && ctx.match_buf[ctx.cur][0] == '#') do_move(+1); } @@ -136,7 +136,7 @@ do_move_header(signed int sign) { do_move(sign); - if (opt_comment == 0) + if (flag_comment == 0) return; for (ctx.cur += sign;; ctx.cur += sign) { char *cur = ctx.match_buf[ctx.cur]; @@ -184,7 +184,7 @@ do_add_char(char c) static void do_print_selection(void) { - if (opt_comment) { + if (flag_comment) { char **match = ctx.match_buf + ctx.cur; while (--match >= ctx.match_buf) { @@ -197,7 +197,7 @@ do_print_selection(void) } term_raw_off(2); if (ctx.match_count == 0 - || (opt_comment && ctx.match_buf[ctx.cur][0] == '#')) + || (flag_comment && ctx.match_buf[ctx.cur][0] == '#')) fprintf(stdout, "%s\n", ctx.input); else fprintf(stdout, "%s\n", ctx.match_buf[ctx.cur]); @@ -277,7 +277,7 @@ key_action(void) static void print_line(char *line, int highlight) { - if (opt_comment && line[0] == '#') { + if (flag_comment && line[0] == '#') { fprintf(stderr, "\n\x1b[1m\r%.*s\x1b[m", term_at_width(line + 1, term.winsize.ws_col, 0), line + 1); } else if (highlight) { @@ -390,7 +390,7 @@ main(int argc, char *argv[]) fprintf(stdout, "%s\n", VERSION); exit(0); case '#': - opt_comment = 1; + flag_comment = 1; break; default: usage(arg0); DIR diff --git a/term.c b/term.c @@ -36,19 +36,20 @@ term_at_width(char const *s, int width, int pos) int term_raw_on(int fd) { - struct termios new_termios = {0}; - char *seq = "\x1b[s\x1b[?1049h\x1b[H"; + static char *seq = "\x1b[s\x1b[?1049h\x1b[H"; + struct termios termios; ssize_t len = strlen(seq); if (write(fd, seq, len) < len) return -1; - if (tcgetattr(fd, &term.old_termios) < 0) + memset(&termios, 0, sizeof termios); + if (tcgetattr(fd, &term.termios) < 0) return -1; - memcpy(&new_termios, &term.old_termios, sizeof new_termios); + memcpy(&termios, &term.termios, sizeof termios); - new_termios.c_lflag &= ~(ICANON | ECHO | IEXTEN | IGNBRK | ISIG); - if (tcsetattr(fd, TCSANOW, &new_termios) == -1) + termios.c_lflag &= ~(ICANON | ECHO | IEXTEN | IGNBRK | ISIG); + if (tcsetattr(fd, TCSANOW, &termios) == -1) return -1; return 0; } @@ -56,10 +57,10 @@ term_raw_on(int fd) int term_raw_off(int fd) { - char *seq = "\x1b[2J\x1b[u\033[?1049l"; + static char *seq = "\x1b[2J\x1b[u\033[?1049l"; ssize_t len = strlen(seq); - if (tcsetattr(fd, TCSANOW, &term.old_termios) < 0) + if (tcsetattr(fd, TCSANOW, &term.termios) < 0) return -1; if (write(fd, seq, len) < len) return -1; DIR diff --git a/term.h b/term.h @@ -25,7 +25,7 @@ enum term_key { struct term { struct winsize winsize; - struct termios old_termios; + struct termios termios; }; extern struct term term;