URI: 
       iomenu.c: simplified buffer management - 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 3d81e355d3a20771ccedf81e929a69fc65c3e638
   DIR parent 787fef74f0f92d00f18cc2fc749606b3501a1039
  HTML Author: Josuah Demangeon <josuah.demangeon@gandi.net>
       Date:   Wed, 23 Aug 2017 19:42:07 +0200
       
       iomenu.c: simplified buffer management
       
       Diffstat:
         M Makefile                            |       2 +-
         M iomenu.c                            |      52 ++++++++++++++-----------------
       
       2 files changed, 25 insertions(+), 29 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       @@ -1,6 +1,6 @@
        CFLAGS = -std=c89 -Wpedantic -Wall -Wextra -g
        
       -all: clean iomenu
       +all: iomenu
        
        iomenu: iomenu.o utf8.o
        
   DIR diff --git a/iomenu.c b/iomenu.c
       @@ -1,3 +1,4 @@
       +#include <ctype.h>
        #include <fcntl.h>
        #include <locale.h>
        #include <signal.h>
       @@ -6,7 +7,6 @@
        #include <string.h>
        #include <termios.h>
        #include <unistd.h>
       -#include <ctype.h>
        
        #include <sys/ioctl.h>
        
       @@ -89,37 +89,24 @@ resetterminal(void)
        static void
        readlines(void)
        {
       -        char buffer[BUFSIZ];
       -        int size = 1 << 6;
       -
       -        linev  = malloc(sizeof (char **) * size);
       -        matchv = malloc(sizeof (char **) * size);
       -        if (linev == NULL || matchv == NULL)
       -                die("malloc");
       -
       -        linev[0] = matchv[0] = NULL;
       -
       -        /* read the file into an array of lines as the lines never change */
       -        for (; fgets(buffer, sizeof buffer, stdin); linec++, matchc++) {
       -                int len = strlen(buffer);
       -
       -                if (len > 0 && buffer[len - 1] == '\n')
       -                        buffer[len - 1] = '\0';
       +        int size = 0;
        
       +        do {
                        if (linec >= size) {
       -                        size *= 2;
       +                        size += BUFSIZ;
                                linev  = realloc(linev,  sizeof (char **) * size);
                                matchv = realloc(matchv, sizeof (char **) * size);
       -                        if (linev == NULL || matchv == NULL)
       +                        if (!linev || !matchv)
                                        die("realloc");
                        }
        
       -                linev[linec] = matchv[matchc] = malloc(len + 1);
       +                linev[linec] = matchv[linec] = malloc(BUFSIZ);
                        if (linev[linec] == NULL)
                                die("malloc");
        
       -                strcpy(linev[linec], buffer);
       -        }
       +        } while (fgets(linev[linec++], BUFSIZ, stdin));
       +
       +        matchc = linec;
        }
        
        static char *
       @@ -130,7 +117,10 @@ format(char *s, int cols)
                char *f = formatted;
        
                while (*s && i < cols) {
       -                if (*s == '\t') {
       +                if (*s == '\n') {
       +                        s++;
       +
       +                } else if (*s == '\t') {
                                int t = 8 - i % 8;
                                while (t-- && i < cols) {
                                        *f++ = ' ';
       @@ -147,6 +137,7 @@ format(char *s, int cols)
                        } else {
                                *f++ = '?';
                                i++;
       +                        s++;
                        }
                }
                *f = '\0';
       @@ -429,23 +420,28 @@ parseopt(int argc, char *argv[])
                                usage();
        
                        switch ((*argv)[1]) {
       +
                        case 'l':
       -                        argv++; argc--;
       -                        if (argc == 0 || sscanf(*argv, "%d", &opt['l']) <= 0)
       +                        if (!--argc || sscanf(*++argv, "%d", &opt['l']) <= 0)
                                        usage();
                                break;
        
                        case 'p':
       -                        argv++; argc--;
       -                        if (argc == 0)
       +                        if (!--argc)
                                        usage();
       -                        prompt = *argv;
       +                        prompt = *++argv;
                                break;
        
                        case '#':
                                opt['#'] = 1;
                                break;
        
       +                case 's':
       +                        if (!--argc)
       +                                usage();
       +                        opt['s'] = (int) **++argv;
       +                        break;
       +
                        default:
                                usage();
                        }