📄 init.c
字号:
listp = &AttachAllow; else listp = &AttachExclude; } else if (!ascii_strncasecmp(category, "inline", strlen(category))) { if (op == '+') listp = &InlineAllow; else listp = &InlineExclude; } else { strfcpy(err->data, _("attachments: invalid disposition"), err->dsize); return -1; } return parse_attach_list(buf, s, listp, err);}static int parse_unattachments (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ char op, *p; LIST **listp; mutt_extract_token(buf, s, 0); if (!buf->data || *buf->data == '\0') { strfcpy(err->data, _("unattachments: no disposition"), err->dsize); return -1; } p = buf->data; op = *p++; if (op != '+' && op != '-') { op = '+'; p--; } if (!ascii_strncasecmp(p, "attachment", strlen(p))) { if (op == '+') listp = &AttachAllow; else listp = &AttachExclude; } else if (!ascii_strncasecmp(p, "inline", strlen(p))) { if (op == '+') listp = &InlineAllow; else listp = &InlineExclude; } else { strfcpy(err->data, _("unattachments: invalid disposition"), err->dsize); return -1; } return parse_unattach_list(buf, s, listp, err);}static int parse_unlists (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ do { mutt_extract_token (buf, s, 0); remove_from_rx_list (&SubscribedLists, buf->data); remove_from_rx_list (&MailLists, buf->data); if (mutt_strcmp (buf->data, "*") && mutt_add_to_rx_list (&UnMailLists, buf->data, REG_ICASE, err) != 0) return -1; } while (MoreArgs (s)); return 0;}static int parse_subscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ group_context_t *gc = NULL; do { mutt_extract_token (buf, s, 0); if (parse_group_context (&gc, buf, s, data, err) == -1) goto bail; remove_from_rx_list (&UnMailLists, buf->data); remove_from_rx_list (&UnSubscribedLists, buf->data); if (mutt_add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0) goto bail; if (mutt_add_to_rx_list (&SubscribedLists, buf->data, REG_ICASE, err) != 0) goto bail; if (mutt_group_context_add_rx (gc, buf->data, REG_ICASE, err) != 0) goto bail; } while (MoreArgs (s)); mutt_group_context_destroy (&gc); return 0; bail: mutt_group_context_destroy (&gc); return -1;}static int parse_unsubscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ do { mutt_extract_token (buf, s, 0); remove_from_rx_list (&SubscribedLists, buf->data); if (mutt_strcmp (buf->data, "*") && mutt_add_to_rx_list (&UnSubscribedLists, buf->data, REG_ICASE, err) != 0) return -1; } while (MoreArgs (s)); return 0;} static int parse_unalias (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ ALIAS *tmp, *last = NULL; do { mutt_extract_token (buf, s, 0); if (mutt_strcmp ("*", buf->data) == 0) { if (CurrentMenu == MENU_ALIAS) { for (tmp = Aliases; tmp ; tmp = tmp->next) tmp->del = 1; set_option (OPTFORCEREDRAWINDEX); } else mutt_free_alias (&Aliases); break; } else for (tmp = Aliases; tmp; tmp = tmp->next) { if (mutt_strcasecmp (buf->data, tmp->name) == 0) { if (CurrentMenu == MENU_ALIAS) { tmp->del = 1; set_option (OPTFORCEREDRAWINDEX); break; } if (last) last->next = tmp->next; else Aliases = tmp->next; tmp->next = NULL; mutt_free_alias (&tmp); break; } last = tmp; } } while (MoreArgs (s)); return 0;}static int parse_alias (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ ALIAS *tmp = Aliases; ALIAS *last = NULL; char *estr = NULL; group_context_t *gc = NULL; if (!MoreArgs (s)) { strfcpy (err->data, _("alias: no address"), err->dsize); return (-1); } mutt_extract_token (buf, s, 0); if (parse_group_context (&gc, buf, s, data, err) == -1) return -1; /* check to see if an alias with this name already exists */ for (; tmp; tmp = tmp->next) { if (!mutt_strcasecmp (tmp->name, buf->data)) break; last = tmp; } if (!tmp) { /* create a new alias */ tmp = (ALIAS *) safe_calloc (1, sizeof (ALIAS)); tmp->self = tmp; tmp->name = safe_strdup (buf->data); /* give the main addressbook code a chance */ if (CurrentMenu == MENU_ALIAS) set_option (OPTMENUCALLER); } else { /* override the previous value */ rfc822_free_address (&tmp->addr); if (CurrentMenu == MENU_ALIAS) set_option (OPTFORCEREDRAWINDEX); } mutt_extract_token (buf, s, M_TOKEN_QUOTE | M_TOKEN_SPACE | M_TOKEN_SEMICOLON); dprint (2, (debugfile, "parse_alias: Second token is '%s'.\n", buf->data)); tmp->addr = mutt_parse_adrlist (tmp->addr, buf->data); if (last) last->next = tmp; else Aliases = tmp; if (mutt_addrlist_to_idna (tmp->addr, &estr)) { snprintf (err->data, err->dsize, _("Warning: Bad IDN '%s' in alias '%s'.\n"), estr, tmp->name); goto bail; } mutt_group_context_add_adrlist (gc, tmp->addr);#ifdef DEBUG if (debuglevel >= 2) { ADDRESS *a; /* A group is terminated with an empty address, so check a->mailbox */ for (a = tmp->addr; a && a->mailbox; a = a->next) { if (!a->group) dprint (2, (debugfile, "parse_alias: %s\n", a->mailbox)); else dprint (2, (debugfile, "parse_alias: Group %s\n", a->mailbox)); } }#endif mutt_group_context_destroy (&gc); return 0; bail: mutt_group_context_destroy (&gc); return -1;}static intparse_unmy_hdr (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ LIST *last = NULL; LIST *tmp = UserHeader; LIST *ptr; size_t l; do { mutt_extract_token (buf, s, 0); if (mutt_strcmp ("*", buf->data) == 0) mutt_free_list (&UserHeader); else { tmp = UserHeader; last = NULL; l = mutt_strlen (buf->data); if (buf->data[l - 1] == ':') l--; while (tmp) { if (ascii_strncasecmp (buf->data, tmp->data, l) == 0 && tmp->data[l] == ':') { ptr = tmp; if (last) last->next = tmp->next; else UserHeader = tmp->next; tmp = tmp->next; ptr->next = NULL; mutt_free_list (&ptr); } else { last = tmp; tmp = tmp->next; } } } } while (MoreArgs (s)); return 0;}static int parse_my_hdr (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err){ LIST *tmp; size_t keylen; char *p; mutt_extract_token (buf, s, M_TOKEN_SPACE | M_TOKEN_QUOTE); if ((p = strpbrk (buf->data, ": \t")) == NULL || *p != ':') { strfcpy (err->data, _("invalid header field"), err->dsize); return (-1); } keylen = p - buf->data + 1; if (UserHeader) { for (tmp = UserHeader; ; tmp = tmp->next) { /* see if there is already a field by this name */ if (ascii_strncasecmp (buf->data, tmp->data, keylen) == 0) { /* replace the old value */ FREE (&tmp->data); tmp->data = buf->data; memset (buf, 0, sizeof (BUFFER)); return 0; } if (!tmp->next) break; } tmp->next = mutt_new_list (); tmp = tmp->next; } else { tmp = mutt_new_list (); UserHeader = tmp; } tmp->data = buf->data; memset (buf, 0, sizeof (BUFFER)); return 0;}static intparse_sort (short *val, const char *s, const struct mapping_t *map, BUFFER *err){ int i, flags = 0; if (mutt_strncmp ("reverse-", s, 8) == 0) { s += 8; flags = SORT_REVERSE; } if (mutt_strncmp ("last-", s, 5) == 0) { s += 5; flags |= SORT_LAST; } if ((i = mutt_getvaluebyname (s, map)) == -1) { snprintf (err->data, err->dsize, _("%s: unknown sorting method"), s); return (-1); } *val = i | flags; return 0;}static void mutt_set_default (struct option_t *p){ switch (p->type & DT_MASK) { case DT_STR: if (!p->init && *((char **) p->data)) p->init = (unsigned long) safe_strdup (* ((char **) p->data)); break; case DT_PATH: if (!p->init && *((char **) p->data)) { char *cp = safe_strdup (*((char **) p->data)); /* mutt_pretty_mailbox (cp); */ p->init = (unsigned long) cp; } break; case DT_ADDR: if (!p->init && *((ADDRESS **) p->data)) { char tmp[HUGE_STRING]; *tmp = '\0'; rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) p->data), 0); p->init = (unsigned long) safe_strdup (tmp); } break; case DT_RX: { REGEXP *pp = (REGEXP *) p->data; if (!p->init && pp->pattern) p->init = (unsigned long) safe_strdup (pp->pattern); break; } }}static void mutt_restore_default (struct option_t *p){ switch (p->type & DT_MASK) { case DT_STR: if (p->init) mutt_str_replace ((char **) p->data, (char *) p->init); break; case DT_PATH: if (p->init) { char path[_POSIX_PATH_MAX]; strfcpy (path, (char *) p->init, sizeof (path)); mutt_expand_path (path, sizeof (path)); mutt_str_replace ((char **) p->data, path); } break; case DT_ADDR: if (p->init) { rfc822_free_address ((ADDRESS **) p->data); *((ADDRESS **) p->data) = rfc822_parse_adrlist (NULL, (char *) p->init); } break; case DT_BOOL: if (p->init) set_option (p->data); else unset_option (p->data); break; case DT_QUAD: set_quadoption (p->data, p->init); break; case DT_NUM: case DT_SORT: case DT_MAGIC: *((short *) p->data) = p->init; break; case DT_RX: { REGEXP *pp = (REGEXP *) p->data; int flags = 0; FREE (&pp->pattern); if (pp->rx) { regfree (pp->rx); FREE (&pp->rx); } if (p->init) { char *s = (char *) p->init; pp->rx = safe_calloc (1, sizeof (regex_t)); pp->pattern = safe_strdup ((char *) p->init); if (mutt_strcmp (p->option, "mask") != 0) flags |= mutt_which_case ((const char *) p->init); if (mutt_strcmp (p->option, "mask") == 0 && *s == '!') { s++; pp->not = 1; } if (REGCOMP (pp->rx, s, flags) != 0) { fprintf (stderr, _("mutt_restore_default(%s): error in regexp: %s\n"), p->option, pp->pattern); FREE (&pp->pattern); regfree (pp->rx); FREE (&pp->rx); } } } break; } if (p->flags & R_INDEX) set_option (OPTFORCEREDRAWINDEX); if (p->flags & R_PAGER) set_option (OPTFORCEREDRAWPAGER); if (p->flags & R_RESORT_SUB) set_option (OPTSORTSUBTHREADS); if (p->flags & R_RESORT) set_option (OPTNEEDRESORT); if (p->flags & R_RESORT_INIT) set_option (OPTRESORTINIT); if (p->flags & R_TREE) set_option (OPTREDRAWTREE);}static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err){ int query, unset, inv, reset, r = 0; int idx = -1; char *p, scratch[_POSIX_PATH_MAX]; char* myvar; while (MoreArgs (s)) { /* reset state variables */ query = 0; unset = data & M_SET_UNSET; inv = data & M_SET_INV; reset = data & M_SET_RESET; myvar = NULL; 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 (!mutt_strncmp ("my_", tmp->data, 3)) myvar = tmp->data; else 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); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -