X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-ui%2Fhdrline.c;h=5bbff4a2dcbe7c82e76df5600fa1cec64ee9112d;hp=1b3f10a7b461dd44a5d18dcf3783031ca3462dbd;hb=16be8d10413bbcf822577afd4019d65aba7459e0;hpb=98cf5779d8184a74541be1bc61d15c5f35efd310 diff --git a/lib-ui/hdrline.c b/lib-ui/hdrline.c index 1b3f10a..5bbff4a 100644 --- a/lib-ui/hdrline.c +++ b/lib-ui/hdrline.c @@ -7,20 +7,18 @@ * please see the file GPL in the top level source directory. */ -#include +#include #include - -#include +#include #include "mutt.h" #include "alias.h" +#include "crypt.h" #include "sort.h" #include "thread.h" #include "charset.h" -#include #include "mutt_idna.h" -#include "mx.h" int mutt_is_mail_list (address_t * addr) { @@ -211,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); @@ -396,7 +391,7 @@ static const char *hdr_format_str (char *dest, case 'f': buf2[0] = 0; - rfc822_write_address (buf2, sizeof (buf2), hdr->env->from, 1); + rfc822_addrcat(buf2, sizeof (buf2), hdr->env->from, 1); mutt_format_s (dest, destlen, prefix, buf2); break; @@ -409,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) @@ -439,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]; @@ -502,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); } @@ -580,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': @@ -629,12 +632,6 @@ static const char *hdr_format_str (char *dest, { int count = 0; - if (option (OPTCOUNTATTACH)) { - if (!hdr->content->parts) - mutt_parse_mime_message(ctx, hdr); - count = mutt_count_body_parts(hdr, 0); - } - /* The recursion allows messages without depth to return 0. */ if (optional) optional = count != 0; @@ -657,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; @@ -709,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 } @@ -734,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); }