Factor out equivalent code from ttyread/ttysend
authorDevin J. Pohly <djpohly@gmail.com>
Mon, 16 Oct 2017 01:35:48 +0000 (20:35 -0500)
committerDevin J. Pohly <djpohly@gmail.com>
Mon, 26 Feb 2018 03:53:24 +0000 (21:53 -0600)
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>
st.c
st.h

diff --git a/st.c b/st.c
index 58f7941..641f896 100644 (file)
--- a/st.c
+++ b/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)
 {
diff --git a/st.h b/st.h
index 09473c2..3d9b6e7 100644 (file)
--- a/st.h
+++ b/st.h
@@ -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);