=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/utf8.c,v retrieving revision 1.8 retrieving revision 1.9 diff -c -r1.8 -r1.9 *** src/usr.bin/tmux/utf8.c 2014/03/31 21:43:35 1.8 --- src/usr.bin/tmux/utf8.c 2014/04/02 18:12:18 1.9 *************** *** 1,4 **** ! /* $OpenBSD: utf8.c,v 1.8 2014/03/31 21:43:35 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: utf8.c,v 1.9 2014/04/02 18:12:18 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 19,24 **** --- 19,25 ---- #include #include + #include #include "tmux.h" *************** *** 349,352 **** --- 350,395 ---- return (item->width); } 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); }