From: ak1 Date: Wed, 23 Feb 2005 19:36:55 +0000 (+0000) Subject: Andreas Krennmair: X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=3f16bceeb4f971faf832d5397ddb216d7fa51ead Andreas Krennmair: another fuckup git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@81 e385b8ad-14ed-0310-8656-cc95a2468c6d --- diff --git a/curs_lib.c b/curs_lib.c index fcf17b6..d62d651 100644 --- a/curs_lib.c +++ b/curs_lib.c @@ -594,23 +594,41 @@ void mutt_format_string (char *dest, size_t destlen, int arboreal) { char *p; + wchar_t wc; int w; size_t k, k2; char scratch[MB_LEN_MAX]; + mbstate_t mbstate1, mbstate2; + memset(&mbstate1, 0, sizeof (mbstate1)); + memset(&mbstate2, 0, sizeof (mbstate2)); --destlen; p = dest; - for (; n; s+=1, n-=1) + for (; n && (k = mbrtowc (&wc, s, n, &mbstate1)); s += k, n -= k) { - w = 1; - k2 = 1; - if (w > max_width) + if (k == (size_t)(-1) || k == (size_t)(-2)) + { + k = (k == (size_t)(-1)) ? 1 : n; + wc = replacement_char (); + } + if (arboreal && wc < M_TREE_MAX) + w = 1; /* hack */ + else + { + if (!IsWPrint (wc)) + wc = '?'; + w = wcwidth (wc); + } + if (w >= 0) + { + if (w > max_width || (k2 = wcrtomb (scratch, wc, &mbstate2)) > destlen) break; - min_width -= w; - max_width -= w; - strncpy (p, s, k2); - p += k2; - destlen -= k2; + min_width -= w; + max_width -= w; + strncpy (p, scratch, k2); + p += k2; + destlen -= k2; + } } w = (int)destlen < min_width ? destlen : min_width; if (w <= 0)