These callers in libedit might get confused if wcwidth() returns -1.

Note how the result ct_visual_width() is used in refresh.c:

refresh.c:                      h += ct_visual_width(*cp);


Index: chartype.c
===================================================================
RCS file: /cvs/src/lib/libedit/chartype.c,v
retrieving revision 1.1
diff -u -p -r1.1 chartype.c
--- chartype.c  30 Jun 2010 00:05:35 -0000      1.1
+++ chartype.c  3 Apr 2011 21:37:10 -0000
@@ -258,6 +258,9 @@ protected int
 ct_visual_width(Char c)
 {
        int t = ct_chr_class(c);
+#ifdef WIDECHAR
+       int w;
+#endif
        switch (t) {
        case CHTYPE_ASCIICTL:
                return 2; /* ^@ ^? etc. */
@@ -267,7 +270,8 @@ ct_visual_width(Char c)
                return 0; /* Should this be 1 instead? */
 #ifdef WIDECHAR
        case CHTYPE_PRINT:
-               return wcwidth(c);
+               w = wcwidth(c);
+               return (w == -1 ? 0 : w);
        case CHTYPE_NONPRINT:
                if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */
                        return 8; /* \U+12345 */
Index: refresh.c
===================================================================
RCS file: /cvs/src/lib/libedit/refresh.c,v
retrieving revision 1.11
diff -u -p -r1.11 refresh.c
--- refresh.c   30 Jun 2010 00:05:35 -0000      1.11
+++ refresh.c   3 Apr 2011 21:39:42 -0000
@@ -160,6 +160,9 @@ re_putc(EditLine *el, Int c, int shift)
        int i, w = Width(c);
        ELRE_DEBUG(1, (__F, "printing %5x '%c'\r\n", c, c));
 
+       if (w == -1)
+               w = 0;
+
        while (shift && (el->el_refresh.r_cursor.h + w > el->el_term.t_size.h))
            re_putc(el, ' ', 1);

Reply via email to