From: ak1 Date: Wed, 23 Feb 2005 12:33:57 +0000 (+0000) Subject: Andreas Krennmair: X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=commitdiff_plain;h=99e6bcfa05e57212a4d7d010510dc2663bc1eb8c Andreas Krennmair: revert wchar fuckup (more to come) git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@77 e385b8ad-14ed-0310-8656-cc95a2468c6d --- diff --git a/curs_lib.c b/curs_lib.c index 6e55a2b..fcf17b6 100644 --- a/curs_lib.c +++ b/curs_lib.c @@ -688,14 +688,30 @@ void mutt_format_s_tree (char *dest, void mutt_paddstr (int n, const char *s) { + wchar_t wc; + int w; + size_t k; size_t len = mutt_strlen (s); + mbstate_t mbstate; - for (; len && *s; s += 1, len -= 1) + memset (&mbstate, 0, sizeof (mbstate)); + for (; len && (k = mbrtowc (&wc, s, len, &mbstate)); s += k, len -= k) { - if (1 > n) - break; - addnstr ((char *)s, 1); - n -= 1; + if (k == (size_t)(-1) || k == (size_t)(-2)) + { + k = (k == (size_t)(-1)) ? 1 : len; + wc = replacement_char (); + } + if (!IsWPrint (wc)) + wc = '?'; + w = wcwidth (wc); + if (w >= 0) + { + if (w > n) + break; + addnstr ((char *)s, 1); + n -= w; + } } while (n-- > 0) addch (' '); @@ -704,10 +720,30 @@ void mutt_paddstr (int n, const char *s) /* * mutt_strwidth is like mutt_strlen except that it returns the width * refering to the number of characters cells. - * AK: since we remove all that multibyte-character-stuff, it is equal to mutt_strlen */ int mutt_strwidth (const char *s) { - return mutt_strlen(s); + wchar_t wc; + int w; + size_t k, n; + mbstate_t mbstate; + + if (!s) return 0; + + n = mutt_strlen (s); + + memset (&mbstate, 0, sizeof (mbstate)); + for (w=0; n && (k = mbrtowc (&wc, s, n, &mbstate)); s += k, n -= k) + { + if (k == (size_t)(-1) || k == (size_t)(-2)) + { + k = (k == (size_t)(-1)) ? 1 : n; + wc = replacement_char (); + } + if (!IsWPrint (wc)) + wc = '?'; + w += wcwidth (wc); + } + return w; } diff --git a/menu.c b/menu.c index f892f27..15eccce 100644 --- a/menu.c +++ b/menu.c @@ -39,9 +39,12 @@ extern size_t UngetCount; static void print_enriched_string (int attr, unsigned char *s, int do_color) { + wchar_t wc; size_t k; size_t n = mutt_strlen ((char *)s); + mbstate_t mbstate; + memset (&mbstate, 0, sizeof (mbstate)); while (*s) { if (*s < M_TREE_MAX) @@ -131,10 +134,10 @@ static void print_enriched_string (int attr, unsigned char *s, int do_color) } if (do_color) attrset(attr); } - else if (*s > 0) + else if ((k = mbrtowc (&wc, (char *)s, n, &mbstate)) > 0) { - addnstr ((char *)s, 1); - s += 1, n-= 1; + addnstr ((char *)s, k); + s += k, n-= k; } else break;