diff options
| author | noname <noname@inventati.org> | 2014-04-23 23:12:45 +0400 | 
|---|---|---|
| committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2014-04-25 23:57:44 +0200 | 
| commit | 844c503c800e5e1db1e409f5db729431ee2e5c00 (patch) | |
| tree | 72f87a46dc995461976df64b0b2a76fdd7ac409c | |
| parent | 1b0b9759dca9739da04f5c8a206b2f8ee5ed8b25 (diff) | |
Optimize tputtab.
Before this patch executing
	printf '\e[10000000000I'
or
	printf '\e[10000000000Z'
resulted in long delay.
| -rw-r--r-- | st.c | 28 | 
1 files changed, 12 insertions, 16 deletions
| @@ -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);  } | 
