ref: c5a70cc23d7c4cda32875b46db0990609f229bdd
parent: 9619a621ac8b9be2b38790d21fc5f0c482cd83fa
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Nov 3 00:03:38 EDT 2013
rio: do backspace \b processing inplace avoiding buffer allocation
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -164,7 +164,7 @@
void
winctl(void *arg)
{- Rune *rp, *bp, *tp, *up;
+ Rune *rp, *up;
uint qh, q0;
int nr, nb, c, wid, i, npart, initial, lastb;
char *s, *t, part[3];
@@ -346,23 +346,18 @@
recv(cwm.cw, &pair);
rp = pair.s;
nr = pair.ns;
- bp = rp;
for(i=0; i<nr; i++)
- if(*bp++ == '\b'){- --bp;
+ if(rp[i] == '\b'){+ up = rp+i;
initial = 0;
- tp = runemalloc(nr);
- runemove(tp, rp, i);
- up = tp+i;
for(; i<nr; i++){- *up = *bp++;
- if(*up == '\b')
- if(up == tp)
+ if(rp[i] == '\b'){+ if(up == rp)
initial++;
else
- --up;
- else
- up++;
+ up--;
+ }else
+ *up++ = rp[i];
}
if(initial){if(initial > w->qh)
@@ -371,10 +366,7 @@
wdelete(w, qh, qh+initial);
w->qh = qh;
}
- free(rp);
- rp = tp;
- nr = up-tp;
- rp[nr] = 0;
+ nr = up - rp;
break;
}
w->qh = winsert(w, rp, nr, w->qh)+nr;
--
⑨