]> granicus.if.org Git - mutt/commitdiff
Fix #1390. Based on a patch submitted earlier by Edmund Grimley
authorAnders Helmersson <anders.helmersson@telia.com>
Mon, 9 Dec 2002 17:52:50 +0000 (17:52 +0000)
committerAnders Helmersson <anders.helmersson@telia.com>
Mon, 9 Dec 2002 17:52:50 +0000 (17:52 +0000)
Evans.

addrbook.c
curs_lib.c
protos.h
query.c

index 7256d27500af6753133688e71073b493d9ed8ab7..cbc11c14964490324c3c0959d2a6ab4c2a414374 100644 (file)
@@ -51,8 +51,7 @@ alias_format_str (char *dest, size_t destlen, char op, const char *src,
       snprintf (dest, destlen, tmp, alias->del ? "D" : " ");
       break;
     case 'a':
-      snprintf (tmp, sizeof (tmp), "%%%ss", fmt);
-      snprintf (dest, destlen, tmp, alias->name);
+      mutt_format_s (dest, destlen, fmt, alias->name);
       break;
     case 'r':
       adr[0] = 0;
index e31acc73f21ea9d618c6537fdcaf8e7b8e09abc6..951aef1221d436d3344d429523301ba876b8fd69 100644 (file)
@@ -540,6 +540,7 @@ int mutt_addwch (wchar_t wc)
     return addstr (buf);
 }
 
+
 /*
  * This formats a string, a bit like
  * snprintf (dest, destlen, "%-*.*s", min_width, max_width, s),
@@ -694,3 +695,34 @@ void mutt_paddstr (int n, const char *s)
   while (n-- > 0)
     addch (' ');
 }
+
+/*
+ * mutt_strwidth is like mutt_strlen except that it returns the width
+ * refering to the number of characters cells.
+ */
+
+int mutt_strwidth (const char *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;
+}
index 30aa9f8962bce70915994a7857f9653fc192c409..36cdace2236300ab7b254e2e1e2f6b5ec1522524 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -317,6 +317,7 @@ int mutt_save_attachment (FILE *, BODY *, char *, int, HEADER *);
 void _mutt_save_message (HEADER *, CONTEXT *, int, int, int);
 int mutt_save_message (HEADER *, int, int, int, int *);
 int mutt_search_command (int, int);
+int mutt_strwidth (const char *);
 int mutt_compose_menu (HEADER *, char *, size_t, HEADER *);
 int mutt_thread_set_flag (HEADER *, int, int, int);
 int mutt_user_is_recipient (HEADER *);
diff --git a/query.c b/query.c
index 66b175a3f75e77c6c7766cf99eef22cdf16ac43e..3c6dde9e7361ede90799830b2a770f81096a6c06 100644 (file)
--- a/query.c
+++ b/query.c
@@ -119,7 +119,7 @@ static QUERY *run_query (char *s, int quiet)
       p = strtok(NULL, "\t\n");
       if (p)
       {
-       l = mutt_strlen (p);
+       l = mutt_strwidth (p);
        if (l > FirstColumn)
          FirstColumn = l;
        cur->name = safe_strdup (p);
@@ -180,7 +180,7 @@ static int query_search (MUTTMENU *m, regex_t *re, int n)
 static void query_entry (char *s, size_t slen, MUTTMENU *m, int num)
 {
   ENTRY *table = (ENTRY *) m->data;
-  char buf[SHORT_STRING] = "";
+  char buf2[SHORT_STRING], buf[SHORT_STRING] = "";
 
   /* need a query format ... hard coded constants are not good */
   while (FirstColumn + SecondColumn > 70)
@@ -195,12 +195,15 @@ static void query_entry (char *s, size_t slen, MUTTMENU *m, int num)
 
   rfc822_write_address (buf, sizeof (buf), table[num].data->addr);
 
-  snprintf (s, slen, " %c %3d %-*.*s %-*.*s %s", 
+  mutt_format_string (buf2, sizeof (buf2),
+                     FirstColumn + 2, FirstColumn + 2,
+                     0, ' ', table[num].data->name,
+                     mutt_strlen (table[num].data->name), 0);
+
+  snprintf (s, slen, " %c %3d %s %-*.*s %s", 
            table[num].tagged ? '*':' ',
            num+1,
-           FirstColumn+2,
-           FirstColumn+2,
-           NONULL (table[num].data->name),
+           buf2,
            SecondColumn+2,
            SecondColumn+2,
            buf,