From: Anders Helmersson Date: Mon, 9 Dec 2002 17:52:50 +0000 (+0000) Subject: Fix #1390. Based on a patch submitted earlier by Edmund Grimley X-Git-Tag: mutt-1-5-3-rel~43 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=45dbf596afb06e96147f97310a9e713b6e948411;p=mutt Fix #1390. Based on a patch submitted earlier by Edmund Grimley Evans. --- diff --git a/addrbook.c b/addrbook.c index 7256d275..cbc11c14 100644 --- a/addrbook.c +++ b/addrbook.c @@ -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; diff --git a/curs_lib.c b/curs_lib.c index e31acc73..951aef12 100644 --- a/curs_lib.c +++ b/curs_lib.c @@ -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; +} diff --git a/protos.h b/protos.h index 30aa9f89..36cdace2 100644 --- 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 66b175a3..3c6dde9e 100644 --- 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,