]> granicus.if.org Git - neomutt/commitdiff
Fix value completion for DT_ADDR variables. While we are on it,
authorThomas Roessler <roessler@does-not-exist.org>
Tue, 20 Jul 1999 10:11:48 +0000 (10:11 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Tue, 20 Jul 1999 10:11:48 +0000 (10:11 +0000)
proper quoting is added.

init.c

diff --git a/init.c b/init.c
index 84aa95aafe68d2de8d269a96ee1f06f3a61549b7..643d978b7aea75737081fe6a379ba384c84f2cb8 100644 (file)
--- a/init.c
+++ b/init.c
@@ -826,9 +826,21 @@ static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
     {
       if (query || *s->dptr != '=')
       {
+       char _tmp[STRING];
+       char *val = NULL;
+       
+       if (DTYPE (MuttVars[idx].type) == DT_ADDR)
+       {
+         _tmp[0] = '\0';
+         rfc822_write_address (_tmp, sizeof (_tmp), *((ADDRESS **) MuttVars[idx].data));
+         val = _tmp;
+       }
+       else
+         val = *((char **) MuttVars[idx].data);
+       
        /* user requested the value of this variable */
        snprintf (err->data, err->dsize, "%s=\"%s\"", MuttVars[idx].option,
-                 NONULL (*((char **) MuttVars[idx].data)));
+                 NONULL (val));
        break;
       }
 
@@ -1448,25 +1460,29 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
       return 0; /* no such variable. */
     else
     {
-      char tmp [LONG_STRING];
+      char tmp [LONG_STRING], tmp2[LONG_STRING];
+      char *s, *d;
       size_t dlen = buffer + len - pt - spaces;
       char *vals[] = { "no", "yes", "ask-no", "ask-yes" };
-      strfcpy (tmp, pt, sizeof(tmp));
-      
+
+      tmp[0] = '\0';
+
       if ((DTYPE(MuttVars[idx].type) == DT_STR) || 
          (DTYPE(MuttVars[idx].type) == DT_PATH) ||
          (DTYPE(MuttVars[idx].type) == DT_RX))
-       snprintf(pt, dlen, "%s\"%s\"", tmp, 
-                 NONULL (*((char **) MuttVars[idx].data)));
+      {
+       strfcpy (tmp, NONULL (*((char **) MuttVars[idx].data)), sizeof (tmp));
+       if (DTYPE (MuttVars[idx].type) == DT_PATH)
+         mutt_pretty_mailbox (tmp);
+      }
       else if (DTYPE (MuttVars[idx].type) == DT_ADDR)
       {
-       *pt = '\0';
-       rfc822_write_address (pt, dlen, *((ADDRESS **) MuttVars[idx].data));
+       rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) MuttVars[idx].data));
       }
       else if (DTYPE (MuttVars[idx].type) == DT_QUAD)
-       snprintf(pt, dlen, "%s%s", tmp,  vals[quadoption (MuttVars[idx].data)]);
+       strfcpy (tmp, vals[quadoption (MuttVars[idx].data)], sizeof (tmp));
       else if (DTYPE (MuttVars[idx].type) == DT_NUM)
-       snprintf (pt, dlen, "%s%d", tmp, (*((short *) MuttVars[idx].data)));
+       snprintf (tmp, sizeof (tmp), "%d", (*((short *) MuttVars[idx].data)));
       else if (DTYPE (MuttVars[idx].type) == DT_SORT)
       {
        const struct mapping_t *map;
@@ -1490,16 +1506,27 @@ int mutt_var_value_complete (char *buffer, size_t len, int pos)
            break;
        }
        p = mutt_getnamebyvalue (*((short *) MuttVars[idx].data) & SORT_MASK, map);
-       snprintf (pt, dlen, "%s\"%s%s%s\"", tmp,
+       snprintf (tmp, sizeof (tmp), "%s%s%s",
                  (*((short *) MuttVars[idx].data) & SORT_REVERSE) ? "reverse-" : "",
                  (*((short *) MuttVars[idx].data) & SORT_LAST) ? "last-" : "",
                  p);
       }
       else if (DTYPE (MuttVars[idx].type) == DT_BOOL)
-       snprintf (pt, dlen, "%s%s", tmp, 
-                 option (MuttVars[idx].data) ? "yes" : "no");
+       strfcpy (tmp, option (MuttVars[idx].data) ? "yes" : "no", sizeof (tmp));
       else
        return 0;
+      
+      for (s = tmp, d = tmp2; *s && (d - tmp2) < sizeof (tmp2) - 2;)
+      {
+       if (*s == '\\' || *s == '"')
+         *d++ = '\\';
+       *d++ = *s++;
+      }
+      *d = '\0';
+      
+      strfcpy (tmp, pt, sizeof (tmp));
+      snprintf (pt, dlen, "%s\"%s\"", tmp, tmp2);
+         
       return 1;
     }
   }