diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2016-12-20 22:06:50 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2016-12-20 22:08:42 +0100 |
| commit | b4b2c80752f32c0cbf72727a684dfbb2094179b1 (patch) | |
| tree | 7e22fd1c6ff8d8b4555c50f79dc0afa80f2dc32c | |
| parent | ff667bb57409b9fdb2cf3d7449c76f409a4235d3 (diff) | |
| download | vis-b4b2c80752f32c0cbf72727a684dfbb2094179b1.tar.gz vis-b4b2c80752f32c0cbf72727a684dfbb2094179b1.tar.xz | |
vis: improve ga
| -rw-r--r-- | main.c | 29 |
1 files changed, 20 insertions, 9 deletions
@@ -2002,21 +2002,32 @@ static const char *unicode_info(Vis *vis, const char *keys, const Arg *arg) { Text *txt = vis_text(vis); size_t start = view_cursor_get(view); size_t end = text_char_next(txt, start); - char data[end-start], *data_cur = data; - text_bytes_get(txt, start, end - start, data); + char *grapheme = text_bytes_alloc0(txt, start, end-start), *codepoint = grapheme; + if (!grapheme) + return keys; + Buffer info; + buffer_init(&info); + mbstate_t ps = { 0 }; Iterator it = text_iterator_get(txt, start); - char info[255] = "", *info_cur = info; for (size_t pos = start; it.pos < end; pos = it.pos) { text_iterator_codepoint_next(&it, NULL); size_t len = it.pos - pos; wchar_t wc = 0xFFFD; - mbtowc(&wc, data_cur, len); - int width = wcwidth(wc); - info_cur += snprintf(info_cur, sizeof(info) - (info_cur - info) - 1, - "<%s%.*s> U+%04x ", width == 0 ? " " : "", (int)len, data_cur, wc); - data_cur += len; + size_t res = mbrtowc(&wc, codepoint, len, &ps); + bool combining = false; + if (res != (size_t)-1 && res != (size_t)-2) + combining = (wc != L'\0' && wcwidth(wc) == 0); + unsigned char ch = *codepoint; + if (ch < 128 && !isprint(ch)) + buffer_appendf(&info, "<^%c>", ch == 127 ? '?' : ch + 64); + else + buffer_appendf(&info, "<%s%.*s>", combining ? " " : "", (int)len, codepoint); + buffer_appendf(&info, " U+%04x ", wc); + codepoint += len; } - vis_info_show(vis, "%s", info); + vis_info_show(vis, "%s", buffer_content0(&info)); + free(grapheme); + buffer_release(&info); return keys; } |
