iomenu.c: refactored readlines() - 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 8614ad4e2b6c08fcf82366637ee1cdf7662434f4 DIR parent 3d81e355d3a20771ccedf81e929a69fc65c3e638 HTML Author: Josuah Demangeon <josuah.demangeon@gandi.net> Date: Sat, 26 Aug 2017 23:04:39 +0200 iomenu.c: refactored readlines() Diffstat: M Makefile | 9 +++++---- M iomenu.c | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) --- DIR diff --git a/Makefile b/Makefile @@ -1,4 +1,4 @@ -CFLAGS = -std=c89 -Wpedantic -Wall -Wextra -g +CFLAGS = -std=c89 -Wpedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L all: iomenu @@ -8,6 +8,7 @@ clean: rm -f *.o iomenu install: iomenu - mkdir -p $(PREFIX)/bin $(PREFIX)/share/man/man1 - cp *.1 $(PREFIX)/share/man/man1/ - cp iomenu $(PREFIX)/bin/ + mkdir -p $(PREFIX)/share/man/man1 + cp *.1 $(PREFIX)/share/man/man1 + mkdir -p $(PREFIX)/bin + cp iomenu $(PREFIX)/bin DIR diff --git a/iomenu.c b/iomenu.c @@ -1,5 +1,6 @@ #include <ctype.h> #include <fcntl.h> +#include <limits.h> #include <locale.h> #include <signal.h> #include <stdio.h> @@ -25,7 +26,7 @@ static int ttyfd; static int current = 0, offset = 0, prev = 0, next = 0; static int linec = 0, matchc = 0; static char **linev = NULL, **matchv = NULL; -static char input[BUFSIZ], formatted[BUFSIZ * 8]; +static char input[LINE_MAX], formatted[LINE_MAX * 8]; static int opt[128], rows = 0; static char *prompt = ""; @@ -89,7 +90,8 @@ resetterminal(void) static void readlines(void) { - int size = 0; + int size = 0; + size_t len; do { if (linec >= size) { @@ -100,13 +102,17 @@ readlines(void) die("realloc"); } - linev[linec] = matchv[linec] = malloc(BUFSIZ); - if (linev[linec] == NULL) - die("malloc"); + linev[linec] = malloc(LINE_MAX + 1); + if (!(fgets(linev[linec], LINE_MAX, stdin))) { + free(linev[linec]); + break; + } - } while (fgets(linev[linec++], BUFSIZ, stdin)); + len = strlen(linev[linec]); + if (len > 0 && linec[linev][len - 1] == '\n') + linev[linec][len - 1] = '\0'; - matchc = linec; + } while (++linec, ++matchc); } static char * @@ -117,10 +123,7 @@ format(char *s, int cols) char *f = formatted; while (*s && i < cols) { - if (*s == '\n') { - s++; - - } else if (*s == '\t') { + if (*s == '\t') { int t = 8 - i % 8; while (t-- && i < cols) { *f++ = ' ';