Commit Diff


commit - ca9ae08876bc9ce2107fac50cf703760ecf10901
commit + 5b6028903dc9a0d1561a54764a520aaa1b1100e4
blob - 53f72167f19792032feab3fa59d6b75dc341d809
blob + 9a9b4284193a23d1423355a01bb8f194c8b49280
--- CONTRIBUTORS
+++ CONTRIBUTORS
@@ -17,6 +17,7 @@ David Jeannot <djeannot24@gmail.com>
 David Swasey <david.swasey@gmail.com>
 Enrique Soriano <enrique.soriano@gmail.com>
 Eoghan Sherry <ejsherry@gmail.com>
+Erik Quanstrom <quanstro@quanstro.net>
 Fazlul Shahriar <fshahriar@gmail.com>
 Ingo Dreilich <yngoto@gmail.com>
 Justin Davis <jrcd83@gmail.com>
blob - a1cc38484bc8688b46f6f6e11a08c8bdbf81fc28
blob + 671b324f25a5506556dd7a4e013cd94ea57ecfd3
--- src/cmd/acme/xfid.c
+++ src/cmd/acme/xfid.c
@@ -403,11 +403,42 @@ shouldscroll(Text *t, uint q0, int qid)
 	return t->org <= q0 && q0 <= t->org+t->fr.nchars;
 }
 
+static Rune*
+fullrunewrite(Xfid *x, int *inr)
+{
+	int q, cnt, c, nb, nr;
+	Rune *r;
+
+	q = x->f->nrpart;
+	cnt = x->fcall.count;
+	if(q > 0){
+		memmove(x->fcall.data+q, x->fcall.data, cnt);	/* there's room; see fsysproc */
+		memmove(x->fcall.data, x->f->rpart, q);
+		cnt += q;
+		x->f->nrpart = 0;
+	}
+	r = runemalloc(cnt);
+	cvttorunes(x->fcall.data, cnt-UTFmax, r, &nb, &nr, nil);
+	/* approach end of buffer */
+	while(fullrune(x->fcall.data+nb, cnt-nb)){
+		c = nb;
+		nb += chartorune(&r[nr], x->fcall.data+c);
+		if(r[nr])
+			nr++;
+	}
+	if(nb < cnt){
+		memmove(x->f->rpart, x->fcall.data+nb, cnt-nb);
+		x->f->nrpart = cnt-nb;
+	}
+	*inr = nr;
+	return r;
+}
+
 void
 xfidwrite(Xfid *x)
 {
 	Fcall fc;
-	int c, cnt, qid, q, nb, nr, eval;
+	int c, qid, nb, nr, eval;
 	char buf[64], *err;
 	Window *w;
 	Rune *r;
@@ -463,7 +494,7 @@ xfidwrite(Xfid *x)
 
 	case Qeditout:
 	case QWeditout:
-		r = bytetorune(x->fcall.data, &nr);
+		r = fullrunewrite(x, &nr);
 		if(w)
 			err = edittext(w, w->wrselrange.q1, r, nr);
 		else
@@ -538,27 +569,7 @@ xfidwrite(Xfid *x)
 		goto BodyTag;
 
 	BodyTag:
-		q = x->f->nrpart;
-		cnt = x->fcall.count;
-		if(q > 0){
-			memmove(x->fcall.data+q, x->fcall.data, cnt);	/* there's room; see fsysproc */
-			memmove(x->fcall.data, x->f->rpart, q);
-			cnt += q;
-			x->f->nrpart = 0;
-		}
-		r = runemalloc(cnt);
-		cvttorunes(x->fcall.data, cnt-UTFmax, r, &nb, &nr, nil);
-		/* approach end of buffer */
-		while(fullrune(x->fcall.data+nb, cnt-nb)){
-			c = nb;
-			nb += chartorune(&r[nr], x->fcall.data+c);
-			if(r[nr])
-				nr++;
-		}
-		if(nb < cnt){
-			memmove(x->f->rpart, x->fcall.data+nb, cnt-nb);
-			x->f->nrpart = cnt-nb;
-		}
+		r = fullrunewrite(x, &nr);
 		if(nr > 0){
 			wincommit(w, t);
 			if(qid == QWwrsel){