| tfix and clean ttyread(). buf wasn't static. - st - [fork] customized build of … | |
| git clone git://src.adamsgaard.dk/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit af75c433e56e74d2ad7a315d504a9303ea532f18 | |
| parent 41a4497ecfa66c1dbc65202ae80542c18c5d7793 | |
| Author: Aurélien Aptel <[email protected]> | |
| Date: Sat, 27 Nov 2010 21:19:31 +0100 | |
| fix and clean ttyread(). buf wasn't static. | |
| Diffstat: | |
| M st.c | 34 ++++++++++++++++++-----------… | |
| 1 file changed, 20 insertions(+), 14 deletions(-) | |
| --- | |
| diff --git a/st.c b/st.c | |
| t@@ -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 = 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 | |
| t@@ -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); |