X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=init.c;h=1d6c93356760fc8a6f9c417b3647afd51e0875ad;hb=2f2c527885bb77e4ba1e90f02812f3ee47985afa;hp=93c8fbc308fb355db0398539f55cde2903cc3536;hpb=452ffdd4bbcd8f2dd9e4811c115824b556814ebb;p=apps%2Fmadmutt.git diff --git a/init.c b/init.c index 93c8fbc..1d6c933 100644 --- a/init.c +++ b/init.c @@ -257,7 +257,29 @@ static void user_to_string (char* dst, size_t dstlen, static void sys_to_string (char* dst, size_t dstlen, struct option_t* option) { - snprintf (dst, dstlen, "%s=\"%s\"", option->option, option->init); + char* val = NULL, *t = NULL; + int clean = 0; + + /* get some $muttng_ values dynamically */ + if (ascii_strcmp ("muttng_pwd", option->option) == 0) { + val = mem_malloc (_POSIX_PATH_MAX); + val = getcwd (val, _POSIX_PATH_MAX-1); + clean = 1; + } else if (ascii_strcmp ("muttng_folder_path", option->option) == 0 && + CurrentFolder && *CurrentFolder) { + val = CurrentFolder; + } else if (ascii_strcmp ("muttng_folder_name", option->option) == 0 && + CurrentFolder && *CurrentFolder) { + if ((t = strrchr (CurrentFolder, '/')) != NULL) + val = t+1; + else + val = CurrentFolder; + } else + val = option->init; + + snprintf (dst, dstlen, "%s=\"%s\"", option->option, NONULL (val)); + if (clean) + mem_free (&val); } static int path_from_string (struct option_t* dst, const char* val, @@ -420,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->pattern && p->rx) { regfree (p->rx); mem_free (&p->rx); } @@ -791,7 +814,7 @@ static int parse_ifdef (BUFFER * tmp, BUFFER * s, unsigned long data, mutt_extract_token (tmp, s, 0); /* is the item defined as a variable or a function? */ - if ((option = hash_find (ConfigOptions, tmp->data))) + if ((option = hash_find (ConfigOptions, tmp->data)) != NULL) res = 1; else { for (i = 0; !res && i < MENU_MAX; i++) { @@ -809,23 +832,16 @@ static int parse_ifdef (BUFFER * tmp, BUFFER * s, unsigned long data, } } /* check for feature_* */ - if (!res) { - char *p = NULL; - + if (!res && ascii_strncasecmp (tmp->data, "feature_", 8) == 0 && + (j = str_len (tmp->data)) > 8) { i = 0; - j = str_len (tmp->data); - /* need at least input of 'feature_X' */ - if (j >= 7) { - p = tmp->data + 7; - j -= 7; - while (Features[i].name) { - if (str_len (Features[i].name) == j && - ascii_strncasecmp (Features[i].name, p, j)) { - res = 1; - break; - } - i++; + while (Features[i]) { + if (str_len (Features[i]) == j-8 && + ascii_strncasecmp (Features[i], tmp->data+8, j-8) == 0) { + res = 1; + break; } + i++; } } @@ -836,9 +852,10 @@ static int parse_ifdef (BUFFER * tmp, BUFFER * s, unsigned long data, snprintf (err->data, err->dsize, _("ifndef: too few arguments")); return (-1); } + mutt_extract_token (tmp, s, M_TOKEN_SPACE); - if ((data && res) || (!data && !res)) { + if (data == res) { if (mutt_parse_rc_line (tmp->data, &token, err) == -1) { mutt_error ("Error: %s", err->data); mem_free (&token.data); @@ -1350,11 +1367,38 @@ static void del_option (void* p) { mem_free (&ptr); } +static int init_expand (char** dst, const char* src) { + BUFFER token, in; + size_t len = 0; + + mem_free (dst); + + if (src && *src) { + memset (&token, 0, sizeof (BUFFER)); + memset (&in, 0, sizeof (BUFFER)); + len = str_len (src) + 2; + in.data = mem_malloc (len+1); + snprintf (in.data, len, "\"%s\"", src); + 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 (""); + 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) @@ -1363,13 +1407,16 @@ 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, + if (FuncTable[DTYPE (ptr->type)].opt_from_string) { + init_expand (&init, ptr->init); + if (FuncTable[DTYPE (ptr->type)].opt_from_string (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); + mutt_endwin (NULL); + fprintf (stderr, _("Invalid default setting found. Please report this " + "error:\n\"%s\"\n"), errbuf); + exit (1); + } + mem_free (&init); } if (ptr->flags & R_INDEX) @@ -1831,6 +1878,8 @@ int mutt_parse_rc_line ( /* const */ char *line, BUFFER * token, BUFFER * err) *err->data = 0; + debug_print (1, ("expand '%s'\n", line)); + SKIPWS (expn.dptr); while (*expn.dptr) { if (*expn.dptr == '#') @@ -2272,6 +2321,7 @@ void mutt_init (int skip_sys_rc, LIST * commands) Realname = str_dup (mutt_gecos_name (rnbuf, sizeof (rnbuf), pw)); Shell = str_dup (pw->pw_shell); + endpwent (); } else { if (!Homedir) {