summaryrefslogtreecommitdiffstats
path: root/utf8.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2014-04-05 12:36:14 +0100
committerThomas Adam <thomas@xteddy.org>2014-04-05 12:36:14 +0100
commit0c99c7dbff21082a5f0774e6193b9c9b9a160882 (patch)
tree852fa9fde3126091fa90ee6604097373076772b1 /utf8.c
parent806d5dcb17c26d2abcbf4328a9ec419ada3d4a3f (diff)
parentacef311fe356f408690e9f94727ed63a934b742f (diff)
Merge branch 'obsd-master'
Conflicts: Makefile tty-keys.c
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 5babcb3b..1328dd6e 100644
--- a/utf8.c
+++ b/utf8.c
@@ -19,6 +19,7 @@
#include <sys/types.h>
#include <string.h>
+#include <vis.h>
#include "tmux.h"
@@ -352,3 +353,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);
+}