tFix tputc control code handling - st - [fork] customized build of st, the simp… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 3764f38fc805a8846bd18f1d555a10227fd14e29 | |
parent 53105cf74fde46229912275c073f8c0f219b05bb | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Mon, 28 Apr 2014 18:32:09 +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. | |
Diffstat: | |
M st.c | 20 ++++++++------------ | |
1 file changed, 8 insertions(+), 12 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 != (… | |
#define IS_SET(flag) ((term.mode & (flag)) != 0) | |
t@@ -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); | |
t@@ -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); | |
t@@ -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 | |
t@@ -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) { |