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>master
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);
|
||||||
|
|
Reference in New Issue