Commit Diff


commit - c5b9ff9fa8f7a65939c3592572a3df1b60dcf57e
commit + dff7e27317f911dcfacaf30eb3ec4f3269f25a62
blob - fe6c50b5e9c16fdf971566ed6baa5f1e96bee4fb
blob + 1b65b88c13f193099276b0d0494e91336ceaaa95
--- src/cmd/9term/9term.c
+++ src/cmd/9term/9term.c
@@ -361,6 +361,8 @@ mouse(void)
 					wordclick(&q0, &q1);
 				if(q0 == q1)
 					break;
+				t.q0 = t.q1 = t.nr;
+				updatesel();
 				paste(t.r+q0, q1-q0, 1);
 				if(t.r[q1-1] != '\n')
 					paste(Lnl, 1, 1);
@@ -384,7 +386,7 @@ mselect(void)
 
 	b = t.m.buttons;
 	q0 = frcharofpt(t.f, t.m.xy) + t.org;
-	if(t.m.msec-clickmsec<500 && clickq0 == q0 && t.q0==t.q1 && b==1){
+	if(t.m.msec-clickmsec<500 && clickq0==q0 && t.q0==t.q1 && b==1){
 		doubleclick(&t.q0, &t.q1);
 		updatesel();
 /*		t.t.i->flush(); */
@@ -408,19 +410,19 @@ mselect(void)
 		clickmsec = t.m.msec;
 		clickq0 = t.q0;
 	}
-	if((t.m.buttons != b) && (b&1)){
-		enum {Cancut = 1, Canpaste = 2} state = Cancut | Canpaste;
+	if((t.m.buttons != b) &&(b&1)){
+		enum{Cancut = 1, Canpaste = 2} state = Cancut | Canpaste;
 		while(t.m.buttons){
-			if(t.m.buttons&2) {
-				if (state&Cancut) {
+			if(t.m.buttons&2){
+				if(state&Cancut){
 					snarf();
 					cut();
 					state = Canpaste;
 				}
-			} else if (t.m.buttons&4) {
-				if (state&Canpaste) {
+			}else if(t.m.buttons&4){
+				if(state&Canpaste){
 					snarfupdate();
-					if (t.nsnarf) {
+					if(t.nsnarf){
 						paste(t.snarf, t.nsnarf, 0);
 					}
 					state = Cancut|Canpaste;
@@ -841,7 +843,6 @@ cut(void)
 void
 snarfupdate(void)
 {
-
 	char *pp;
 	int n, i;
 	Rune *p;
@@ -861,29 +862,31 @@ snarfupdate(void)
 
 }
 
+char sbuf[SnarfSize];
 void
 snarf(void)
 {
-	char buf[SnarfSize], *p;
+	char *p;
 	int i, n;
 	Rune *rp;
 
 	if(t.q1 == t.q0)
 		return;
 	n = t.q1-t.q0;
-	t.snarf =  runerealloc(t.snarf, n);
-	for(i=0,p=buf,rp=t.snarf; i<n && p < buf + SnarfSize-UTFmax; i++){
+	t.snarf = runerealloc(t.snarf, n);
+	for(i=0,p=sbuf,rp=t.snarf; i<n && p < sbuf+SnarfSize-UTFmax; i++){
 		*rp++ = *(t.r+t.q0+i);
 		p += runetochar(p, t.r+t.q0+i);
 	}
 	t.nsnarf = rp-t.snarf;
 	*p = '\0';
-	putsnarf(buf);
+	putsnarf(sbuf);
 }
 
 void
 paste(Rune *r, int n, int advance)
 {
+	Rune *rbuf;
 	uint m;
 	uint q0;
 
@@ -907,6 +910,17 @@ paste(Rune *r, int n, int advance)
 		t.q1 -= m;
 		t.nr -= m;
 		runemove(t.r, t.r+m, t.nr);
+	}
+
+	/*
+	 * if this is a button2 execute then we might have been passed
+	 * runes inside the buffer.  must save them before realloc.
+	 */
+	rbuf = nil;
+	if(t.r <= r && r < t.r+n){
+		rbuf = runemalloc(n);
+		runemove(rbuf, r, n);
+		r = rbuf;
 	}
 	t.r = runerealloc(t.r, t.nr+n);
 	q0 = t.q0;
@@ -925,6 +939,7 @@ paste(Rune *r, int n, int advance)
 		t.q0 += n;
 	t.q1 += n;
 	updatesel();
+	free(rbuf);
 }
 
 void
blob - a34cdc6992c6d83869dc5cea9a9bf3c51f9e2d19
blob + 3dbd6b4a731d4c2919d802b908b79aa9f306f73c
--- src/lib9/mkfile
+++ src/lib9/mkfile
@@ -42,6 +42,7 @@ OFILES=\
 	main.$O\
 	malloctag.$O\
 	mallocz.$O\
+	nan.$O\
 	needsrcquote.$O\
 	netmkaddr.$O\
 	notify.$O\
blob - 90131bce91dc6ed43682fa1a760481b297ff6da1
blob + b95075789357f0532528f512e4809dc6f46043fa
--- src/mkcommon
+++ src/mkcommon
@@ -14,10 +14,10 @@ clean:V: clean-common
 %.clean:V: %.clean-common
 
 nuke-common:V:
-	rm -f *.[$OS] [$OS].out $CLEANFILES $NUKEFILES
+	rm -f *.[$OS] [$OS].out $CLEANFILES y.tab.[ch] $NUKEFILES
 
 clean-common:
-	rm -f *.[$OS] [$OS].out $CLEANFILES
+	rm -f *.[$OS] [$OS].out $CLEANFILES y.tab.[ch]
 
 %.clean-common:V:
 	rm -f $stem.[$OS] [$OS].$stem $stem.acid $stem
blob - 8172845ddac70a72e6da75b9fd5c282b31ee5b33
blob + 6d37e0322b935e7f584719eb9f5ba47582124c12
--- src/mkhdr
+++ src/mkhdr
@@ -20,6 +20,8 @@ LDFLAGS=
 AFLAGS=
 CLEANFILES=
 NUKEFILES=
+YACC=yacc
+YFLAGS=-d
 
 <|cat $PLAN9/src/mk.$SYSNAME-$OBJTYPE 2>/dev/null || true