]> granicus.if.org Git - mutt/commitdiff
Fix #1558. (mutt_expand_fmt rewrite; OPT_MAX wasn't maximal.)
authorDan Nelson <dnelson@allantgroup.com>
Sat, 3 May 2003 20:07:40 +0000 (20:07 +0000)
committerDan Nelson <dnelson@allantgroup.com>
Sat, 3 May 2003 20:07:40 +0000 (20:07 +0000)
mutt.h
muttlib.c

diff --git a/mutt.h b/mutt.h
index 6494f39cbea0728a0973c563de2855ac7e54d9c3..8e1f2dd4db336698d8eb69fe49926c44f5ade82c 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -261,35 +261,34 @@ enum
 /* quad-option vars */
 enum
 {
-
-  OPT_VERIFYSIG,      /* verify PGP signatures */
-  OPT_PGPTRADITIONAL, /* create old-style PGP messages */
-
-#ifdef USE_SSL
-  OPT_SSLSTARTTLS,
-#endif
-
-  OPT_PRINT,
-  OPT_INCLUDE,
+  OPT_ABORT,
+  OPT_BOUNCE,
+  OPT_COPY,
   OPT_DELETE,
+  OPT_FORWEDIT,
+  OPT_INCLUDE,
   OPT_MFUPTO,
   OPT_MIMEFWD,
+  OPT_MIMEFWDREST,
   OPT_MOVE,
-  OPT_COPY,
+  OPT_PGPTRADITIONAL, /* create old-style PGP messages */
 #ifdef USE_POP
   OPT_POPDELETE,
   OPT_POPRECONNECT,
 #endif
   OPT_POSTPONE,
+  OPT_PRINT,
   OPT_QUIT,
   OPT_REPLYTO,
-  OPT_ABORT,
   OPT_RECALL,
+#ifdef USE_SSL
+  OPT_SSLSTARTTLS,
+#endif
   OPT_SUBJECT,
-  OPT_MIMEFWDREST,
-  OPT_FORWEDIT,
-  OPT_MAX,
-  OPT_BOUNCE
+  OPT_VERIFYSIG,      /* verify PGP signatures */
+    
+  /* THIS MUST BE THE LAST VALUE. */
+  OPT_MAX
 };
 
 /* flags to ci_send_message() */
index fd2e8f00f672b6cf1ad3dfbe9a638e93ccb74f8d..1e902dec2475526346f926ff28ee87b75e17faf0 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -766,59 +766,51 @@ void mutt_expand_file_fmt (char *dest, size_t destlen, const char *fmt, const ch
 
 void mutt_expand_fmt (char *dest, size_t destlen, const char *fmt, const char *src)
 {
-  const char *p = fmt;
-  const char *last = p;
-  size_t len;
+  const char *p;
+  char *d;
   size_t slen;
   int found = 0;
 
   slen = mutt_strlen (src);
+  destlen--;
   
-  while ((p = strchr (p, '%')) != NULL)
+  for (p = fmt, d = dest; destlen && *p; p++)
   {
-    if (p[1] == 's')
+    if (*p == '%') 
     {
-      found++;
-
-      len = (size_t) (p - last);
-      if (len)
+      switch (p[1])
       {
-       if (len > destlen - 1)
-         len = destlen - 1;
-
-       memcpy (dest, last, len);
-       dest += len;
-       destlen -= len;
-
-       if (destlen <= 0)
-       {
-         *dest = 0;
-         break; /* no more space */
-       }
-      }
-
-      strfcpy (dest, src, destlen);
-      if (slen > destlen)
-      {
-       /* no more room */
-       break;
+       case '%':
+         *d++ = *p++;
+         destlen--;
+         break;
+       case 's':
+         found = 1;
+         strfcpy (d, src, destlen + 1);
+         d       += destlen > slen ? slen : destlen;
+         destlen -= destlen > slen ? slen : destlen;
+         p++;
+         break;
+       default:
+         *d++ = *p; 
+         destlen--;
+         break;
       }
-      dest += slen;
-      destlen -= slen;
-
-      p += 2;
-      last = p;
     }
-    else if (p[1] == '%')
-      p++;
-
-    p++;
+    else
+    {
+      *d++ = *p;
+      destlen--;
+    }
+  }
+  
+  *d = '\0';
+  
+  if (!found && destlen > 0)
+  {
+    strncat (dest, " ", destlen);
+    strncat (dest, src, destlen-1);
   }
-
-  if (found)
-    strfcpy (dest, last, destlen);
-  else
-    snprintf (dest, destlen, "%s %s", fmt, src);
   
 }