The little Christmas candy bar: allow utf-8 chars in Tochars \o/
[apps/madmutt.git] / lib-ui / hdrline.c
index e0047a5..24aa3de 100644 (file)
@@ -220,7 +220,7 @@ hdr_format_str(char *dest, ssize_t destlen,
   HEADER *hdr, *htmp;
   CONTEXT *ctx;
   char fmt[STRING], buf2[STRING], ch, *p;
-  int do_locales, i;
+  int do_locales, i, c;
   int optional = (flags & M_FORMAT_OPTIONAL);
   int threads = ((Sort & SORT_MASK) == SORT_THREADS);
   int is_index = (flags & M_FORMAT_INDEX);
@@ -576,9 +576,26 @@ hdr_format_str(char *dest, ssize_t destlen,
     break;
 
   case 'T':
-    snprintf (fmt, sizeof (fmt), "%%%sc", prefix);
-    snprintf (dest, destlen, fmt,
-              ((i = mutt_user_is_recipient(hdr)) < m_strlen(Tochars)) ? Tochars[i] : ' ');
+    i = mutt_user_is_recipient(hdr);
+    assert (i >= 0); /* help compiler to see c is initialized */
+
+    if (Charset_is_utf8) {
+        const char *s = Tochars;
+
+        snprintf (fmt, sizeof (fmt), "%%%slc", prefix);
+        while (i-- >= 0) {
+            c = m_ustrgetc(s, &s);
+            if (c <= 0) {
+                c = ' ';
+                break;
+            }
+        }
+
+        snprintf(dest, destlen, fmt, c);
+    } else {
+        snprintf(fmt, sizeof (fmt), "%%%sc", prefix);
+        snprintf(dest, destlen, fmt, i < m_strlen(Tochars) ? Tochars[i] : ' ');
+    }
     break;
 
   case 'u':
@@ -645,17 +662,38 @@ hdr_format_str(char *dest, ssize_t destlen,
     else if (hdr->security & PGPKEY)
       ch = 'K';
 
-    snprintf(buf2, sizeof (buf2), "%c%c%c",
+    if (hdr->tagged) {
+        c = '*';
+    } else
+    if (hdr->flagged) {
+        c = '!';
+    } else {
+        i = mutt_user_is_recipient(hdr);
+        assert (i >= 0); /* help compiler to see c is initialized */
+
+        if (Charset_is_utf8) {
+            const char *s = Tochars;
+
+            snprintf (fmt, sizeof (fmt), "%%%slc", prefix);
+            while (i-- >= 0) {
+                c = m_ustrgetc(s, &s);
+                if (c <= 0) {
+                    c = ' ';
+                    break;
+                }
+            }
+        } else {
+            c = i < m_strlen(Tochars) ? Tochars[i] : ' ';
+        }
+    }
+    snprintf(buf2, sizeof (buf2), Charset_is_utf8 ? "%c%c%lc" : "%c%c%c",
              (THREAD_NEW ? 'n'
               : (THREAD_OLD
                  ?  'o'
                  : ((hdr->read && (ctx && ctx->msgnotreadyet != hdr->msgno))
                     ? (hdr->replied ? 'r' : ' ')
                     : (hdr->old ?  'O' : 'N')))),
-              hdr->deleted ? 'D' : (hdr->attach_del ? 'd' : ch),
-              hdr->tagged ? '*'
-              : (hdr->flagged ? '!'
-                 : ((i = mutt_user_is_recipient(hdr)) < m_strlen(Tochars) ?  Tochars[i] : ' ')));
+              hdr->deleted ? 'D' : (hdr->attach_del ? 'd' : ch), c);
     mutt_format_s (dest, destlen, prefix, buf2);
     break;