st
simple terminal
git clone https://9o.is/git/st.git
commit c4fbe5705e885029d200307cf09e04c97ea9988c parent 4ea3ffd8eb23bd260d323f64e83dbecaabe8b3e9 Author: Roberto E. Vargas Caballero <k0ga@shike2.com> Date: Mon, 28 Apr 2014 18:32:09 +0200 Fix tputc control code handling The patch 4ea3ffd 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. Diffstat:
| M | st.c | | | 20 | ++++++++------------ |
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/st.c b/st.c @@ -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) @@ -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); @@ -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); @@ -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 @@ -2460,7 +2456,7 @@ tputc(char *c, int len) { if(width == 1 && (ascii == '\a' || 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) {