=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/screen-write.c,v retrieving revision 1.77 retrieving revision 1.78 diff -u -r1.77 -r1.78 --- src/usr.bin/tmux/screen-write.c 2015/11/13 08:09:28 1.77 +++ src/usr.bin/tmux/screen-write.c 2015/11/14 10:56:31 1.78 @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-write.c,v 1.77 2015/11/13 08:09:28 nicm Exp $ */ +/* $OpenBSD: screen-write.c,v 1.78 2015/11/14 10:56:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -115,6 +115,7 @@ struct utf8_data ud; u_char *ptr; size_t left, size = 0; + int more; va_start(ap, fmt); xvasprintf(&msg, fmt, ap); @@ -128,11 +129,12 @@ left = strlen(ptr); if (left < (size_t)ud.size - 1) break; - while (utf8_append(&ud, *ptr)) + while ((more = utf8_append(&ud, *ptr)) == 1) ptr++; ptr++; - size += ud.width; + if (more == 0) + size += ud.width; } else { if (*ptr > 0x1f && *ptr < 0x7f) size++; @@ -176,6 +178,7 @@ struct utf8_data ud; u_char *ptr; size_t left, size = 0; + int more; xvasprintf(&msg, fmt, ap); @@ -187,22 +190,24 @@ left = strlen(ptr); if (left < (size_t)ud.size - 1) break; - while (utf8_append(&ud, *ptr)) + while ((more = utf8_append(&ud, *ptr)) == 1) ptr++; ptr++; - if (maxlen > 0 && - size + ud.width > (size_t) maxlen) { - while (size < (size_t) maxlen) { - screen_write_putc(ctx, gc, ' '); - size++; + if (more == 0) { + if (maxlen > 0 && + size + ud.width > (size_t) maxlen) { + while (size < (size_t) maxlen) { + screen_write_putc(ctx, gc, ' '); + size++; + } + break; } - break; - } - size += ud.width; + size += ud.width; - utf8_copy(&gc->data, &ud); - screen_write_cell(ctx, gc); + utf8_copy(&gc->data, &ud); + screen_write_cell(ctx, gc); + } } else { if (maxlen > 0 && size + 1 > (size_t) maxlen) break; @@ -231,6 +236,7 @@ char *msg; u_char *ptr, *last; size_t left, size = 0; + int more; va_start(ap, fmt); xvasprintf(&msg, fmt, ap); @@ -260,22 +266,24 @@ left = strlen(ptr); if (left < (size_t)ud.size - 1) break; - while (utf8_append(&ud, *ptr)) + while ((more = utf8_append(&ud, *ptr)) == 1) ptr++; ptr++; - if (maxlen > 0 && - size + ud.width > (size_t) maxlen) { - while (size < (size_t) maxlen) { - screen_write_putc(ctx, gc, ' '); - size++; + if (more == 0) { + if (maxlen > 0 && + size + ud.width > (size_t) maxlen) { + while (size < (size_t) maxlen) { + screen_write_putc(ctx, gc, ' '); + size++; + } + break; } - break; - } - size += ud.width; + size += ud.width; - utf8_copy(&lgc.data, &ud); - screen_write_cell(ctx, &lgc); + utf8_copy(&lgc.data, &ud); + screen_write_cell(ctx, &lgc); + } } else { if (maxlen > 0 && size + 1 > (size_t) maxlen) break;