shithub: riscv

Download patch

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;
--