diff options
author | nicm <nicm> | 2014-04-02 18:12:18 +0000 |
---|---|---|
committer | nicm <nicm> | 2014-04-02 18:12:18 +0000 |
commit | 252a7373d69646ae866e3a4fa18d46f673864c0e (patch) | |
tree | 3fdd2160affd9a9321157b11ce57bc8d4034e963 /utf8.c | |
parent | 82f3e0e9e68d4078555cd6270473c45a3e60273b (diff) | |
download | rtmux-252a7373d69646ae866e3a4fa18d46f673864c0e.tar.gz rtmux-252a7373d69646ae866e3a4fa18d46f673864c0e.tar.bz2 rtmux-252a7373d69646ae866e3a4fa18d46f673864c0e.zip |
Support UTF-8 with choose-buffer, from Kosuke ASAMI. Also make
buffer_sample bigger to let it trim at window right edge.
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -19,6 +19,7 @@ #include <sys/types.h> #include <string.h> +#include <vis.h> #include "tmux.h" @@ -350,3 +351,45 @@ utf8_width(const struct utf8_data *utf8data) } return (1); } + +/* + * Encode len characters from src into dst, which is guaranteed to have four + * bytes available for each character from src (for \abc or UTF-8) plus space + * for \0. + */ +int +utf8_strvis(char *dst, const char *src, size_t len, int flag) +{ + struct utf8_data utf8data; + const char *start, *end; + int more; + size_t i; + + start = dst; + end = src + len; + + while (src < end) { + if (utf8_open(&utf8data, *src)) { + more = 1; + while (++src < end && more) + more = utf8_append(&utf8data, *src); + if (!more) { + /* UTF-8 character finished. */ + for (i = 0; i < utf8data.size; i++) + *dst++ = utf8data.data[i]; + continue; + } else if (utf8data.have > 0) { + /* Not a complete UTF-8 character. */ + src -= utf8data.have; + } + } + if (src < end - 1) + dst = vis(dst, src[0], flag, src[1]); + else if (src < end) + dst = vis(dst, src[0], flag, '\0'); + src++; + } + + *dst = '\0'; + return (dst - start); +} |