9term, win: better \r handling (thanks, git)

Change-Id: I75563b911b54d8957d2d004b9c27d0a2f8f043b3
Reviewed-on: https://plan9port-review.googlesource.com/1390
Reviewed-by: Russ Cox <rsc@google.com>
diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
index decfece..97ef6d8 100644
--- a/src/cmd/9term/win.c
+++ b/src/cmd/9term/win.c
@@ -479,6 +479,32 @@
 	}
 }
 
+int
+dropcr(char *p, int n)
+{
+	int i;
+	char *w, *r;
+	
+	r = p;
+	w = p;
+	for(i=0; i<n; i++) {
+		switch(*r) {
+		case '\b':
+			if(w > p)
+				w--;
+			break;
+		case '\r':
+			*w++ = '\n';
+			break;
+		default:
+			*w++ = *r;
+			break;
+		}
+		r++;
+	}
+	return w-p;
+}
+
 void
 stdoutproc(void *v)
 {
@@ -507,6 +533,10 @@
 		n = dropcrnl(buf+npart, n);
 		if(n == 0)
 			continue;
+		
+		n = dropcr(buf+npart, n);
+		if(n == 0)
+			continue;
 
 		/* squash NULs */
 		s = memchr(buf+npart, 0, n);
diff --git a/src/cmd/9term/wind.c b/src/cmd/9term/wind.c
index 28d45cb..b03f15f 100644
--- a/src/cmd/9term/wind.c
+++ b/src/cmd/9term/wind.c
@@ -361,7 +361,7 @@
 						if(up == rp)
 							initial = wbswidth(w, '\r');
 					}else if(i == nr-1)
-						*up = '\n';
+						*up++ = '\n';
 					break;
 				default:
 					*up++ = *bp;