summaryrefslogtreecommitdiffstats
path: root/utf8.c
diff options
context:
space:
mode:
authornicm <nicm>2014-04-02 18:12:18 +0000
committernicm <nicm>2014-04-02 18:12:18 +0000
commit252a7373d69646ae866e3a4fa18d46f673864c0e (patch)
tree3fdd2160affd9a9321157b11ce57bc8d4034e963 /utf8.c
parent82f3e0e9e68d4078555cd6270473c45a3e60273b (diff)
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.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/utf8.c b/utf8.c
index 85889dcb..082683e8 100644
--- a/utf8.c
+++ b/utf8.c
@@ -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);
+}