]> granicus.if.org Git - mutt/commitdiff
Pass column value recursively when expanding format strings (bug #2840).
authorMichael Elkins <me@sigpipe.org>
Thu, 12 Apr 2007 05:36:24 +0000 (22:36 -0700)
committerMichael Elkins <me@sigpipe.org>
Thu, 12 Apr 2007 05:36:24 +0000 (22:36 -0700)
addrbook.c
browser.c
compose.c
hdrline.c
muttlib.c
pgpinvoke.c
pgpkey.c
protos.h
recvattach.c
smime.c
status.c

index f3f3dc9d0076352ac8d2f58fa75d9bc55e6f3c64..a719062a04f2aa6a45de33a39c495aab68970d4a 100644 (file)
@@ -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)
index c6fb21424f0fbd250826c552953ec4b2920a3063..df5c3322a189e6f3d9c30f02a557bbf878c5664e 100644 (file)
--- 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);
 }
 
index 001bdf44dc94bdfad6670ffce0cb65830e25a588..c8600b5c0ca28a2296a00e1a7531f37f502ea4ba 100644 (file)
--- 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);
index 2623ab10ff14551179e337017998e09ef699dfb3..43bb679ba3ce6962de8b52546f1446c54fd131a0 100644 (file)
--- 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);
 }
index 3793ba94b26c9b2444e0566737fd742ff85d7653..9167f7e53f3986c86c57a852fb7ae875b1cecdc4 100644 (file)
--- 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);
index fe0bc927916d15f6b069783a6a79fbb6f3127c57..e26c63bbe588f45bd59d1665f50105c650d52b30 100644 (file)
@@ -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));
 }
 
index e7f7717f58fa4157933546b3aa3b2f31e799379a..90e7c6e5c6741fadb7885cb407162e7993bd2011 100644 (file)
--- 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);
 }
 
index 20d313dd68d459c94c97e938091848fa11481ba2..c4d20a9416926826b182adcccef8a45c82894563 100644 (file)
--- 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,
index c3a12d6ae68f7d80ce76de2950e167c50388b70e..0722e838da72527d81140c92b5920ef71667e0ad 100644 (file)
@@ -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 b31b997f2393ad7b037deaa150632fc685a5ddaf..77f7fd824f3e613ac5df1d775e473164fb1e8855 100644 (file)
--- 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));
 }
index b54f2d8c1929958ea975e8c02f32f4b310e07a3a..53a5e507af5116d6f3099ce984ce33f1f1c29536 100644 (file)
--- 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);
 }