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>
This commit is contained in:
		
							parent
							
								
									69e32a61df
								
							
						
					
					
						commit
						32d3b1d00f
					
				
							
								
								
									
										101
									
								
								st.c
								
								
								
								
							
							
						
						
									
										101
									
								
								st.c
								
								
								
								
							| 
						 | 
					@ -161,8 +161,8 @@ static void tsetchar(Rune, Glyph *, int, int);
 | 
				
			||||||
static void tsetscroll(int, int);
 | 
					static void tsetscroll(int, int);
 | 
				
			||||||
static void tswapscreen(void);
 | 
					static void tswapscreen(void);
 | 
				
			||||||
static void tsetmode(int, int, int *, int);
 | 
					static void tsetmode(int, int, int *, int);
 | 
				
			||||||
 | 
					static int twrite(const char *, int, int);
 | 
				
			||||||
static void tfulldirt(void);
 | 
					static void tfulldirt(void);
 | 
				
			||||||
static void techo(Rune);
 | 
					 | 
				
			||||||
static void tcontrolcode(uchar );
 | 
					static void tcontrolcode(uchar );
 | 
				
			||||||
static void tdectest(char );
 | 
					static void tdectest(char );
 | 
				
			||||||
static void tdefutf8(char);
 | 
					static void tdefutf8(char);
 | 
				
			||||||
| 
						 | 
					@ -254,7 +254,7 @@ xstrdup(char *s)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t
 | 
					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;
 | 
						size_t i, j, len, type;
 | 
				
			||||||
	Rune udecoded;
 | 
						Rune udecoded;
 | 
				
			||||||
| 
						 | 
					@ -768,38 +768,19 @@ ttyread(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static char buf[BUFSIZ];
 | 
						static char buf[BUFSIZ];
 | 
				
			||||||
	static int buflen = 0;
 | 
						static int buflen = 0;
 | 
				
			||||||
	char *ptr;
 | 
						int written;
 | 
				
			||||||
	int charsize; /* size of utf8 char in bytes */
 | 
					 | 
				
			||||||
	Rune unicodep;
 | 
					 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* append read bytes to unprocessed bytes */
 | 
						/* append read bytes to unprocessed bytes */
 | 
				
			||||||
	if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
 | 
						if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0)
 | 
				
			||||||
		die("Couldn't read from shell: %s\n", strerror(errno));
 | 
							die("Couldn't read from shell: %s\n", strerror(errno));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	buflen += ret;
 | 
						buflen += ret;
 | 
				
			||||||
	ptr = buf;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (;;) {
 | 
						written = twrite(buf, buflen, 0);
 | 
				
			||||||
		if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) {
 | 
						buflen -= written;
 | 
				
			||||||
			/* 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--;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/* keep any uncomplete utf8 char for the next call */
 | 
						/* keep any uncomplete utf8 char for the next call */
 | 
				
			||||||
	if (buflen > 0)
 | 
						if (buflen > 0)
 | 
				
			||||||
		memmove(buf, ptr, buflen);
 | 
							memmove(buf, buf + written, buflen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -864,27 +845,9 @@ write_error:
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
ttysend(char *s, size_t n)
 | 
					ttysend(char *s, size_t n)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int len;
 | 
					 | 
				
			||||||
	char *t, *lim;
 | 
					 | 
				
			||||||
	Rune u;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ttywrite(s, n);
 | 
						ttywrite(s, n);
 | 
				
			||||||
	if (!IS_SET(MODE_ECHO))
 | 
						if (IS_SET(MODE_ECHO))
 | 
				
			||||||
		return;
 | 
							twrite(s, n, 1);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	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;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -2031,22 +1994,6 @@ tputtab(int n)
 | 
				
			||||||
	term.c.x = LIMIT(x, 0, term.col-1);
 | 
						term.c.x = LIMIT(x, 0, term.col-1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
					void
 | 
				
			||||||
tdefutf8(char ascii)
 | 
					tdefutf8(char ascii)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					void
 | 
				
			||||||
tresize(int col, int row)
 | 
					tresize(int col, int row)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								st.h
								
								
								
								
							
							
						
						
									
										2
									
								
								st.h
								
								
								
								
							| 
						 | 
					@ -209,7 +209,7 @@ void selnormalize(void);
 | 
				
			||||||
int selected(int, int);
 | 
					int selected(int, int);
 | 
				
			||||||
char *getsel(void);
 | 
					char *getsel(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t utf8decode(char *, Rune *, size_t);
 | 
					size_t utf8decode(const char *, Rune *, size_t);
 | 
				
			||||||
size_t utf8encode(Rune, char *);
 | 
					size_t utf8encode(Rune, char *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *xmalloc(size_t);
 | 
					void *xmalloc(size_t);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue