Optimize tputtab. - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 844c503c800e5e1db1e409f5db729431ee2e5c00
 (DIR) parent 1b0b9759dca9739da04f5c8a206b2f8ee5ed8b25
 (HTM) Author: noname <noname@inventati.org>
       Date:   Wed, 23 Apr 2014 23:12:45 +0400
       
       Optimize tputtab.
       
       Before this patch executing
               printf '\e[10000000000I'
       or
               printf '\e[10000000000Z'
       resulted in long delay.
       
       Diffstat:
         st.c                                |      28 ++++++++++++----------------
       
       1 file changed, 12 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -375,7 +375,7 @@ static void tmoveto(int, int);
        static void tmoveato(int, int);
        static void tnew(int, int);
        static void tnewline(int);
       -static void tputtab(bool);
       +static void tputtab(int);
        static void tputc(char *, int);
        static void treset(void);
        static int tresize(int, int);
       @@ -1996,8 +1996,7 @@ csihandle(void) {
                        break;
                case 'I': /* CHT -- Cursor Forward Tabulation <n> tab stops */
                        DEFAULT(csiescseq.arg[0], 1);
       -                while(csiescseq.arg[0]--)
       -                        tputtab(1);
       +                tputtab(csiescseq.arg[0]);
                        break;
                case 'J': /* ED -- Clear screen */
                        selclear(NULL);
       @@ -2065,8 +2064,7 @@ csihandle(void) {
                        break;
                case 'Z': /* CBT -- Cursor Backward Tabulation <n> tab stops */
                        DEFAULT(csiescseq.arg[0], 1);
       -                while(csiescseq.arg[0]--)
       -                        tputtab(0);
       +                tputtab(-csiescseq.arg[0]);
                        break;
                case 'd': /* VPA -- Move to <row> */
                        DEFAULT(csiescseq.arg[0], 1);
       @@ -2281,19 +2279,17 @@ tdump(void) {
        }
        
        void
       -ttputtab(bool forward) {
       +ttputtab(int n) {
                uint x = term.c.x;
        
       -        if(forward) {
       -                if(x == term.col)
       -                        return;
       -                for(++x; x < term.col && !term.tabs[x]; ++x)
       -                        /* nothing */ ;
       -        } else {
       -                if(x == 0)
       -                        return;
       -                for(--x; x > 0 && !term.tabs[x]; --x)
       -                        /* nothing */ ;
       +        if(n > 0) {
       +                while(x < term.col && n--)
       +                        for(++x; x < term.col && !term.tabs[x]; ++x)
       +                                /* nothing */ ;
       +        } else if(n < 0) {
       +                while(x > 0 && n++)
       +                        for(--x; x > 0 && !term.tabs[x]; --x)
       +                                /* nothing */ ;
                }
                tmoveto(x, term.c.y);
        }