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 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
|
||||
@ -2031,22 +1994,6 @@ tputtab(int n)
|
||||
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
|
||||
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
|
||||
tresize(int col, int row)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user