tFactor out equivalent code from ttyread/ttysend - st - [fork] customized build… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 32d3b1d00f66eda4f5446f3b32cabed2c9a77a40 | |
parent 69e32a61df15787c410a48eaa10a89240c36257d | |
Author: Devin J. Pohly <[email protected]> | |
Date: Sun, 15 Oct 2017 20:35:48 -0500 | |
Factor out equivalent code from ttyread/ttysend | |
The echo-to-terminal portions of ttyread and ttysend were actually doing | |
tthe 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 <[email protected]> | |
Diffstat: | |
M st.c | 101 ++++++++++++-----------------… | |
M st.h | 2 +- | |
2 files changed, 41 insertions(+), 62 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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); | |
t@@ -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; | |
t@@ -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; | |
} | |
t@@ -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 | |
t@@ -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') | |
t@@ -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) | |
{ | |
diff --git a/st.h b/st.h | |
t@@ -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); |