Commit Diff


commit - 8ee5da7cf764bf5685c137264cd4d6a03f12ba89
commit + 0d2dfbc84f42317fab5bc247355868d86613f3b0
blob - decfece7a81f5eb6d9e69dcae1f35ebe98928ee2
blob + 97ef6d87dd1b2ac81fe9f93df59b26c120b89087
--- src/cmd/9term/win.c
+++ src/cmd/9term/win.c
@@ -476,7 +476,33 @@ stdinproc(void *v)
 			}
 		}
 		qunlock(&q.lk);
+	}
+}
+
+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
@@ -505,6 +531,10 @@ stdoutproc(void *v)
 			continue;
 		
 		n = dropcrnl(buf+npart, n);
+		if(n == 0)
+			continue;
+		
+		n = dropcr(buf+npart, n);
 		if(n == 0)
 			continue;
 
blob - 28d45cbb591faa7f41332d6d4211333dffe0dfc1
blob + b03f15fcc638e78eb0747a1a5c82c9c3056de0fe
--- src/cmd/9term/wind.c
+++ src/cmd/9term/wind.c
@@ -361,7 +361,7 @@ winctl(void *arg)
 						if(up == rp)
 							initial = wbswidth(w, '\r');
 					}else if(i == nr-1)
-						*up = '\n';
+						*up++ = '\n';
 					break;
 				default:
 					*up++ = *bp;