[hackers] [st] Fix tputc control code handling || Roberto E. Vargas Caballero

From: <git_AT_suckless.org>
Date: Mon, 28 Apr 2014 18:36:13 +0200

commit 3764f38fc805a8846bd18f1d555a10227fd14e29
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
Date: Mon Apr 28 18:32:09 2014 +0200

    Fix tputc control code handling
    
    The patch 53105cf modified how control codes were detected, because
    it tried to handle also C1 control codes (0x80-0x9f), that have
    upper bit to 1, so they are multi byte character in utf8.
    Code was checking the value of width in order to known that after
    decoding the unicode point had a width of 1 byte, but it as incorrect
    because this width is the columnb width.

diff --git a/st.c b/st.c
index 0425c72..9a979ea 100644
--- a/st.c
+++ b/st.c
_AT_@ -70,8 +70,9 @@ char *argv0;
 #define LEN(a) (sizeof(a) / sizeof(a)[0])
 #define DEFAULT(a, b) (a) = (a) ? (a) : (b)
 #define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b))
-#define ISCONTROLC0(c) (BETWEEN((uchar) (c), 0, 0x1f))
-#define ISCONTROLC1(c) (BETWEEN((uchar) (c), 0x80, 0x9f))
+#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f))
+#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
+#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
 #define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
 #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
 #define IS_SET(flag) ((term.mode & (flag)) != 0)
_AT_@ -402,7 +403,6 @@ static void ttyread(void);
 static void ttyresize(void);
 static void ttysend(char *, size_t);
 static void ttywrite(const char *, size_t);
-static inline bool iscontrol(char);
 
 static void xdraws(char *, Glyph, int, int, int, int);
 static void xhints(void);
_AT_@ -2300,17 +2300,12 @@ tputtab(int n) {
         tmoveto(x, term.c.y);
 }
 
-static inline bool
-iscontrol(char c) {
- return ISCONTROLC0(c) || ISCONTROLC1(c);
-}
-
 void
 techo(char *buf, int len) {
         for(; len > 0; buf++, len--) {
                 char c = *buf;
 
- if(iscontrol(c)) { /* control code */
+ if(ISCONTROL(c)) { /* control code */
                         if(c & 0x80) {
                                 c &= 0x7f;
                                 tputc("^", 1);
_AT_@ -2439,16 +2434,17 @@ tputc(char *c, int len) {
 
         if(len == 1) {
                 width = 1;
- ascii = *c;
+ unicodep = ascii = *c;
         } else {
                 utf8decode(c, &unicodep, UTF_SIZ);
                 width = wcwidth(unicodep);
+ control = ISCONTROLC1(unicodep);
                 ascii = unicodep;
         }
 
- control = iscontrol(ascii) && width == 1;
         if(IS_SET(MODE_PRINT))
                 tprinter(c, len);
+ control = ISCONTROL(unicodep);
 
         /*
          * STR sequence must be checked before anything else
_AT_@ -2460,7 +2456,7 @@ tputc(char *c, int len) {
                 if(width == 1 &&
                    (ascii == '' || ascii == 030 ||
                     ascii == 032 || ascii == 033 ||
- ISCONTROLC1(ascii))) {
+ ISCONTROLC1(unicodep))) {
                         term.esc &= ~ESC_STR;
                         term.esc |= ESC_STR_END;
                 } else if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
Received on Mon Apr 28 2014 - 18:36:13 CEST

This archive was generated by hypermail 2.3.0 : Mon Apr 28 2014 - 18:48:07 CEST