diff options
| author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2010-11-27 21:19:31 +0100 | 
|---|---|---|
| committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2010-11-27 21:19:31 +0100 | 
| commit | af75c433e56e74d2ad7a315d504a9303ea532f18 (patch) | |
| tree | 7f9319cd7d2fe716173f16acf19b8036ba12c45b | |
| parent | 41a4497ecfa66c1dbc65202ae80542c18c5d7793 (diff) | |
fix and clean ttyread(). buf wasn't static.
| -rw-r--r-- | st.c | 34 | 
1 files changed, 20 insertions, 14 deletions
| @@ -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); | 
