-static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
-{
- int idx, query, unset, inv, reset, r = 0;
- char *p, scratch[_POSIX_PATH_MAX];
-
- while (MoreArgs (s))
- {
- /* reset state variables */
- query = 0;
- unset = data & M_SET_UNSET;
- inv = data & M_SET_INV;
- reset = data & M_SET_RESET;
-
- if (*s->dptr == '?')
- {
- query = 1;
- s->dptr++;
- }
- else if (mutt_strncmp ("no", s->dptr, 2) == 0)
- {
- s->dptr += 2;
- unset = !unset;
- }
- else if (mutt_strncmp ("inv", s->dptr, 3) == 0)
- {
- s->dptr += 3;
- inv = !inv;
- }
- else if (*s->dptr == '&')
- {
- reset = 1;
- s->dptr++;
- }
-
- /* get the variable name */
- mutt_extract_token (tmp, s, M_TOKEN_EQUAL);
-
- if ((idx = mutt_option_index (tmp->data)) == -1 &&
- !(reset && !mutt_strcmp ("all", tmp->data)))
- {
- snprintf (err->data, err->dsize, _("%s: unknown variable"), tmp->data);
- return (-1);
- }
- SKIPWS (s->dptr);
-
- if (reset)
- {
- if (query || unset || inv)
- {
- snprintf (err->data, err->dsize, _("prefix is illegal with reset"));
- return (-1);
- }
-
- if (s && *s->dptr == '=')
- {
- snprintf (err->data, err->dsize, _("value is illegal with reset"));
- return (-1);
- }
-
- if (!mutt_strcmp ("all", tmp->data))
- {
- for (idx = 0; MuttVars[idx].option; idx++)
- mutt_restore_default (&MuttVars[idx]);
- return 0;
- }
- else
- mutt_restore_default (&MuttVars[idx]);
- }
- else if (DTYPE (MuttVars[idx].type) == DT_BOOL)
- {
- if (s && *s->dptr == '=')
- {
- if (unset || inv || query)
- {
- snprintf (err->data, err->dsize, "Usage: set variable=yes|no");
- return (-1);
- }
-
- s->dptr++;
- mutt_extract_token (tmp, s, 0);
- if (ascii_strcasecmp ("yes", tmp->data) == 0)
- unset = inv = 0;
- else if (ascii_strcasecmp ("no", tmp->data) == 0)
- unset = 1;
- else
- {
- snprintf (err->data, err->dsize, "Usage: set variable=yes|no");
- return (-1);
- }
- }
-
- if (query)
- {
- snprintf (err->data, err->dsize, option (MuttVars[idx].data)
- ? _("%s is set") : _("%s is unset"), tmp->data);
- return 0;
- }
-
- if (unset)
- unset_option (MuttVars[idx].data);
- else if (inv)
- toggle_option (MuttVars[idx].data);
- else
- set_option (MuttVars[idx].data);
- }
- else if (DTYPE (MuttVars[idx].type) == DT_STR ||
- DTYPE (MuttVars[idx].type) == DT_PATH ||
- DTYPE (MuttVars[idx].type) == DT_ADDR)
- {
- if (unset)
- {
- if (DTYPE (MuttVars[idx].type) == DT_ADDR)
- rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
- else
- FREE (MuttVars[idx].data);
- }
- else 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), 0);
- 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 (val));
- break;
- }
- else
- {
- s->dptr++;
-
- /* copy the value of the string */
- if (DTYPE (MuttVars[idx].type) == DT_ADDR)
- rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
- else
- FREE (MuttVars[idx].data);
-
- mutt_extract_token (tmp, s, 0);
- if (DTYPE (MuttVars[idx].type) == DT_PATH)
- {
- strfcpy (scratch, tmp->data, sizeof (scratch));
- mutt_expand_path (scratch, sizeof (scratch));
- *((char **) MuttVars[idx].data) = safe_strdup (scratch);
- }
- else if (DTYPE (MuttVars[idx].type) == DT_STR)
- {
- *((char **) MuttVars[idx].data) = safe_strdup (tmp->data);
- if (mutt_strcmp (MuttVars[idx].option, "charset") == 0)
- mutt_set_charset (Charset);
- }
- else
- {
- *((ADDRESS **) MuttVars[idx].data) = rfc822_parse_adrlist (NULL, tmp->data);
- }
- }
- }
- else if (DTYPE(MuttVars[idx].type) == DT_RX)
- {
- REGEXP *ptr = (REGEXP *) MuttVars[idx].data;
- regex_t *rx;
- int e, flags = 0;
-
- if (query || *s->dptr != '=')
- {
- /* user requested the value of this variable */
- snprintf (err->data, err->dsize, "%s=\"%s\"", MuttVars[idx].option,
- NONULL (ptr->pattern));
- break;
- }