aboutsummaryrefslogtreecommitdiff
path: root/utf8.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2014-04-15 00:33:56 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2014-04-15 00:33:56 +0100
commit4abc8f717a5a786a4dd9e4f24d64ec76b0829993 (patch)
treed52bbbd572c1fb638ac60e75a43d92ede1955155 /utf8.c
parent8e1cef404022422f9f57c72d139f19a82a70a791 (diff)
parent57c514d2f85f9d1c81601bae32131f1cd2948422 (diff)
downloadrtmux-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.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/utf8.c b/utf8.c
index 5babcb3b..20e35137 100644
--- a/utf8.c
+++ b/utf8.c
@@ -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);
+}