X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=init.c;h=e56a916228dddb0fe744b81552ef314f0e337bad;hp=419d892ef62af9378cbd4c6f9a9eb2ef430a3c8e;hb=1b7a73c786059b66cfe5e89b2ba74b9c890309fc;hpb=189d7d65c27f269b7d85473483488cc6ebbf12f5 diff --git a/init.c b/init.c index 419d892..e56a916 100644 --- a/init.c +++ b/init.c @@ -88,6 +88,10 @@ static int check_history (const char* option, unsigned long val, /* this checks that numbers are >= 0 */ static int check_num (const char* option, unsigned long val, char* errbuf, size_t errlen); +#ifdef DEBUG +static int check_debug (const char* option, unsigned long val, + char* errbuf, size_t errlen); +#endif /* use this to check only */ static int check_special (const char* option, unsigned long val, @@ -109,6 +113,9 @@ static struct { #endif { "history", check_history }, { "pager_index_lines", check_num }, +#ifdef DEBUG + { "debug_level", check_debug }, +#endif /* last */ { NULL, NULL } }; @@ -123,6 +130,7 @@ static void rx_to_string (char* dst, size_t dstlen, struct option_t* option); static void magic_to_string (char* dst, size_t dstlen, struct option_t* option); static void addr_to_string (char* dst, size_t dstlen, struct option_t* option); static void user_to_string (char* dst, size_t dstlen, struct option_t* option); +static void sys_to_string (char* dst, size_t dstlen, struct option_t* option); /* protos for config type handles: convert to value from string */ static int bool_from_string (struct option_t* dst, const char* val, @@ -166,6 +174,7 @@ static struct { { DT_SYN, NULL, NULL }, { DT_ADDR, addr_to_string, addr_from_string }, { DT_USER, user_to_string, user_from_string }, + { DT_SYS, sys_to_string, NULL }, }; static void bool_to_string (char* dst, size_t dstlen, @@ -246,6 +255,11 @@ static void user_to_string (char* dst, size_t dstlen, NONULL (((char*) option->data))); } +static void sys_to_string (char* dst, size_t dstlen, + struct option_t* option) { + snprintf (dst, dstlen, "%s=\"%s\"", option->option, option->init); +} + static int path_from_string (struct option_t* dst, const char* val, char* errbuf, size_t errlen) { char path[_POSIX_PATH_MAX]; @@ -777,7 +791,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++) { @@ -795,23 +809,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++; } } @@ -822,9 +829,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); @@ -1300,23 +1308,33 @@ static void mutt_set_default (const char* name, void* p, unsigned long more) { return; ptr = hash_find (ConfigOptions, (char*) ptr->data); } - if (!ptr || *ptr->init) + if (!ptr || *ptr->init || !FuncTable[DTYPE (ptr->type)].opt_from_string) return; mutt_option_value (ptr->option, buf, sizeof (buf)); if (str_len (ptr->init) == 0 && buf && *buf) ptr->init = str_dup (buf); } -/* creates new option_t* of type DT_USER for $user_ var */ -static struct option_t* add_user_option (const char* name) { +static struct option_t* add_option (const char* name, const char* init, + short type, short dup) { struct option_t* option = mem_calloc (1, sizeof (struct option_t)); + + debug_print (1, ("adding $%s\n", name)); + option->option = str_dup (name); - option->type = DT_USER; + option->type = type; + if (init) + option->init = dup ? str_dup (init) : (char*) init; return (option); } +/* creates new option_t* of type DT_USER for $user_ var */ +static struct option_t* add_user_option (const char* name) { + return (add_option (name, NULL, DT_USER, 1)); +} + /* free()'s option_t* */ -static void del_user_option (void* p) { +static void del_option (void* p) { struct option_t* ptr = (struct option_t*) p; char* s = (char*) ptr->data; debug_print (1, ("removing option '%s' from table\n", NONULL (ptr->option))); @@ -1339,7 +1357,8 @@ static void mutt_restore_default (const char* name, void* p, } if (!ptr) return; - if (FuncTable[DTYPE (ptr->type)].opt_from_string (ptr, ptr->init, errbuf, + 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 " @@ -1412,6 +1431,19 @@ static int check_num (const char* option, unsigned long p, return (1); } +#ifdef DEBUG +static int check_debug (const char* option, unsigned long p, + char* errbuf, size_t errlen) { + if ((int) p <= DEBUG_MAX_LEVEL && + (int) p >= DEBUG_MIN_LEVEL) + return (1); + + if (errbuf) + snprintf (errbuf, errlen, _("'%d' is invalid for $%s"), (int) p, option); + return (0); +} +#endif + static int check_history (const char* option, unsigned long p, char* errbuf, size_t errlen) { if (!check_num ("history", p, errbuf, errlen)) @@ -1530,7 +1562,11 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, hash_map (ConfigOptions, mutt_restore_default, 1); return (0); } - else + else if (!FuncTable[DTYPE (option->type)].opt_from_string) { + snprintf (err->data, err->dsize, _("$%s is read-only"), option->option); + r = -1; + break; + } else mutt_restore_default (NULL, option, 1); } else if (DTYPE (option->type) == DT_BOOL) { @@ -1573,20 +1609,27 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, DTYPE (option->type) == DT_NUM || DTYPE (option->type) == DT_SORT || DTYPE (option->type) == DT_RX || - DTYPE (option->type) == DT_USER) { + DTYPE (option->type) == DT_USER || + DTYPE (option->type) == DT_SYS) { /* XXX maybe we need to get unset into handlers? */ if (DTYPE (option->type) == DT_STR || DTYPE (option->type) == DT_PATH || DTYPE (option->type) == DT_ADDR || - DTYPE (option->type) == DT_USER) { + DTYPE (option->type) == DT_USER || + DTYPE (option->type) == DT_SYS) { if (unset) { - if (DTYPE (option->type) == DT_ADDR) + if (!FuncTable[DTYPE (option->type)].opt_from_string) { + snprintf (err->data, err->dsize, _("$%s is read-only"), + option->option); + r = -1; + break; + } else if (DTYPE (option->type) == DT_ADDR) rfc822_free_address ((ADDRESS **) option->data); else if (DTYPE (option->type) == DT_USER) /* to unset $user_ means remove */ hash_delete (ConfigOptions, option->option, - option, del_user_option); + option, del_option); else mem_free ((void *) option->data); break; @@ -1599,11 +1642,19 @@ static int parse_set (BUFFER * tmp, BUFFER * s, unsigned long data, break; } - s->dptr++; - mutt_extract_token (tmp, s, 0); - if (!FuncTable[DTYPE (option->type)].opt_from_string - (option, tmp->data, err->data, err->dsize)) + /* the $muttng_ variables are read-only */ + if (!FuncTable[DTYPE (option->type)].opt_from_string) { + snprintf (err->data, err->dsize, _("$%s is read-only"), + option->option); r = -1; + break; + } else { + s->dptr++; + mutt_extract_token (tmp, s, 0); + if (!FuncTable[DTYPE (option->type)].opt_from_string + (option, tmp->data, err->data, err->dsize)) + r = -1; + } } else if (DTYPE (option->type) == DT_QUAD) { @@ -2182,10 +2233,17 @@ void mutt_init (int skip_sys_rc, LIST * commands) err.data = error; err.dsize = sizeof (error); - /* use 3*sizeof(muttvars) to have some room for $user_ vars */ + /* use 3*sizeof(muttvars) instead of 2*sizeof() + * to have some room for $user_ vars */ ConfigOptions = hash_create (sizeof (MuttVars) * 3); - for (i = 0; MuttVars[i].option; i++) - hash_insert (ConfigOptions, MuttVars[i].option, &MuttVars[i], 0); + for (i = 0; MuttVars[i].option; i++) { + if (DTYPE (MuttVars[i].type) != DT_SYS) + hash_insert (ConfigOptions, MuttVars[i].option, &MuttVars[i], 0); + else + hash_insert (ConfigOptions, MuttVars[i].option, + add_option (MuttVars[i].option, MuttVars[i].init, + DT_SYS, 0), 0); + } /* * XXX - use something even more difficult to predict? @@ -2419,7 +2477,7 @@ void mutt_init (int skip_sys_rc, LIST * commands) /* Read the user's initialization file. */ if (access (Muttrc, F_OK) != -1) { if (!option (OPTNOCURSES)) - endwin (); + mutt_endwin (NULL); if (source_rc (Muttrc, &err) != 0) { fputs (err.data, stderr); fputc ('\n', stderr);