X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=init.c;h=e4eb8018749f2376aed5638fa9ec059ef01c42f3;hp=40a488a5e4a64a22e89da5ea4d7b06fe7dde6e33;hb=d3c39b017ce3de4a07c34a1d7017495ea1b7ed4b;hpb=355d6c883e8aafb8f424c22aa576cf8262ed9e58 diff --git a/init.c b/init.c index 40a488a..e4eb801 100644 --- a/init.c +++ b/init.c @@ -200,7 +200,7 @@ static int bool_from_string (struct option_t* dst, const char* val, set_option (dst->data); else unset_option (dst->data); - return (0); + return (1); } static void num_to_string (char* dst, size_t dstlen, @@ -442,9 +442,10 @@ static int rx_from_string (struct option_t* dst, const char* val, regerror (e, rx, errbuf, errlen); regfree (rx); mem_free (&rx); + return (0); } - if (p->pattern) { + if (p->rx) { regfree (p->rx); mem_free (&p->rx); } @@ -505,10 +506,11 @@ static void addr_to_string (char* dst, size_t dstlen, static int addr_from_string (struct option_t* dst, const char* val, char* errbuf, size_t errlen) { - if (!dst || !val || !*val) + if (!dst) return (0); rfc822_free_address ((ADDRESS**) dst->data); - *((ADDRESS**) dst->data) = rfc822_parse_adrlist (NULL, val); + if (val && *val) + *((ADDRESS**) dst->data) = rfc822_parse_adrlist (NULL, val); return (1); } @@ -1366,11 +1368,45 @@ static void del_option (void* p) { mem_free (&ptr); } +static int init_expand (char** dst, struct option_t* src) { + BUFFER token, in; + size_t len = 0; + + mem_free (dst); + + if (DTYPE(src->type) == DT_STR || + DTYPE(src->type) == DT_PATH) { + /* only expand for string as it's the only place where + * we want to expand vars right now */ + if (src->init && *src->init) { + memset (&token, 0, sizeof (BUFFER)); + memset (&in, 0, sizeof (BUFFER)); + len = str_len (src->init) + 2; + in.data = mem_malloc (len+1); + snprintf (in.data, len, "\"%s\"", src->init); + in.dptr = in.data; + in.dsize = len; + mutt_extract_token (&token, &in, 0); + if (token.data && *token.data) + *dst = str_dup (token.data); + else + *dst = str_dup (""); + mem_free (&in.data); + mem_free (&token.data); + } else + *dst = str_dup (""); + } else + /* for non-string: take value as is */ + *dst = str_dup (src->init); + return (1); +} + /* if additional data more == 1, we want to resolve synonyms */ static void mutt_restore_default (const char* name, void* p, unsigned long more) { char errbuf[STRING]; struct option_t* ptr = (struct option_t*) p; + char* init = NULL; if (DTYPE (ptr->type) == DT_SYN) { if (!more) @@ -1379,13 +1415,18 @@ static void mutt_restore_default (const char* name, void* p, } if (!ptr) return; - if (FuncTable[DTYPE (ptr->type)].opt_from_string && - FuncTable[DTYPE (ptr->type)].opt_from_string (ptr, ptr->init, errbuf, - sizeof (errbuf)) < 0) { - mutt_endwin (NULL); - fprintf (stderr, _("Invalid default setting found. Please report this " - "error:\n\"%s\"\n"), errbuf); - exit (1); + if (FuncTable[DTYPE (ptr->type)].opt_from_string) { + init_expand (&init, ptr); + if (!FuncTable[DTYPE (ptr->type)].opt_from_string (ptr, init, errbuf, + sizeof (errbuf))) { + if (!option (OPTNOCURSES)) + mutt_endwin (NULL); + fprintf (stderr, _("Invalid default setting for $%s found: \"%s\".\n" + "Please report this error: \"%s\"\n"), + ptr->option, NONULL (init), errbuf); + exit (1); + } + mem_free (&init); } if (ptr->flags & R_INDEX)