This patch originates from the Debian project, see https://www.debian.org/ 13widechar_horrors.dpatch by This patch tries to cope with the fact that widechar support in nvi is at best rudimentary. Hunk 1) * Due to "ch = *t", this code is not wide-char aware, so cast the value to a proper type so the KEY_ macros make the right choice. Hunk 2) * Printing of the in-/decreased number back into the screen buffer is not widechar-aware, either. Add a dirty fix. Cf. #497349. --- nvi-1.81.6.orig/vi/vs_msg.c 2007-11-18 17:41:42.000000000 +0100 +++ nvi-1.81.6/vi/vs_msg.c 2009-03-01 14:51:08.211414132 +0100 @@ -472,10 +472,10 @@ */ if (ch == '\t') ch = ' '; - chlen = KEY_LEN(sp, ch); + chlen = KEY_LEN(sp, (unsigned char)ch); if (cbp + chlen >= ecbp) FLUSH; - for (kp = KEY_NAME(sp, ch); chlen--;) + for (kp = KEY_NAME(sp, (unsigned char)ch); chlen--;) *cbp++ = *kp++; } if (cbp > cbuf) --- nvi-1.81.6.orig/vi/v_increment.c 2007-11-18 17:41:42.000000000 +0100 +++ nvi-1.81.6/vi/v_increment.c 2009-03-01 15:12:50.950415874 +0100 @@ -57,7 +57,7 @@ long change, ltmp, lval; size_t beg, blen, end, len, nlen, wlen; int base, isempty, rval; - char *ntype, nbuf[100]; + char *ntype, nbuf[100 * sizeof(CHAR_T)]; CHAR_T *bp, *p, *t; /* Validate the operator. */ @@ -202,7 +202,7 @@ /* If we cross 0, signed numbers lose their sign. */ if (lval == 0 && ntype == fmt[SDEC]) ntype = fmt[DEC]; - nlen = snprintf(nbuf, sizeof(nbuf), ntype, lval); + nlen = snprintf(nbuf, sizeof(nbuf)/sizeof(CHAR_T), ntype, lval); } else { if ((nret = nget_uslong(sp, &ulval, t, NULL, base)) != NUM_OK) goto err; @@ -224,7 +224,15 @@ if (base == 16) wlen -= 2; - nlen = snprintf(nbuf, sizeof(nbuf), ntype, wlen, ulval); + nlen = snprintf(nbuf, sizeof(nbuf)/sizeof(CHAR_T), ntype, wlen, ulval); + } + + /* Inflate the printed char buffer to CHAR_T elements if necessary */ + if (sizeof(CHAR_T) > sizeof(char)) { + int nlen_inflate; + for (nlen_inflate = nlen; nlen_inflate >= 0; nlen_inflate--) { + ((CHAR_T *)nbuf)[nlen_inflate] = nbuf[nlen_inflate]; + } } /* Build the new line. */