Commit Diff


commit - 3cf9c2736c8e47f2912280b89874f79009026752
commit + 1551e2db4632ec8a3dc50bf25e6720bf6c1fcca5
blob - e988696e604a401aa7cb0c2d47957c24154868ed
blob + 3829e73836202e4d82699585c96a0fde0d5cd6c1
--- st.c
+++ st.c
@@ -606,24 +606,31 @@ dump(char c) {
 
 void
 ttyread(void) {
-	char buf[BUFSIZ], *ptr;
+	static char buf[BUFSIZ];
+	static int buflen = 0; 
+	char *ptr;
 	char s[UTF_SIZ];
-	int ret, br;
-	static int buflen = 0;
-	long u;
+	int charsize; /* size of utf8 char in bytes */
+	long utf8c;
+	int ret;
 
+	/* append read bytes to unprocessed bytes */
 	if((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
 		die("Couldn't read from shell: %s\n", SERRNO);
-	else {
-		buflen += ret;
-		for(ptr=buf; buflen>=UTF_SIZ||isfullutf8(ptr,buflen); buflen-=br) {
-			br = utf8decode(ptr, &u);
-			utf8encode(&u, s);
-			tputc(s);
-			ptr += br;
-		}
-		memcpy(buf, ptr, buflen);
+
+	/* process every complete utf8 char */
+	buflen += ret;
+	ptr = buf;
+	while(buflen >= UTF_SIZ || isfullutf8(ptr,buflen)) {
+		charsize = utf8decode(ptr, &utf8c);
+		utf8encode(&utf8c, s);
+		tputc(s);
+		ptr    += charsize;
+		buflen -= charsize;
 	}
+
+	/* keep any uncomplete utf8 char for the next call */
+	memcpy(buf, ptr, buflen);
 }
 
 void
@@ -1774,7 +1781,6 @@ kpress(XEvent *ev) {
 			/* 3. X lookup  */
 		default:
 			if(len > 0) {
-				buf[sizeof(buf)-1] = '\0';
 				if(meta && len == 1)
 					ttywrite("\033", 1);
 				ttywrite(buf, len);