diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 04:03:38 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-11-03 04:03:38 +0100 |
commit | c5a70cc23d7c4cda32875b46db0990609f229bdd (patch) | |
tree | c30ae9620391922b981a870fbe9f11602bb6c16e /sys/src/cmd/rio/wind.c | |
parent | 9619a621ac8b9be2b38790d21fc5f0c482cd83fa (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.c | 26 |
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; |