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); |