The upcoming diff to make wcwidth() return -1 for non-printable
characters might have funny effects for these callers in libcurses.
Index: base/lib_addstr.c
===================================================================
RCS file: /cvs/src/lib/libcurses/base/lib_addstr.c,v
retrieving revision 1.5
diff -u -p -r1.5 lib_addstr.c
--- base/lib_addstr.c 12 Jan 2010 23:22:05 -0000 1.5
+++ base/lib_addstr.c 3 Apr 2011 21:24:19 -0000
@@ -182,7 +182,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t
len = wcwidth(CharOf(astr[i]));
- if (x + len - 1 <= win->_maxx) {
+ if (len >= 0 && x + len - 1 <= win->_maxx) {
line->text[x] = _nc_render(win, astr[i]);
if (len > 1) {
for (j = 0; j < len; ++j) {
Index: base/lib_slkset.c
===================================================================
RCS file: /cvs/src/lib/libcurses/base/lib_slkset.c,v
retrieving revision 1.4
diff -u -p -r1.4 lib_slkset.c
--- base/lib_slkset.c 12 Jan 2010 23:22:06 -0000 1.4
+++ base/lib_slkset.c 3 Apr 2011 21:26:04 -0000
@@ -83,6 +83,7 @@ slk_set(int i, const char *astr, int for
mbstate_t state;
wchar_t wc;
size_t need;
+ int w;
init_mb(state);
need = mbrtowc(0, p, strlen(p), &state);
@@ -91,9 +92,12 @@ slk_set(int i, const char *astr, int for
mbrtowc(&wc, p, need, &state);
if (!iswprint((wint_t) wc))
break;
- if (wcwidth(wc) + numcols > limit)
+ w = wcwidth(wc);
+ if (w >= 0) {
+ if (w + numcols > limit)
break;
- numcols += wcwidth(wc);
+ numcols += w;
+ }
p += need;
}
numchrs = (p - str);
Index: widechar/lib_cchar.c
===================================================================
RCS file: /cvs/src/lib/libcurses/widechar/lib_cchar.c,v
retrieving revision 1.1
diff -u -p -r1.1 lib_cchar.c
--- widechar/lib_cchar.c 6 Sep 2010 17:26:17 -0000 1.1
+++ widechar/lib_cchar.c 3 Apr 2011 21:28:19 -0000
@@ -73,7 +73,7 @@ setcchar(cchar_t *wcval,
* are only interested in adding non-spacing characters.
*/
for (i = 1; i < len; ++i) {
- if (wcwidth(wch[i]) != 0) {
+ if (wcwidth(wch[i]) >= 1) {
len = i;
break;
}