Andreas Krennmair:
authorak1 <ak1@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Wed, 23 Feb 2005 12:33:57 +0000 (12:33 +0000)
committerak1 <ak1@e385b8ad-14ed-0310-8656-cc95a2468c6d>
Wed, 23 Feb 2005 12:33:57 +0000 (12:33 +0000)
revert wchar fuckup (more to come)

git-svn-id: svn://svn.berlios.de/mutt-ng/trunk@77 e385b8ad-14ed-0310-8656-cc95a2468c6d

curs_lib.c
menu.c

index 6e55a2b..fcf17b6 100644 (file)
@@ -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 (file)
--- 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;