+ const char* fmt = (m_strcmp(option->option, "umask") == 0) ?
+ "%s=%04o" : "%s=%d";
+ snprintf (dst, dstlen, fmt, option->option,
+ *((short*) option->data));
+}
+
+static int num_from_string (struct option_t* dst, const char* val,
+ char* errbuf, ssize_t errlen) {
+ int num = 0, old = 0;
+ char* t = NULL;
+
+ if (!dst)
+ return (0);
+
+ num = strtol (val, &t, 0);
+
+ if (m_strisempty(val) || *t || (short) num != num) {
+ if (errbuf) {
+ snprintf (errbuf, errlen, _("'%s' is invalid for $%s"),
+ val, dst->option);
+ }
+ return (0);
+ }
+
+ /* just temporarily accept new val so that check_special for
+ * $history already has it when doing history's init() */
+ old = *((short*) dst->data);
+ *((short*) dst->data) = (short) num;
+
+ if (!check_special (dst->option, (unsigned long) num, errbuf, errlen)) {
+ *((short*) dst->data) = old;
+ return (0);
+ }
+
+ return (1);
+}
+
+static void str_to_string (char* dst, ssize_t dstlen,
+ struct option_t* option) {
+ snprintf (dst, dstlen, "%s=\"%s\"", option->option,
+ NONULL (*((char**) option->data)));
+}
+
+static int path_from_string (struct option_t* dst, const char* val,
+ char* errbuf __attribute__ ((unused)), ssize_t errlen __attribute__ ((unused))) {
+ char path[_POSIX_PATH_MAX];
+
+ if (!dst)
+ return (0);
+
+ if (m_strisempty(val)) {
+ p_delete((char**) dst->data);
+ return (1);
+ }
+
+ path[0] = '\0';
+ m_strcpy(path, sizeof(path), val);
+ mutt_expand_path (path, sizeof(path));
+ m_strreplace((char **) dst->data, path);
+ return (1);
+}
+
+static int str_from_string (struct option_t* dst, const char* val,
+ char* errbuf, ssize_t errlen) {
+ if (!dst)
+ return (0);
+
+ if (!check_special (dst->option, (unsigned long) val, errbuf, errlen))
+ return (0);
+
+ m_strreplace((char**) dst->data, val);
+ return (1);