tab int stdin and multiple selection support. - iomenu - interactive terminal-based selection menu
 (HTM) git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Tags
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 7563651b88d576f9cf06863ab10c9491f9f82d4e
 (DIR) parent 601965c26a8164917e4b817273a5af3c901bc98f
 (HTM) Author: Josuah Demangeonā  ā µ <mail@josuah.net>
       Date:   Sun, 19 Mar 2017 20:53:38 +0100
       
       tab int stdin and multiple selection support.
       
       Diffstat:
         M iomenu.c                            |      48 ++++++++++++++++++++++++++++---
       
       1 file changed, 44 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/iomenu.c b/iomenu.c
       @@ -22,7 +22,7 @@ static struct termios termios;
        FILE *tty_fp = NULL;
        int   tty_fd;
        
       -static char   input[BUFSIZ];
       +static char   input[BUFSIZ], formatted[BUFSIZ * 8];
        static int    current = 0, offset = 0, prev = 0, next = 0;
        static int    linec = 0,      matchc = 0;
        static char **linev = NULL, **matchv = NULL;
       @@ -119,12 +119,48 @@ match_line(char *line, char **tokv, int tokc)
        }
        
        
       +int
       +screen_width(char *str)
       +{
       +        int len = 0;
       +
       +        for (int i = 0; str[i]; i++, len++)
       +                if (str[i] == '\t')
       +                        len += (len + 7) % 8;
       +
       +        return len;
       +}
       +
       +
       +int
       +format_string(char *dest, char *src, int cols)
       +{
       +        int j = 0;
       +
       +        for (int i = 0; src[i] && j < cols; i++) {
       +
       +                if (src[i] == '\t') {
       +                        for (int t = (j + 7) % 8 + 1; t > 0 && j < cols; t--)
       +                                dest[j++] = ' ';
       +                } else {
       +                        dest[j++] = src[i];
       +                }
       +        }
       +
       +        dest[j] = '\0';
       +
       +        return j;
       +}
       +
       +
        static void
        print_string(char *str, int current)
        {
       +        format_string(formatted, str, winsize.ws_col - 2);
       +
                fputs(current   ? "\033[30;47m" : "", stderr);
                fputs(opt_lines ? "\033[K " : " ", stderr);
       -        fprintf(stderr, "%s \033[m", str);
       +        fprintf(stderr, "%s \033[m", formatted);
        }
        
        
       @@ -149,7 +185,7 @@ prev_page(int pos, int cols)
        {
                pos -= pos > 0 ? 1 : 0;
                for (int col = 0; pos > 0; pos--)
       -                if ((col += strlen(matchv[pos]) + 2) > cols)
       +                if ((col += screen_width(matchv[pos]) + 2) > cols)
                                return pos + 1;
                return pos;
        }
       @@ -159,7 +195,7 @@ static int
        next_page(int pos, int cols)
        {
                for (int col = 0; pos < matchc; pos++)
       -                if ((col += strlen(matchv[pos]) + 2) > cols)
       +                if ((col += screen_width(matchv[pos]) + 2) > cols)
                                return pos;
                return pos;
        }
       @@ -341,6 +377,10 @@ input_key(void)
                        filter_lines();
                        break;
        
       +        case CONTROL('Y'):
       +                print_selection();
       +                break;
       +
                case CONTROL('J'):
                case CONTROL('M'):  /* enter */
                        print_selection();