Home
       *.c: included each other - 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 0502e73cca4f319ac484f66983cf6d40bdf843da
   DIR parent 2743c784dbce7910cbec895c42a723f06fa7b620
  HTML Author: Josuah Demangeon <mail@josuah.net>
       Date:   Sun, 29 Oct 2017 22:17:52 +0100
       
       *.c: included each other
       
       Diffstat:
         M Makefile                            |       5 ++++-
         M buffer.c                            |      21 ++++++++++++++++++---
         M control.c                           |      20 ++++++++++++++++----
         M display.c                           |      10 +++++++++-
         D iomenu.core                         |       0 
         A iomenu.h                            |      21 +++++++++++++++++++++
         M main.c                              |      31 ++++++++++++++++++++++++++++++-
         M main.h                              |      30 +-----------------------------
         M utf8.c                              |       2 ++
       
       9 files changed, 101 insertions(+), 39 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       @@ -1,12 +1,15 @@
       -CFLAGS = -std=c89 -Wpedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L
       +CFLAGS = -std=c89 -pedantic -Wall -Wextra -g -D_POSIX_C_SOURCE=200809L
        
        OBJ = buffer.o control.o display.o main.o utf8.o
       +INC = buffer.h control.h display.h main.h utf8.h iomenu.h
        
        all: iomenu
        
        iomenu: $(OBJ)
                $(CC) $(LDFLAGS) $(OBJ) -o $@
        
       +$(OBJ): $(INC)
       +
        clean:
                rm -f *.o iomenu
        
   DIR diff --git a/buffer.c b/buffer.c
       @@ -1,4 +1,14 @@
       +#include <sys/ioctl.h>
       +
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <string.h>
       +#include <limits.h>
       +
       +#include "iomenu.h"
        #include "buffer.h"
       +#include "main.h"
       +#include "control.h"
        
        static char *
        read_line(FILE *fp)
       @@ -34,6 +44,8 @@ match_line(char *line, char **tokv, int tokc)
        void
        free_lines(void)
        {
       +        extern char **linev;
       +
                if (linev) {
                        for (; linec > 0; linec--)
                                free(linev[linec - 1]);
       @@ -46,12 +58,13 @@ free_lines(void)
        void
        read_stdin(void)
        {
       -        int    size = 0;
       +        int size = 0;
       +        extern char **linev;
        
                while (1) {
                        if (linec >= size) {
                                size += BUFSIZ;
       -                        linev  = realloc(linev,  sizeof (char **) * size);
       +                        linev = realloc(linev,  sizeof (char **) * size);
                                matchv = realloc(matchv, sizeof (char **) * size);
                                if (!linev || !matchv)
                                        die("realloc");
       @@ -67,11 +80,13 @@ void
        filter(void)
        {
                int tokc = 0;
       -        int n    = 0;
       +        int n = 0;
                int i;
                char **tokv = NULL;
                char *s;
                char buffer[sizeof (input)];
       +        extern char **linev;
       +        extern current;
        
                current = offset = next = 0;
                strcpy(buffer, input);
   DIR diff --git a/control.c b/control.c
       @@ -1,4 +1,15 @@
       +#include <sys/ioctl.h>
       +
       +#include <stddef.h>
       +#include <limits.h>
       +#include <string.h>
       +#include <ctype.h>
       +#include <stdio.h>
       +
       +#include "iomenu.h"
       +#include "buffer.h"
        #include "control.h"
       +#include "display.h"
        
        #define CTL(char) ((char) ^ 0x40)
        #define ALT(char) ((char) + 0x80)
       @@ -22,7 +33,8 @@ width(char *s)
        int
        prev_page(int pos)
        {
       -        int col, cols = ws.ws_col - MARGIN - 4;
       +        int col;
       +        int cols = ws.ws_col - MARGIN - 4;
        
                pos -= pos > 0 ? 1 : 0;
                for (col = 0; pos > 0; pos--)
       @@ -111,7 +123,7 @@ key(int k)
        top:
                switch (k) {
                case CTL('C'):
       -                return EXIT_FAILURE;
       +                return -1;
                case CTL('U'):
                        input[0] = '\0';
                        filter();
       @@ -154,7 +166,7 @@ top:
                case CTL('J'):  /* enter */
                case CTL('M'):
                        print_selection();
       -                return EXIT_SUCCESS;
       +                return 0;
                case ALT('['):
                        k = CSI(fgetc(stdin));
                        goto top;
       @@ -165,5 +177,5 @@ top:
                        add_char((char) k);
                }
        
       -        return CONTINUE;
       +        return 1;
        }
   DIR diff --git a/display.c b/display.c
       @@ -1,3 +1,11 @@
       +#include <sys/ioctl.h>
       +#include <string.h>
       +#include <stdio.h>
       +#include <limits.h>
       +
       +#include "iomenu.h"
       +#include "utf8.h"
       +#include "control.h"
        #include "display.h"
        
        static char *
       @@ -15,7 +23,7 @@ format(char *str, int cols)
                                        col++;
                                }
                                str++;
       -                } else if (utf8_to_rune(&rune, str) && rune_is_print(rune)) {
       +                } else if (utf8_to_rune(&rune, str) && utf8_is_print(rune)) {
                                int i = utf8_len(str);
                                while (i--)
                                        *fmt++ = *str++;
   DIR diff --git a/iomenu.core b/iomenu.core
       Binary files differ.
   DIR diff --git a/iomenu.h b/iomenu.h
       @@ -0,0 +1,21 @@
       +#ifndef SIGWINCH
       +#define SIGWINCH 28
       +#endif
       +
       +#define MARGIN   30
       +
       +#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
       +
       +extern struct winsize   ws;
       +extern char           **linev;
       +extern int              linec;
       +extern char           **matchv;
       +extern int              matchc;
       +extern char            *prompt;
       +extern char             input[LINE_MAX];
       +extern char             formatted[LINE_MAX * 8];
       +extern int              current;
       +extern int              offset;
       +extern int              next;
       +extern int              opt[128];
       +extern int              rows;
   DIR diff --git a/main.c b/main.c
       @@ -1,8 +1,37 @@
       +#include <sys/ioctl.h>
       +
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <termios.h>
       +#include <signal.h>
       +#include <string.h>
       +#include <unistd.h>
       +#include <fcntl.h>
       +#include <limits.h>
       +
       +#include "iomenu.h"
        #include "main.h"
       +#include "buffer.h"
       +#include "control.h"
       +#include "display.h"
        
        static struct termios termios;
        static int            ttyfd;
        
       +struct winsize   ws;
       +char           **linev = NULL;
       +int              linec = 0;
       +char           **matchv = NULL;
       +int              matchc = 0;
       +char            *prompt = "";
       +char             input[LINE_MAX];
       +char             formatted[LINE_MAX * 8];
       +int              current = 0;
       +int              offset = 0;
       +int              rows = 0;
       +int              next = 0;
       +int              opt[128];
       +
        void
        die(const char *s)
        {
       @@ -112,7 +141,7 @@ main(int argc, char *argv[])
                set_terminal();
                sigwinch();
                input[0] = '\0';
       -        while ((exit_code = key(fgetc(stdin))) == CONTINUE)
       +        while ((exit_code = key(fgetc(stdin))) > 0)
                        print_screen();
                print_screen();
                reset_terminal();
   DIR diff --git a/main.h b/main.h
       @@ -1,29 +1 @@
       -#ifndef SIGWINCH
       -#define SIGWINCH 28
       -#endif
       -
       -#define CONTINUE (EXIT_SUCCESS + EXIT_FAILURE + 1)
       -#define MARGIN   30
       -
       -#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
       -
       -winsize   ws;
       -char    **linev   = NULL;
       -int       linec   = 0;
       -char    **matchv  = NULL;
       -int       matchc  = 0;
       -char     *prompt  = "";
       -char      input[LINE_MAX];
       -char      formatted[LINE_MAX * 8];
       -int       current = 0;
       -int       offset  = 0;
       -int       next    = 0;
       -int       opt[128];
       -int       rows    = 0;
       -
       -size_t utf8_len        (char *);
       -size_t rune_len        (long);
       -size_t utf8_to_rune    (long *, char *);
       -int    utf8_is_unicode (long);
       -int    utf8_check      (char *);
       -int    utf8_is_print   (long);
       +void die (const char *);
   DIR diff --git a/utf8.c b/utf8.c
       @@ -1,3 +1,5 @@
       +#include <stddef.h>
       +
        #include "utf8.h"
        
        /*