iiomenu.c: simplified buffer management - 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 3d81e355d3a20771ccedf81e929a69fc65c3e638 /scm/iomenu/commit/3d81e355d3a20771ccedf81e929a69fc65c3e638.gph bitreich.org 70 1parent 787fef74f0f92d00f18cc2fc749606b3501a1039 /scm/iomenu/commit/787fef74f0f92d00f18cc2fc749606b3501a1039.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:josuah.demangeon@gandi.net bitreich.org 70 iDate: Wed, 23 Aug 2017 19:42:07 +0200 Err bitreich.org 70 i Err bitreich.org 70 iiomenu.c: simplified buffer management Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 2 +- Err bitreich.org 70 i M iomenu.c | 52 ++++++++++++++----------------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 25 insertions(+), 29 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 Err bitreich.org 70 i Err bitreich.org 70 i-all: clean iomenu Err bitreich.org 70 i+all: iomenu Err bitreich.org 70 i Err bitreich.org 70 i iomenu: iomenu.o utf8.o Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -1,3 +1,4 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i@@ -6,7 +7,6 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i-#include Err bitreich.org 70 i Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i@@ -89,37 +89,24 @@ resetterminal(void) Err bitreich.org 70 i static void Err bitreich.org 70 i readlines(void) Err bitreich.org 70 i { Err bitreich.org 70 i- char buffer[BUFSIZ]; Err bitreich.org 70 i- int size = 1 << 6; Err bitreich.org 70 i- Err bitreich.org 70 i- linev = malloc(sizeof (char **) * size); Err bitreich.org 70 i- matchv = malloc(sizeof (char **) * size); Err bitreich.org 70 i- if (linev == NULL || matchv == NULL) Err bitreich.org 70 i- die("malloc"); Err bitreich.org 70 i- Err bitreich.org 70 i- linev[0] = matchv[0] = NULL; Err bitreich.org 70 i- Err bitreich.org 70 i- /* read the file into an array of lines as the lines never change */ Err bitreich.org 70 i- for (; fgets(buffer, sizeof buffer, stdin); linec++, matchc++) { Err bitreich.org 70 i- int len = strlen(buffer); Err bitreich.org 70 i- Err bitreich.org 70 i- if (len > 0 && buffer[len - 1] == '\n') Err bitreich.org 70 i- buffer[len - 1] = '\0'; Err bitreich.org 70 i+ int size = 0; Err bitreich.org 70 i Err bitreich.org 70 i+ do { Err bitreich.org 70 i if (linec >= size) { Err bitreich.org 70 i- size *= 2; 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 == NULL || matchv == NULL) 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 Err bitreich.org 70 i- linev[linec] = matchv[matchc] = malloc(len + 1); Err bitreich.org 70 i+ linev[linec] = matchv[linec] = malloc(BUFSIZ); Err bitreich.org 70 i if (linev[linec] == NULL) Err bitreich.org 70 i die("malloc"); Err bitreich.org 70 i Err bitreich.org 70 i- strcpy(linev[linec], buffer); Err bitreich.org 70 i- } Err bitreich.org 70 i+ } while (fgets(linev[linec++], BUFSIZ, stdin)); Err bitreich.org 70 i+ Err bitreich.org 70 i+ matchc = linec; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static char * Err bitreich.org 70 i@@ -130,7 +117,10 @@ format(char *s, int cols) Err bitreich.org 70 i char *f = formatted; Err bitreich.org 70 i Err bitreich.org 70 i while (*s && i < cols) { Err bitreich.org 70 i- if (*s == '\t') { Err bitreich.org 70 i+ if (*s == '\n') { Err bitreich.org 70 i+ s++; Err bitreich.org 70 i+ Err bitreich.org 70 i+ } else if (*s == '\t') { Err bitreich.org 70 i int t = 8 - i % 8; Err bitreich.org 70 i while (t-- && i < cols) { Err bitreich.org 70 i *f++ = ' '; Err bitreich.org 70 i@@ -147,6 +137,7 @@ format(char *s, int cols) Err bitreich.org 70 i } else { Err bitreich.org 70 i *f++ = '?'; Err bitreich.org 70 i i++; Err bitreich.org 70 i+ s++; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i *f = '\0'; Err bitreich.org 70 i@@ -429,23 +420,28 @@ parseopt(int argc, char *argv[]) Err bitreich.org 70 i usage(); Err bitreich.org 70 i Err bitreich.org 70 i switch ((*argv)[1]) { Err bitreich.org 70 i+ Err bitreich.org 70 i case 'l': Err bitreich.org 70 i- argv++; argc--; Err bitreich.org 70 i- if (argc == 0 || sscanf(*argv, "%d", &opt['l']) <= 0) 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 Err bitreich.org 70 i case 'p': Err bitreich.org 70 i- argv++; argc--; Err bitreich.org 70 i- if (argc == 0) 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+ prompt = *++argv; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case '#': Err bitreich.org 70 i opt['#'] = 1; Err bitreich.org 70 i break; Err bitreich.org 70 i 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+ Err bitreich.org 70 i default: Err bitreich.org 70 i usage(); Err bitreich.org 70 i } Err bitreich.org 70 .