Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libcurses __slk_set_finalise - fix length vs. width conf...
details: https://anonhg.NetBSD.org/src/rev/09c3e1099bd2
branches: trunk
changeset: 452921:09c3e1099bd2
user: uwe <uwe%NetBSD.org@localhost>
date: Sun Jul 28 00:51:59 2019 +0000
description:
__slk_set_finalise - fix length vs. width confusion
diffstat:
lib/libcurses/slk.c | 36 +++++++++++++++++++++++-------------
1 files changed, 23 insertions(+), 13 deletions(-)
diffs (93 lines):
diff -r b3fdcd3c7661 -r 09c3e1099bd2 lib/libcurses/slk.c
--- a/lib/libcurses/slk.c Sun Jul 28 00:15:38 2019 +0000
+++ b/lib/libcurses/slk.c Sun Jul 28 00:51:59 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: slk.c,v 1.7 2019/07/28 00:15:38 uwe Exp $ */
+/* $NetBSD: slk.c,v 1.8 2019/07/28 00:51:59 uwe Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: slk.c,v 1.7 2019/07/28 00:15:38 uwe Exp $");
+__RCSID("$NetBSD: slk.c,v 1.8 2019/07/28 00:51:59 uwe Exp $");
#endif /* not lint */
#include <ctype.h>
@@ -719,7 +719,7 @@
__slk_set_finalise(SCREEN *screen, int labnum)
{
struct __slk_label *l;
- size_t spc, len, x;
+ size_t spc, len, width, x;
char *p;
l = &screen->slk_labels[labnum];
@@ -727,24 +727,34 @@
#ifdef HAVE_WCHAR
len = 0;
+ width = 0;
if (l->text != NULL) {
- wchar_t wc;
+ size_t plen;
p = l->text;
+ plen = strlen(l->text);
while (*p != '\0') {
- if ((x = mbrtowc(0, p, strlen(p), &screen->sp)) == -1)
+ size_t mblen;
+ wchar_t wc;
+ int w;
+
+ mblen = mbrtowc(&wc, p, plen, &screen->sp);
+ if ((ssize_t)mblen < 0)
return ERR;
- mbrtowc(&wc, p, x, &screen->sp);
- if (len + wcwidth(wc) > spc)
+ w = wcwidth(wc);
+ if (width + w > spc)
break;
- len += wcwidth(wc);
- p += x;
+ width += w;
+ len += mblen;
+ p += mblen;
+ plen -= mblen;
}
}
#else
len = l->text == NULL ? 0 : strlen(l->text);
if (len > spc)
len = spc;
+ width = len;
#endif
switch(l->justify) {
@@ -752,12 +762,12 @@
x = 0;
break;
case SLK_JUSTIFY_CENTER:
- x = (spc - len) / 2;
- if (x + len > spc)
+ x = (spc - width) / 2;
+ if (x + width > spc)
x--;
break;
case SLK_JUSTIFY_RIGHT:
- x = spc - len;
+ x = spc - width;
break;
default:
return ERR; /* impossible */
@@ -772,7 +782,7 @@
if (len != 0) {
memcpy(p, l->text, len);
p += len;
- spc -= len;
+ spc -= width;
}
if (spc != 0) {
memset(p, ' ', spc);
Home |
Main Index |
Thread Index |
Old Index