# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit af75c433e56e74d2ad7a315d504a9303ea532f18
    parent 41a4497ecfa66c1dbc65202ae80542c18c5d7793
    Author: Aurélien Aptel <aurelien.aptel@gmail.com>
    Date:   Sat, 27 Nov 2010 21:19:31 +0100

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

    Diffstat:
    Mst.c | 34++++++++++++++++++++--------------

    1 file changed, 20 insertions(+), 14 deletions(-)
    diff --git a/st.c b/st.c
    @@ -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);