Fix madmutt for stupid terms with only 64 colors.
[apps/madmutt.git] / lib-ui / hdrline.c
index f3e138b..5bbff4a 100644 (file)
@@ -7,18 +7,17 @@
  * please see the file GPL in the top level source directory.
  */
 
-#include <lib-lib/lib-lib.h>
+#include <lib-ui/lib-ui.h>
 
 #include <lib-mime/mime.h>
-#include <lib-ui/curses.h>
 #include <lib-mx/mx.h>
 
 #include "mutt.h"
 #include "alias.h"
+#include "crypt.h"
 #include "sort.h"
 #include "thread.h"
 #include "charset.h"
-#include <lib-crypt/crypt.h>
 #include "mutt_idna.h"
 
 int mutt_is_mail_list (address_t * addr)
@@ -210,20 +209,17 @@ struct hdr_format_info {
   HEADER *hdr;
 };
 
-static const char *hdr_format_str (char *dest,
-                                   ssize_t destlen,
-                                   char op,
-                                   const char *src,
-                                   const char *prefix,
-                                   const char *ifstring,
-                                   const char *elsestring,
-                                   unsigned long data, format_flag flags)
+static const char *
+hdr_format_str(char *dest, ssize_t destlen,
+               char op, const char *src, const char *prefix,
+               const char *ifstr, const char *elstr,
+               anytype data, format_flag flags)
 {
-  struct hdr_format_info *hfi = (struct hdr_format_info *) data;
+  struct hdr_format_info *hfi = data.ptr;
   HEADER *hdr, *htmp;
   CONTEXT *ctx;
-  char fmt[SHORT_STRING], buf2[SHORT_STRING], ch, *p;
-  int do_locales, i;
+  char fmt[STRING], buf2[STRING], ch, *p;
+  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);
@@ -408,13 +404,6 @@ static const char *hdr_format_str (char *dest,
       optional = 0;
     break;
 
-#ifdef USE_NNTP
-  case 'g':
-    mutt_format_s (dest, destlen, prefix,
-                   hdr->env->newsgroups ? hdr->env->newsgroups : "");
-    break;
-#endif
-
   case 'H':
     /* (Hormel) spam score */
     if (optional)
@@ -438,7 +427,7 @@ static const char *hdr_format_str (char *dest,
       int j = 0;
 
       for (i = 0; hdr->env->from && hdr->env->from->personal &&
-           hdr->env->from->personal[i] && j < SHORT_STRING - 1; i++) {
+           hdr->env->from->personal[i] && j < STRING - 1; i++) {
         if (isalpha ((int) hdr->env->from->personal[i])) {
           if (!iflag) {
             buf2[j++] = hdr->env->from->personal[i];
@@ -501,7 +490,7 @@ static const char *hdr_format_str (char *dest,
   case 'O':
     if (!optional) {
       make_from_addr (hdr->env, buf2, sizeof (buf2), 1);
-      if (!option (OPTSAVEADDRESS) && (p = strpbrk (buf2, "%@")))
+      if ((p = strpbrk (buf2, "%@")))
         *p = 0;
       mutt_format_s (dest, destlen, prefix, buf2);
     }
@@ -579,11 +568,26 @@ static const char *hdr_format_str (char *dest,
     break;
 
   case 'T':
-    snprintf (fmt, sizeof (fmt), "%%%sc", prefix);
-    snprintf (dest, destlen, fmt,
-              (Tochars
-               && ((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':
@@ -650,18 +654,38 @@ static const char *hdr_format_str (char *dest,
     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 ? '!'
-                 : (Tochars && ((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;
 
@@ -702,18 +726,15 @@ static const char *hdr_format_str (char *dest,
     break;
 
   default:
-    snprintf (dest, destlen, "%%%s%c", prefix, op);
+    *dest = 0;
     break;
   }
 
-  if (optional)
-    mutt_FormatString (dest, destlen, ifstring, hdr_format_str,
-                       (unsigned long) hfi, flags);
-  else if (flags & M_FORMAT_OPTIONAL)
-    mutt_FormatString (dest, destlen, elsestring, hdr_format_str,
-                       (unsigned long) hfi, flags);
+  if (flags & M_FORMAT_OPTIONAL)
+    m_strformat(dest, destlen, 0, optional ? ifstr: elstr,
+                hdr_format_str, data, flags);
 
-  return (src);
+  return src;
 #undef THREAD_NEW
 #undef THREAD_OLD
 }
@@ -727,6 +748,5 @@ _mutt_make_string (char *dest, ssize_t destlen, const char *s, CONTEXT * ctx,
   hfi.hdr = hdr;
   hfi.ctx = ctx;
 
-  mutt_FormatString (dest, destlen, s, hdr_format_str, (unsigned long) &hfi,
-                     flags);
+  m_strformat(dest, destlen, getmaxx(main_w), s, hdr_format_str, &hfi, flags);
 }