fix and clean ttyread(). buf wasn't static. - st - Simple Terminal
Log
Files
Refs
README
LICENSE
---
commit af75c433e56e74d2ad7a315d504a9303ea532f18
parent 41a4497ecfa66c1dbc65202ae80542c18c5d7793
Author: Aurélien Aptel 
Date:   Sat, 27 Nov 2010 21:19:31 +0100

fix and clean ttyread(). buf wasn't static.

Diffstat:
  st.c                                |      34 ++++++++++++++++++-------------

1 file changed, 20 insertions(+), 14 deletions(-)
---
diff --git a/st.c b/st.c
@@ -606,24 +606,31 @@ dump(char c) {
 
 void
 tttyread(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);