From: Michael Elkins Date: Thu, 12 Apr 2007 05:36:24 +0000 (-0700) Subject: Pass column value recursively when expanding format strings (bug #2840). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=72f0d347180d284a38149dc259ad981849a9f23d;p=neomutt Pass column value recursively when expanding format strings (bug #2840). --- diff --git a/addrbook.c b/addrbook.c index f3f3dc9d0..a719062a0 100644 --- a/addrbook.c +++ b/addrbook.c @@ -43,7 +43,7 @@ static struct mapping_t AliasHelp[] = { }; static const char * -alias_format_str (char *dest, size_t destlen, char op, const char *src, +alias_format_str (char *dest, size_t destlen, size_t col, char op, const char *src, const char *fmt, const char *ifstring, const char *elsestring, unsigned long data, format_flag flags) { @@ -80,7 +80,7 @@ alias_format_str (char *dest, size_t destlen, char op, const char *src, static void alias_entry (char *s, size_t slen, MUTTMENU *m, int num) { - mutt_FormatString (s, slen, NONULL (AliasFmt), alias_format_str, (unsigned long) ((ALIAS **) m->data)[num], M_FORMAT_ARROWCURSOR); + mutt_FormatString (s, slen, 0, NONULL (AliasFmt), alias_format_str, (unsigned long) ((ALIAS **) m->data)[num], M_FORMAT_ARROWCURSOR); } static int alias_tag (MUTTMENU *menu, int n, int m) diff --git a/browser.c b/browser.c index c6fb21424..df5c3322a 100644 --- a/browser.c +++ b/browser.c @@ -141,7 +141,7 @@ static int link_is_dir (const char *folder, const char *path) } static const char * -folder_format_str (char *dest, size_t destlen, char op, const char *src, +folder_format_str (char *dest, size_t destlen, size_t col, char op, const char *src, const char *fmt, const char *ifstring, const char *elsestring, unsigned long data, format_flag flags) { @@ -300,9 +300,9 @@ folder_format_str (char *dest, size_t destlen, char op, const char *src, } if (optional) - mutt_FormatString (dest, destlen, ifstring, folder_format_str, data, 0); + mutt_FormatString (dest, destlen, col, ifstring, folder_format_str, data, 0); else if (flags & M_FORMAT_OPTIONAL) - mutt_FormatString (dest, destlen, elsestring, folder_format_str, data, 0); + mutt_FormatString (dest, destlen, col, elsestring, folder_format_str, data, 0); return (src); } @@ -483,7 +483,7 @@ static void folder_entry (char *s, size_t slen, MUTTMENU *menu, int num) folder.ff = &((struct folder_file *) menu->data)[num]; folder.num = num; - mutt_FormatString (s, slen, NONULL(FolderFormat), folder_format_str, + mutt_FormatString (s, slen, 0, NONULL(FolderFormat), folder_format_str, (unsigned long) &folder, M_FORMAT_ARROWCURSOR); } diff --git a/compose.c b/compose.c index 001bdf44d..c8600b5c0 100644 --- a/compose.c +++ b/compose.c @@ -99,7 +99,7 @@ static struct mapping_t ComposeHelp[] = { static void snd_entry (char *b, size_t blen, MUTTMENU *menu, int num) { - mutt_FormatString (b, blen, NONULL (AttachFormat), mutt_attach_fmt, + mutt_FormatString (b, blen, 0, NONULL (AttachFormat), mutt_attach_fmt, (unsigned long)(((ATTACHPTR **) menu->data)[num]), M_FORMAT_STAT_FILE | M_FORMAT_ARROWCURSOR); } @@ -406,7 +406,7 @@ static unsigned long cum_attachs_size (MUTTMENU *menu) } /* prototype for use below */ -static void compose_status_line (char *buf, size_t buflen, MUTTMENU *menu, +static void compose_status_line (char *buf, size_t buflen, size_t col, MUTTMENU *menu, const char *p); /* @@ -422,7 +422,7 @@ static void compose_status_line (char *buf, size_t buflen, MUTTMENU *menu, */ static const char * -compose_format_str (char *buf, size_t buflen, char op, const char *src, +compose_format_str (char *buf, size_t buflen, size_t col, char op, const char *src, const char *prefix, const char *ifstring, const char *elsestring, unsigned long data, format_flag flags) @@ -465,17 +465,17 @@ compose_format_str (char *buf, size_t buflen, char op, const char *src, } if (optional) - compose_status_line (buf, buflen, menu, ifstring); + compose_status_line (buf, buflen, col, menu, ifstring); else if (flags & M_FORMAT_OPTIONAL) - compose_status_line (buf, buflen, menu, elsestring); + compose_status_line (buf, buflen, col, menu, elsestring); return (src); } -static void compose_status_line (char *buf, size_t buflen, MUTTMENU *menu, +static void compose_status_line (char *buf, size_t buflen, size_t col, MUTTMENU *menu, const char *p) { - mutt_FormatString (buf, buflen, p, compose_format_str, + mutt_FormatString (buf, buflen, col, p, compose_format_str, (unsigned long) menu, 0); } @@ -1275,7 +1275,7 @@ int mutt_compose_menu (HEADER *msg, /* structure for new message */ /* Draw formated compose status line */ if (menu->redraw & REDRAW_STATUS) { - compose_status_line (buf, sizeof (buf), menu, NONULL(ComposeFormat)); + compose_status_line (buf, sizeof (buf), 0, menu, NONULL(ComposeFormat)); CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2); SETCOLOR (MT_COLOR_STATUS); printw ("%-*.*s", COLS, COLS, buf); diff --git a/hdrline.c b/hdrline.c index 2623ab10f..43bb679ba 100644 --- a/hdrline.c +++ b/hdrline.c @@ -236,6 +236,7 @@ struct hdr_format_info static const char * hdr_format_str (char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, @@ -715,9 +716,9 @@ hdr_format_str (char *dest, } if (optional) - mutt_FormatString (dest, destlen, ifstring, hdr_format_str, (unsigned long) hfi, flags); + mutt_FormatString (dest, destlen, col, 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); + mutt_FormatString (dest, destlen, col, elsestring, hdr_format_str, (unsigned long) hfi, flags); return (src); #undef THREAD_NEW @@ -732,5 +733,5 @@ _mutt_make_string (char *dest, size_t destlen, const char *s, CONTEXT *ctx, HEAD hfi.hdr = hdr; hfi.ctx = ctx; - mutt_FormatString (dest, destlen, s, hdr_format_str, (unsigned long) &hfi, flags); + mutt_FormatString (dest, destlen, 0, s, hdr_format_str, (unsigned long) &hfi, flags); } diff --git a/muttlib.c b/muttlib.c index 3793ba94b..9167f7e53 100644 --- a/muttlib.c +++ b/muttlib.c @@ -991,6 +991,7 @@ void mutt_safe_path (char *s, size_t l, ADDRESS *a) void mutt_FormatString (char *dest, /* output buffer */ size_t destlen, /* output buffer len */ + size_t col, /* starting column (nonzero when called recursively) */ const char *src, /* template string */ format_t *callback, /* callback for processing */ unsigned long data, /* callback data */ @@ -998,7 +999,7 @@ void mutt_FormatString (char *dest, /* output buffer */ { char prefix[SHORT_STRING], buf[LONG_STRING], *cp, *wptr = dest, ch; char ifstring[SHORT_STRING], elsestring[SHORT_STRING]; - size_t wlen, count, len, col, wid; + size_t wlen, count, len, wid; pid_t pid; FILE *filter; int n; @@ -1007,7 +1008,7 @@ void mutt_FormatString (char *dest, /* output buffer */ prefix[0] = '\0'; destlen--; /* save room for the terminal \0 */ wlen = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0; - col = wlen; + col += wlen; if ((flags & M_FORMAT_NOFILTER) == 0) { @@ -1055,7 +1056,7 @@ void mutt_FormatString (char *dest, /* output buffer */ mutt_extract_token(word, srcbuf, 0); dprint(3, (debugfile, "fmtpipe %2d: %s\n", i++, word->data)); mutt_buffer_addch(command, '\''); - mutt_FormatString(buf, sizeof(buf), word->data, callback, data, + mutt_FormatString(buf, sizeof(buf), 0, word->data, callback, data, flags | M_FORMAT_NOFILTER); for (p = buf; p && *p; p++) { @@ -1074,6 +1075,7 @@ void mutt_FormatString (char *dest, /* output buffer */ dprint(3, (debugfile, "fmtpipe > %s\n", command->data)); + col -= wlen; /* reset to passed in value */ wptr = dest; /* reset write ptr */ wlen = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0; if ((pid = mutt_create_filter(command->data, NULL, &filter, NULL))) @@ -1100,7 +1102,7 @@ void mutt_FormatString (char *dest, /* output buffer */ recycler = safe_strdup(dest); if (recycler) { - mutt_FormatString(dest, destlen++, recycler, callback, data, flags); + mutt_FormatString(dest, destlen++, col, recycler, callback, data, flags); FREE(&recycler); } } @@ -1203,7 +1205,7 @@ void mutt_FormatString (char *dest, /* output buffer */ if (count > col) { count -= col; /* how many columns left on this line */ - mutt_FormatString (buf, sizeof (buf), src, callback, data, flags); + mutt_FormatString (buf, sizeof (buf), 0, src, callback, data, flags); len = mutt_strlen (buf); wid = mutt_strwidth (buf); if (count > wid) @@ -1253,7 +1255,7 @@ void mutt_FormatString (char *dest, /* output buffer */ } /* use callback function to handle this case */ - src = callback (buf, sizeof (buf), ch, src, prefix, ifstring, elsestring, data, flags); + src = callback (buf, sizeof (buf), col, ch, src, prefix, ifstring, elsestring, data, flags); if (tolower) mutt_strlower (buf); diff --git a/pgpinvoke.c b/pgpinvoke.c index fe0bc9279..e26c63bbe 100644 --- a/pgpinvoke.c +++ b/pgpinvoke.c @@ -58,6 +58,7 @@ struct pgp_command_context { const char *_mutt_fmt_pgp_command (char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, @@ -139,16 +140,16 @@ const char *_mutt_fmt_pgp_command (char *dest, } if (optional) - mutt_FormatString (dest, destlen, ifstring, _mutt_fmt_pgp_command, data, 0); + mutt_FormatString (dest, destlen, col, ifstring, _mutt_fmt_pgp_command, data, 0); else if (flags & M_FORMAT_OPTIONAL) - mutt_FormatString (dest, destlen, elsestring, _mutt_fmt_pgp_command, data, 0); + mutt_FormatString (dest, destlen, col, elsestring, _mutt_fmt_pgp_command, data, 0); return (src); } void mutt_pgp_command (char *d, size_t dlen, struct pgp_command_context *cctx, const char *fmt) { - mutt_FormatString (d, dlen, NONULL (fmt), _mutt_fmt_pgp_command, (unsigned long) cctx, 0); + mutt_FormatString (d, dlen, 0, NONULL (fmt), _mutt_fmt_pgp_command, (unsigned long) cctx, 0); dprint (2, (debugfile, "mutt_pgp_command: %s\n", d)); } diff --git a/pgpkey.c b/pgpkey.c index e7f7717f5..90e7c6e5c 100644 --- a/pgpkey.c +++ b/pgpkey.c @@ -121,6 +121,7 @@ typedef struct pgp_entry static const char *pgp_entry_fmt (char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, @@ -277,9 +278,9 @@ static const char *pgp_entry_fmt (char *dest, } if (optional) - mutt_FormatString (dest, destlen, ifstring, mutt_attach_fmt, data, 0); + mutt_FormatString (dest, destlen, col, ifstring, mutt_attach_fmt, data, 0); else if (flags & M_FORMAT_OPTIONAL) - mutt_FormatString (dest, destlen, elsestring, mutt_attach_fmt, data, 0); + mutt_FormatString (dest, destlen, col, elsestring, mutt_attach_fmt, data, 0); return (src); } @@ -291,7 +292,7 @@ static void pgp_entry (char *s, size_t l, MUTTMENU * menu, int num) entry.uid = KeyTable[num]; entry.num = num + 1; - mutt_FormatString (s, l, NONULL (PgpEntryFormat), pgp_entry_fmt, + mutt_FormatString (s, l, 0, NONULL (PgpEntryFormat), pgp_entry_fmt, (unsigned long) &entry, M_FORMAT_ARROWCURSOR); } diff --git a/protos.h b/protos.h index 20d313dd6..c4d20a941 100644 --- a/protos.h +++ b/protos.h @@ -61,9 +61,9 @@ int _mutt_traverse_thread (CONTEXT *ctx, HEADER *hdr, int flag); #define mutt_new_envelope() safe_calloc (1, sizeof (ENVELOPE)) #define mutt_new_enter_state() safe_calloc (1, sizeof (ENTER_STATE)) -typedef const char * format_t (char *, size_t, char, const char *, const char *, const char *, const char *, unsigned long, format_flag); +typedef const char * format_t (char *, size_t, size_t, char, const char *, const char *, const char *, const char *, unsigned long, format_flag); -void mutt_FormatString (char *, size_t, const char *, format_t *, unsigned long, format_flag); +void mutt_FormatString (char *, size_t, size_t, const char *, format_t *, unsigned long, format_flag); void mutt_parse_content_type (char *, BODY *); void mutt_generate_boundary (PARAMETER **); void mutt_group_add_adrlist (group_t *, ADDRESS *); @@ -119,6 +119,7 @@ int is_from (const char *, char *, size_t, time_t *); const char *mutt_attach_fmt ( char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, diff --git a/recvattach.c b/recvattach.c index c3a12d6ae..0722e838d 100644 --- a/recvattach.c +++ b/recvattach.c @@ -173,6 +173,7 @@ ATTACHPTR **mutt_gen_attach_list (BODY *m, */ const char *mutt_attach_fmt (char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, @@ -356,15 +357,15 @@ const char *mutt_attach_fmt (char *dest, } if (optional) - mutt_FormatString (dest, destlen, ifstring, mutt_attach_fmt, data, 0); + mutt_FormatString (dest, destlen, col, ifstring, mutt_attach_fmt, data, 0); else if (flags & M_FORMAT_OPTIONAL) - mutt_FormatString (dest, destlen, elsestring, mutt_attach_fmt, data, 0); + mutt_FormatString (dest, destlen, col, elsestring, mutt_attach_fmt, data, 0); return (src); } void attach_entry (char *b, size_t blen, MUTTMENU *menu, int num) { - mutt_FormatString (b, blen, NONULL (AttachFormat), mutt_attach_fmt, (unsigned long) (((ATTACHPTR **)menu->data)[num]), M_FORMAT_ARROWCURSOR); + mutt_FormatString (b, blen, 0, NONULL (AttachFormat), mutt_attach_fmt, (unsigned long) (((ATTACHPTR **)menu->data)[num]), M_FORMAT_ARROWCURSOR); } int mutt_tag_attach (MUTTMENU *menu, int n, int m) diff --git a/smime.c b/smime.c index b31b997f2..77f7fd824 100644 --- a/smime.c +++ b/smime.c @@ -128,6 +128,7 @@ int smime_valid_passphrase (void) static const char *_mutt_fmt_smime_command (char *dest, size_t destlen, + size_t col, char op, const char *src, const char *prefix, @@ -242,10 +243,10 @@ static const char *_mutt_fmt_smime_command (char *dest, } if (optional) - mutt_FormatString (dest, destlen, ifstring, _mutt_fmt_smime_command, + mutt_FormatString (dest, destlen, col, ifstring, _mutt_fmt_smime_command, data, 0); else if (flags & M_FORMAT_OPTIONAL) - mutt_FormatString (dest, destlen, elsestring, _mutt_fmt_smime_command, + mutt_FormatString (dest, destlen, col, elsestring, _mutt_fmt_smime_command, data, 0); return (src); @@ -256,7 +257,7 @@ static const char *_mutt_fmt_smime_command (char *dest, static void mutt_smime_command (char *d, size_t dlen, struct smime_command_context *cctx, const char *fmt) { - mutt_FormatString (d, dlen, NONULL(fmt), _mutt_fmt_smime_command, + mutt_FormatString (d, dlen, 0, NONULL(fmt), _mutt_fmt_smime_command, (unsigned long) cctx, 0); dprint (2,(debugfile, "mutt_smime_command: %s\n", d)); } diff --git a/status.c b/status.c index b54f2d8c1..53a5e507a 100644 --- a/status.c +++ b/status.c @@ -40,6 +40,8 @@ static char *get_sort_str (char *buf, size_t buflen, int method) return buf; } +static void _menu_status_line (char *buf, size_t buflen, size_t col, MUTTMENU *menu, const char *p); + /* %b = number of incoming folders with unread messages [option] * %d = number of deleted messages [option] * %f = full mailbox path @@ -58,7 +60,7 @@ static char *get_sort_str (char *buf, size_t buflen, int method) * %v = Mutt version * %V = currently active limit pattern [option] */ static const char * -status_format_str (char *buf, size_t buflen, char op, const char *src, +status_format_str (char *buf, size_t buflen, size_t col, char op, const char *src, const char *prefix, const char *ifstring, const char *elsestring, unsigned long data, format_flag flags) @@ -286,14 +288,19 @@ status_format_str (char *buf, size_t buflen, char op, const char *src, } if (optional) - menu_status_line (buf, buflen, menu, ifstring); + _menu_status_line (buf, buflen, col, menu, ifstring); else if (flags & M_FORMAT_OPTIONAL) - menu_status_line (buf, buflen, menu, elsestring); + _menu_status_line (buf, buflen, col, menu, elsestring); return (src); } +static void _menu_status_line (char *buf, size_t buflen, size_t col, MUTTMENU *menu, const char *p) +{ + mutt_FormatString (buf, buflen, col, p, status_format_str, (unsigned long) menu, 0); +} + void menu_status_line (char *buf, size_t buflen, MUTTMENU *menu, const char *p) { - mutt_FormatString (buf, buflen, p, status_format_str, (unsigned long) menu, 0); + mutt_FormatString (buf, buflen, 0, p, status_format_str, (unsigned long) menu, 0); }