URI: 
       iomenu.c: fixed tab width calculation - 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 4b996da3d1d470de301037c3de2cf45d03325c48
   DIR parent 695c25f7dc0613e9aa3e9057b333ec22c0e580f9
  HTML Author: Josuah Demangeon <josuah.demangeon@gandi.net>
       Date:   Mon,  4 Sep 2017 10:23:14 +0200
       
       iomenu.c: fixed tab width calculation
       
       Diffstat:
         M iomenu.c                            |      23 ++++++++++++-----------
       
       1 file changed, 12 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/iomenu.c b/iomenu.c
       @@ -116,13 +116,13 @@ reset_terminal(void)
        }
        
        static size_t
       -str_width(char *s)
       +width(char *s)
        {
                int width = 0;
        
                while (*s) {
                        if (*s++ == '\t')
       -                        width += (width + 7) % 8;
       +                        width += 8 - (width % 8);
                        else
                                width++;
                }
       @@ -137,7 +137,7 @@ prev_page(int pos, int cols)
        
                pos -= pos > 0 ? 1 : 0;
                for (col = 0; pos > 0; pos--)
       -                if ((col += str_width(matchv[pos]) + 2) > cols)
       +                if ((col += width(matchv[pos]) + 2) > cols)
                                return pos + 1;
                return pos;
        }
       @@ -148,7 +148,7 @@ next_page(int pos, int cols)
                int col;
        
                for (col = 0; pos < matchc; pos++)
       -                if ((col += str_width(matchv[pos]) + 2) > cols)
       +                if ((col += width(matchv[pos]) + 2) > cols)
                                return pos;
                return pos;
        }
       @@ -169,12 +169,14 @@ move(signed int sign)
        static void
        move_page(signed int sign)
        {
       -        int i = current - current % rows + rows * sign;
       +        int i;
        
       -        if (!opt['l'])
       +        if (opt['l'] <= 0)
                        return;
        
       -        if (0 > i || i > matchc)
       +        i = current - current % rows + rows * sign;
       +
       +        if (!(0 < i && i < matchc))
                        return;
        
                current = i - 1;
       @@ -232,6 +234,8 @@ print_lines(void)
        
                while (printed++ < rows)
                        fputs("\n\033[K", stderr);
       +
       +        fprintf(stderr, "\033[%dA\r\033[K", rows);
        }
        
        static void
       @@ -273,7 +277,6 @@ print_screen(void)
        
                if (opt['l'] > 0) {
                        print_lines();
       -                fprintf(stderr, "\033[%dA\r", rows);
                } else {
                        print_segments();
                }
       @@ -432,14 +435,12 @@ top:
        
                case CSI('6'):  /* page down */
                        if (fgetc(stdin) != '~') break;
       -                /* FALLTHROUGH */
                case CTL('V'):
                        move_page(+1);
                        break;
        
                case CTL('I'):  /* tab */
       -                if (linec > 0)
       -                        strcpy(input, matchv[current]);
       +                if (linec > 0) strcpy(input, matchv[current]);
                        filter();
                        break;