summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornoname <noname@inventati.org>2014-04-23 23:12:45 +0400
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2014-04-25 23:57:44 +0200
commit844c503c800e5e1db1e409f5db729431ee2e5c00 (patch)
tree72f87a46dc995461976df64b0b2a76fdd7ac409c
parent1b0b9759dca9739da04f5c8a206b2f8ee5ed8b25 (diff)
Optimize tputtab.
Before this patch executing printf '\e[10000000000I' or printf '\e[10000000000Z' resulted in long delay.
-rw-r--r--st.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/st.c b/st.c
index ff9bdd8..c9ef574 100644
--- 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);
}