# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 844c503c800e5e1db1e409f5db729431ee2e5c00
    parent 1b0b9759dca9739da04f5c8a206b2f8ee5ed8b25
    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:
    Mst.c | 28++++++++++++----------------

    1 file changed, 12 insertions(+), 16 deletions(-)
    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
    -tputtab(bool forward) {
    +tputtab(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);
     }