Xinqi Bao's Git

fix and clean ttyread(). buf wasn't static.
[st.git] / st.c
diff --git a/st.c b/st.c
index 8e3d72f..3829e73 100644 (file)
--- a/st.c
+++ b/st.c
@@ -23,7 +23,7 @@
 
 #if   defined(__linux)
  #include <pty.h>
-#elif defined(__OpenBSD__) || defined(__NetBSD__)
+#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
  #include <util.h>
 #elif defined(__FreeBSD__) || defined(__DragonFly__)
  #include <libutil.h>
@@ -405,7 +405,7 @@ bpress(XEvent *e) {
 void
 selcopy(void) {
        char *str, *ptr;
-       int ls, x, y, sz, sl;
+       int x, y, sz, sl, ls = 0;
 
        if(sel.bx == -1)
                str = NULL;
@@ -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);