From af75c433e56e74d2ad7a315d504a9303ea532f18 Mon Sep 17 00:00:00 2001 From: Aurélien Aptel Date: Sat, 27 Nov 2010 21:19:31 +0100 Subject: fix and clean ttyread(). buf wasn't static. --- st.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/st.c b/st.c index e988696..3829e73 100644 --- a/st.c +++ b/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); -- cgit v1.2.3-13-gbd6f