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

This commit is contained in:
Aurélien Aptel 2010-11-27 21:19:31 +01:00
parent 41a4497ecf
commit af75c433e5
1 changed files with 20 additions and 14 deletions

34
st.c
View File

@ -606,24 +606,31 @@ dump(char c) {
void
ttyread(void) {
char buf[BUFSIZ], *ptr;
char s[UTF_SIZ];
int ret, br;
static char buf[BUFSIZ];
static int buflen = 0;
long u;
char *ptr;
char s[UTF_SIZ];
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);