diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2014-04-15 00:33:56 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2014-04-15 00:33:56 +0100 |
commit | 4abc8f717a5a786a4dd9e4f24d64ec76b0829993 (patch) | |
tree | d52bbbd572c1fb638ac60e75a43d92ede1955155 /utf8.c | |
parent | 8e1cef404022422f9f57c72d139f19a82a70a791 (diff) | |
parent | 57c514d2f85f9d1c81601bae32131f1cd2948422 (diff) | |
download | rtmux-4abc8f717a5a786a4dd9e4f24d64ec76b0829993.tar.gz rtmux-4abc8f717a5a786a4dd9e4f24d64ec76b0829993.tar.bz2 rtmux-4abc8f717a5a786a4dd9e4f24d64ec76b0829993.zip |
Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -352,3 +352,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); +} |