summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rio/wind.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-11-03 04:03:38 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-11-03 04:03:38 +0100
commitc5a70cc23d7c4cda32875b46db0990609f229bdd (patch)
treec30ae9620391922b981a870fbe9f11602bb6c16e /sys/src/cmd/rio/wind.c
parent9619a621ac8b9be2b38790d21fc5f0c482cd83fa (diff)
rio: do backspace \b processing inplace avoiding buffer allocation
Diffstat (limited to 'sys/src/cmd/rio/wind.c')
-rw-r--r--sys/src/cmd/rio/wind.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c
index 4a15cc6e8..3497275d2 100644
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -164,7 +164,7 @@ showcandidates(Window *, Completion *);
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 @@ winctl(void *arg)
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 @@ winctl(void *arg)
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;