diff options
| author | Devin J. Pohly <djpohly@gmail.com> | 2017-10-15 20:35:48 -0500 | 
|---|---|---|
| committer | Devin J. Pohly <djpohly@gmail.com> | 2018-02-25 21:53:24 -0600 | 
| commit | 32d3b1d00f66eda4f5446f3b32cabed2c9a77a40 (patch) | |
| tree | d7e106917d1db250e23979818616665fb69437ba | |
| parent | 69e32a61df15787c410a48eaa10a89240c36257d (diff) | |
| download | st-32d3b1d00f66eda4f5446f3b32cabed2c9a77a40.tar.gz st-32d3b1d00f66eda4f5446f3b32cabed2c9a77a40.zip  | |
Factor out equivalent code from ttyread/ttysend
The echo-to-terminal portions of ttyread and ttysend were actually doing
the same thing.  New function twrite() now handles this.  The parameter
show_ctrl determines whether control characters are shown as "^A".  This
was the only difference between tputc and techo, and techo is now unused
and removed.
(This commit should not change st's behaviour.)
Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
| -rw-r--r-- | st.c | 101 | ||||
| -rw-r--r-- | st.h | 2 | 
2 files changed, 41 insertions, 62 deletions
@@ -161,8 +161,8 @@ static void tsetchar(Rune, Glyph *, int, int);  static void tsetscroll(int, int);  static void tswapscreen(void);  static void tsetmode(int, int, int *, int); +static int twrite(const char *, int, int);  static void tfulldirt(void); -static void techo(Rune);  static void tcontrolcode(uchar );  static void tdectest(char );  static void tdefutf8(char); @@ -254,7 +254,7 @@ xstrdup(char *s)  }  size_t -utf8decode(char *c, Rune *u, size_t clen) +utf8decode(const char *c, Rune *u, size_t clen)  {  	size_t i, j, len, type;  	Rune udecoded; @@ -768,38 +768,19 @@ ttyread(void)  {  	static char buf[BUFSIZ];  	static int buflen = 0; -	char *ptr; -	int charsize; /* size of utf8 char in bytes */ -	Rune unicodep; +	int written;  	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", strerror(errno)); -  	buflen += ret; -	ptr = buf; -	for (;;) { -		if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { -			/* process a complete utf8 char */ -			charsize = utf8decode(ptr, &unicodep, buflen); -			if (charsize == 0) -				break; -			tputc(unicodep); -			ptr += charsize; -			buflen -= charsize; - -		} else { -			if (buflen <= 0) -				break; -			tputc(*ptr++ & 0xFF); -			buflen--; -		} -	} +	written = twrite(buf, buflen, 0); +	buflen -= written;  	/* keep any uncomplete utf8 char for the next call */  	if (buflen > 0) -		memmove(buf, ptr, buflen); +		memmove(buf, buf + written, buflen);  	return ret;  } @@ -864,27 +845,9 @@ write_error:  void  ttysend(char *s, size_t n)  { -	int len; -	char *t, *lim; -	Rune u; -  	ttywrite(s, n); -	if (!IS_SET(MODE_ECHO)) -		return; - -	lim = &s[n]; -	for (t = s; t < lim; t += len) { -		if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { -			len = utf8decode(t, &u, n); -		} else { -			u = *t & 0xFF; -			len = 1; -		} -		if (len <= 0) -			break; -		techo(u); -		n -= len; -	} +	if (IS_SET(MODE_ECHO)) +		twrite(s, n, 1);  }  void @@ -2032,22 +1995,6 @@ tputtab(int n)  }  void -techo(Rune u) -{ -	if (ISCONTROL(u)) { /* control code */ -		if (u & 0x80) { -			u &= 0x7f; -			tputc('^'); -			tputc('['); -		} else if (u != '\n' && u != '\r' && u != '\t') { -			u ^= 0x40; -			tputc('^'); -		} -	} -	tputc(u); -} - -void  tdefutf8(char ascii)  {  	if (ascii == 'G') @@ -2437,6 +2384,38 @@ check_control_code:  	}  } +int +twrite(const char *buf, int buflen, int show_ctrl) +{ +	int charsize; +	Rune u; +	int n; + +	for (n = 0; n < buflen; n += charsize) { +		if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) { +			/* process a complete utf8 char */ +			charsize = utf8decode(buf + n, &u, buflen - n); +			if (charsize == 0) +				break; +		} else { +			u = buf[n] & 0xFF; +			charsize = 1; +		} +		if (show_ctrl && ISCONTROL(u)) { +			if (u & 0x80) { +				u &= 0x7f; +				tputc('^'); +				tputc('['); +			} else if (u != '\n' && u != '\r' && u != '\t') { +				u ^= 0x40; +				tputc('^'); +			} +		} +		tputc(u); +	} +	return n; +} +  void  tresize(int col, int row)  { @@ -209,7 +209,7 @@ void selnormalize(void);  int selected(int, int);  char *getsel(void); -size_t utf8decode(char *, Rune *, size_t); +size_t utf8decode(const char *, Rune *, size_t);  size_t utf8encode(Rune, char *);  void *xmalloc(size_t);  | 
