iAdd support for enabling/disabling utf - st - Simple Terminal Err gopher.r-36.net 70 i Err gopher.r-36.net 70 1Log /scm/st//log.gph gopher.r-36.net 70 1Files /scm/st//files.gph gopher.r-36.net 70 1Refs /scm/st//refs.gph gopher.r-36.net 70 1README /scm/st//file/README.gph gopher.r-36.net 70 1LICENSE /scm/st//file/LICENSE.gph gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1commit f0e2d28732549690466df995981698173daf39c0 /scm/st//commit/f0e2d28732549690466df995981698173daf39c0.gph gopher.r-36.net 70 1parent 078337d7457f7869a85f4ec364be92b79e93c502 /scm/st//commit/078337d7457f7869a85f4ec364be92b79e93c502.gph gopher.r-36.net 70 hAuthor: Roberto E. Vargas Caballero URL:mailto:roberto.vargas@igrid-td.com gopher.r-36.net 70 iDate: Tue, 13 Sep 2016 14:01:18 +0200 Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iAdd support for enabling/disabling utf Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iThere are some ocasions where we want to disable the enconding/decoding of utf8, mainly Err gopher.r-36.net 70 ibecause it adds an important overhead. This is partial patch for ESC % G and ESC % @, Err gopher.r-36.net 70 iwhere they modified the way that st reads and write from/to the serial line, but it does Err gopher.r-36.net 70 inot modifies how it interacts with the X window part. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iDiffstat: Err gopher.r-36.net 70 i st.c | 79 ++++++++++++++++++++++++------- Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i1 file changed, 62 insertions(+), 17 deletions(-) Err gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1diff --git a/st.c b/st.c /scm/st//file/st.c.gph gopher.r-36.net 70 i@@ -137,6 +137,7 @@ enum term_mode { Err gopher.r-36.net 70 i MODE_MOUSEMANY = 1 << 18, Err gopher.r-36.net 70 i MODE_BRCKTPASTE = 1 << 19, Err gopher.r-36.net 70 i MODE_PRINT = 1 << 20, Err gopher.r-36.net 70 i+ MODE_UTF8 = 1 << 21, Err gopher.r-36.net 70 i MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ Err gopher.r-36.net 70 i |MODE_MOUSEMANY, Err gopher.r-36.net 70 i }; Err gopher.r-36.net 70 i@@ -158,6 +159,7 @@ enum escape_state { Err gopher.r-36.net 70 i ESC_ALTCHARSET = 8, Err gopher.r-36.net 70 i ESC_STR_END = 16, /* a final string was encountered */ Err gopher.r-36.net 70 i ESC_TEST = 32, /* Enter in test mode */ Err gopher.r-36.net 70 i+ ESC_UTF8 = 64, Err gopher.r-36.net 70 i }; Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i enum window_state { Err gopher.r-36.net 70 i@@ -412,6 +414,7 @@ static void tfulldirt(void); Err gopher.r-36.net 70 i static void techo(Rune); Err gopher.r-36.net 70 i static void tcontrolcode(uchar ); Err gopher.r-36.net 70 i static void tdectest(char ); Err gopher.r-36.net 70 i+static void tdefutf8(char); Err gopher.r-36.net 70 i static int32_t tdefcolor(int *, int *, int); Err gopher.r-36.net 70 i static void tdeftran(char); Err gopher.r-36.net 70 i static inline int match(uint, uint); Err gopher.r-36.net 70 i@@ -1478,17 +1481,29 @@ ttyread(void) Err gopher.r-36.net 70 i if ((ret = read(cmdfd, buf+buflen, LEN(buf)-buflen)) < 0) Err gopher.r-36.net 70 i die("Couldn't read from shell: %s\n", strerror(errno)); Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i- /* process every complete utf8 char */ Err gopher.r-36.net 70 i buflen += ret; Err gopher.r-36.net 70 i ptr = buf; Err gopher.r-36.net 70 i- while ((charsize = utf8decode(ptr, &unicodep, buflen))) { Err gopher.r-36.net 70 i- tputc(unicodep); Err gopher.r-36.net 70 i- ptr += charsize; Err gopher.r-36.net 70 i- buflen -= charsize; Err gopher.r-36.net 70 i- } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+ for (;;) { Err gopher.r-36.net 70 i+ if (IS_SET(MODE_UTF8)) { Err gopher.r-36.net 70 i+ /* process a complete utf8 char */ Err gopher.r-36.net 70 i+ charsize = utf8decode(ptr, &unicodep, buflen); Err gopher.r-36.net 70 i+ if (charsize == 0) Err gopher.r-36.net 70 i+ break; Err gopher.r-36.net 70 i+ tputc(unicodep); Err gopher.r-36.net 70 i+ ptr += charsize; Err gopher.r-36.net 70 i+ buflen -= charsize; Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ } else { Err gopher.r-36.net 70 i+ if (buflen <= 0) Err gopher.r-36.net 70 i+ break; Err gopher.r-36.net 70 i+ tputc(*ptr++ & 0xFF); Err gopher.r-36.net 70 i+ buflen--; Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i /* keep any uncomplete utf8 char for the next call */ Err gopher.r-36.net 70 i- memmove(buf, ptr, buflen); Err gopher.r-36.net 70 i+ if (buflen > 0) Err gopher.r-36.net 70 i+ memmove(buf, ptr, buflen); Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i return ret; Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i@@ -1554,15 +1569,26 @@ void Err gopher.r-36.net 70 i tttysend(char *s, size_t n) Err gopher.r-36.net 70 i { Err gopher.r-36.net 70 i int len; Err gopher.r-36.net 70 i+ char *t, *lim; Err gopher.r-36.net 70 i Rune u; Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i ttywrite(s, n); Err gopher.r-36.net 70 i- if (IS_SET(MODE_ECHO)) Err gopher.r-36.net 70 i- while ((len = utf8decode(s, &u, n)) > 0) { Err gopher.r-36.net 70 i- techo(u); Err gopher.r-36.net 70 i- n -= len; Err gopher.r-36.net 70 i- s += len; Err gopher.r-36.net 70 i+ if (!IS_SET(MODE_ECHO)) Err gopher.r-36.net 70 i+ return; Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ lim = &s[n]; Err gopher.r-36.net 70 i+ for (t = s; t < lim; t += len) { Err gopher.r-36.net 70 i+ if (IS_SET(MODE_UTF8)) { Err gopher.r-36.net 70 i+ len = utf8decode(t, &u, n); Err gopher.r-36.net 70 i+ } else { Err gopher.r-36.net 70 i+ u = *t & 0xFF; Err gopher.r-36.net 70 i+ len = 1; Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i+ if (len <= 0) Err gopher.r-36.net 70 i+ break; Err gopher.r-36.net 70 i+ techo(u); Err gopher.r-36.net 70 i+ n -= len; Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i void Err gopher.r-36.net 70 i@@ -1656,7 +1682,7 @@ treset(void) Err gopher.r-36.net 70 i term.tabs[i] = 1; Err gopher.r-36.net 70 i term.top = 0; Err gopher.r-36.net 70 i term.bot = term.row - 1; Err gopher.r-36.net 70 i- term.mode = MODE_WRAP; Err gopher.r-36.net 70 i+ term.mode = MODE_WRAP|MODE_UTF8; Err gopher.r-36.net 70 i memset(term.trantbl, CS_USA, sizeof(term.trantbl)); Err gopher.r-36.net 70 i term.charset = 0; Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i@@ -2690,6 +2716,15 @@ techo(Rune u) Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i void Err gopher.r-36.net 70 i+ttdefutf8(char ascii) Err gopher.r-36.net 70 i+{ Err gopher.r-36.net 70 i+ if (ascii == 'G') Err gopher.r-36.net 70 i+ term.mode |= MODE_UTF8; Err gopher.r-36.net 70 i+ else if (ascii == '@') Err gopher.r-36.net 70 i+ term.mode &= ~MODE_UTF8; Err gopher.r-36.net 70 i+} Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+void Err gopher.r-36.net 70 i ttdeftran(char ascii) Err gopher.r-36.net 70 i { Err gopher.r-36.net 70 i static char cs[] = "0B"; Err gopher.r-36.net 70 i@@ -2851,6 +2886,9 @@ eschandle(uchar ascii) Err gopher.r-36.net 70 i case '#': Err gopher.r-36.net 70 i term.esc |= ESC_TEST; Err gopher.r-36.net 70 i return 0; Err gopher.r-36.net 70 i+ case '%': Err gopher.r-36.net 70 i+ term.esc |= ESC_UTF8; Err gopher.r-36.net 70 i+ return 0; Err gopher.r-36.net 70 i case 'P': /* DCS -- Device Control String */ Err gopher.r-36.net 70 i case '_': /* APC -- Application Program Command */ Err gopher.r-36.net 70 i case '^': /* PM -- Privacy Message */ Err gopher.r-36.net 70 i@@ -2930,10 +2968,15 @@ tputc(Rune u) Err gopher.r-36.net 70 i Glyph *gp; Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i control = ISCONTROL(u); Err gopher.r-36.net 70 i- len = utf8encode(u, c); Err gopher.r-36.net 70 i- if (!control && (width = wcwidth(u)) == -1) { Err gopher.r-36.net 70 i- memcpy(c, "\357\277\275", 4); /* UTF_INVALID */ Err gopher.r-36.net 70 i- width = 1; Err gopher.r-36.net 70 i+ if (!IS_SET(MODE_UTF8)) { Err gopher.r-36.net 70 i+ c[0] = u; Err gopher.r-36.net 70 i+ width = len = 1; Err gopher.r-36.net 70 i+ } else { Err gopher.r-36.net 70 i+ len = utf8encode(u, c); Err gopher.r-36.net 70 i+ if (!control && (width = wcwidth(u)) == -1) { Err gopher.r-36.net 70 i+ memcpy(c, "\357\277\275", 4); /* UTF_INVALID */ Err gopher.r-36.net 70 i+ width = 1; Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i if (IS_SET(MODE_PRINT)) Err gopher.r-36.net 70 i@@ -2994,6 +3037,8 @@ tputc(Rune u) Err gopher.r-36.net 70 i csihandle(); Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i return; Err gopher.r-36.net 70 i+ } else if (term.esc & ESC_UTF8) { Err gopher.r-36.net 70 i+ tdefutf8(u); Err gopher.r-36.net 70 i } else if (term.esc & ESC_ALTCHARSET) { Err gopher.r-36.net 70 i tdeftran(u); Err gopher.r-36.net 70 i } else if (term.esc & ESC_TEST) { Err gopher.r-36.net 70 .