WHERE char *MixEntryFormat;
#endif
-WHERE struct List *Muttrc;
+WHERE struct STailQHead Muttrc INITVAL(STAILQ_HEAD_INITIALIZER(Muttrc));
#ifdef USE_NNTP
WHERE char *GroupFormat;
WHERE char *Inews;
struct STailQNode *np;
while (counter)
{
- np = safe_malloc(sizeof(struct STailQNode));
+ np = mutt_stailq_insert_tail(l, NULL);
restore_char(&np->data, d, off, convert);
- STAILQ_INSERT_TAIL(l, np, entries);
counter--;
}
}
}
mutt_unlink(body);
- mutt_free_stailq(&msg->env->userhdrs);
+ mutt_stailq_free(&msg->env->userhdrs);
/* Read the temp file back in */
if ((ifp = fopen(path, "r")) == NULL)
(STAILQ_EMPTY(&n->in_reply_to) ||
(mutt_strcmp(STAILQ_FIRST(&n->in_reply_to)->data,
STAILQ_FIRST(&msg->env->in_reply_to)->data) != 0)))
- mutt_free_stailq(&msg->env->references);
+ mutt_stailq_free(&msg->env->references);
/* restore old info. */
- mutt_free_stailq(&n->references);
+ mutt_stailq_free(&n->references);
STAILQ_SWAP(&n->references, &msg->env->references, STailQNode);
mutt_free_envelope(&msg->env);
return;
}
}
- np = safe_calloc(1, sizeof(struct STailQNode));
- np->data = safe_strdup(str);
- STAILQ_INSERT_TAIL(head, np, entries);
+ mutt_stailq_insert_tail(head, safe_strdup(str));
}
static struct RxList *new_rx_list(void)
static void remove_from_stailq(struct STailQHead *head, const char *str)
{
if (mutt_strcmp("*", str) == 0)
- mutt_free_stailq(head); /* ``unCMD *'' means delete all current entries */
+ mutt_stailq_free(head); /* ``unCMD *'' means delete all current entries */
else
{
struct STailQNode *np, *tmp;
*/
if (mutt_strcmp(buf->data, "*") == 0)
{
- mutt_free_stailq((struct STailQHead *)data);
+ mutt_stailq_free((struct STailQHead *)data);
break;
}
remove_from_stailq((struct STailQHead *)data, buf->data);
mutt_extract_token(buf, s, 0);
if (mutt_strcmp("*", buf->data) == 0)
{
- mutt_free_stailq(&UserHeader);
+ mutt_stailq_free(&UserHeader);
continue;
}
if (!n)
{
/* not found, allocate memory for a new node and add it to the list */
- n = safe_calloc(1, sizeof(struct STailQNode));
- STAILQ_INSERT_TAIL(&UserHeader, n, entries);
+ n = mutt_stailq_insert_tail(&UserHeader, NULL);
}
else
{
}
if (!np)
{
- np = safe_calloc(1, sizeof(struct STailQNode));
- np->data = safe_strdup(rcfile);
- STAILQ_INSERT_HEAD(&MuttrcStack, np, entries);
+ mutt_stailq_insert_head(&MuttrcStack, safe_strdup(rcfile));
}
else
{
add_to_list(&MailToAllow, "in-reply-to");
add_to_list(&MailToAllow, "references");
- if (!Muttrc)
+ struct STailQNode *np = NULL;
+ if (STAILQ_EMPTY(&Muttrc))
{
char *xdg_cfg_home = getenv("XDG_CONFIG_HOME");
char *config = find_cfg(HomeDir, xdg_cfg_home);
if (config)
{
- Muttrc = mutt_add_list(Muttrc, config);
- FREE(&config);
+ mutt_stailq_insert_tail(&Muttrc, config);
}
}
else
{
- for (struct List *config = Muttrc; config != NULL; config = config->next)
+ STAILQ_FOREACH(np, &Muttrc, entries)
{
- strfcpy(buffer, config->data, sizeof(buffer));
- FREE(&config->data);
+ strfcpy(buffer, np->data, sizeof(buffer));
+ FREE(&np->data);
mutt_expand_path(buffer, sizeof(buffer));
- config->data = safe_strdup(buffer);
- if (access(config->data, F_OK))
+ np->data = safe_strdup(buffer);
+ if (access(np->data, F_OK))
{
- snprintf(buffer, sizeof(buffer), "%s: %s", config->data, strerror(errno));
+ snprintf(buffer, sizeof(buffer), "%s: %s", np->data, strerror(errno));
mutt_endwin(buffer);
exit(1);
}
}
}
- if (Muttrc && Muttrc->data)
+ if (!STAILQ_EMPTY(&Muttrc))
{
FREE(&AliasFile);
- AliasFile = safe_strdup(Muttrc->data);
+ AliasFile = safe_strdup(STAILQ_FIRST(&Muttrc)->data);
}
/* Process the global rc file if it exists and the user hasn't explicitly
}
/* Read the user's initialization file. */
- for (struct List *config = Muttrc; config != NULL; config = config->next)
+ STAILQ_FOREACH(np, &Muttrc, entries)
{
- if (config->data)
+ if (np->data)
{
if (!option(OPT_NO_CURSES))
endwin();
- if (source_rc(config->data, &err) != 0)
+ if (source_rc(np->data, &err) != 0)
{
fputs(err.data, stderr);
fputc('\n', stderr);
STAILQ_ENTRY(STailQNode) entries;
};
+static inline struct STailQNode* mutt_stailq_insert_head(struct STailQHead *h, char *s)
+{
+ struct STailQNode *np = safe_calloc(1, sizeof(struct STailQNode));
+ np->data = s;
+ STAILQ_INSERT_HEAD(h, np, entries);
+ return np;
+}
+
+static inline struct STailQNode* mutt_stailq_insert_tail(struct STailQHead *h, char * s)
+{
+ struct STailQNode *np = safe_calloc(1, sizeof(struct STailQNode));
+ np->data = s;
+ STAILQ_INSERT_TAIL(h, np, entries);
+ return np;
+}
+
+static inline struct STailQNode *mutt_stailq_find(struct STailQHead *h, const char *data)
+{
+ struct STailQNode *np = NULL;
+ STAILQ_FOREACH(np, h, entries)
+ {
+ if (np->data == data || mutt_strcmp(np->data, data) == 0)
+ {
+ return np;
+ }
+ }
+ return NULL;
+}
+
+static inline void mutt_stailq_free(struct STailQHead *h)
+{
+ struct STailQNode *np = STAILQ_FIRST(h), *next = NULL;
+ while (np)
+ {
+ next = STAILQ_NEXT(np, entries);
+ FREE(&np->data);
+ FREE(&np);
+ np = next;
+ }
+ STAILQ_INIT(h);
+}
+
#endif /* _MUTT_LIST_H */
case 'F':
/* mutt_str_replace (&Muttrc, optarg); */
- Muttrc = mutt_add_list(Muttrc, optarg);
+ mutt_stailq_insert_tail(&Muttrc, safe_strdup(optarg));
break;
case 'f':
#define MUTT_KEYWORDS (1 << 3) /**< rfc2822 */
void mutt_free_list(struct List **list);
-void mutt_free_stailq(struct STailQHead *list);
void mutt_free_rx_list(struct RxList **list);
void mutt_free_replace_list(struct ReplaceList **list);
int mutt_matches_ignore(const char *s);
struct List *mutt_add_list(struct List *head, const char *data);
struct List *mutt_add_list_n(struct List *head, const void *data, size_t len);
struct List *mutt_find_list(struct List *l, const char *data);
-struct STailQNode *mutt_find_stailq(struct STailQHead *h, const char *data);
int mutt_remove_from_rx_list(struct RxList **l, const char *str);
void mutt_init(int skip_sys_rc, struct List *commands);
return NULL;
}
-struct STailQNode *mutt_find_stailq(struct STailQHead *h, const char *data)
-{
- struct STailQNode *np = NULL;
- STAILQ_FOREACH(np, h, entries)
- {
- if (np->data == data)
- return np;
- if (data && np->data && (mutt_strcmp(np->data, data) == 0))
- return np;
- }
- return NULL;
-}
-
int mutt_remove_from_rx_list(struct RxList **l, const char *str)
{
struct RxList *p = NULL, *last = NULL;
}
}
-void mutt_free_stailq(struct STailQHead *h)
-{
- struct STailQNode *np = NULL;
- while (!STAILQ_EMPTY(h))
- {
- np = STAILQ_FIRST(h);
- STAILQ_REMOVE_HEAD(h, entries);
- FREE(&np->data);
- FREE(&np);
- }
-}
-
void mutt_free_header(struct Header **h)
{
if (!h || !*h)
FREE(&(*h)->tree);
FREE(&(*h)->path);
#ifdef MIXMASTER
- mutt_free_stailq(&(*h)->chain);
+ mutt_stailq_free(&(*h)->chain);
#endif
#if defined(USE_POP) || defined(USE_IMAP) || defined(USE_NNTP) || defined(USE_NOTMUCH)
if ((*h)->free_cb)
mutt_buffer_free(&(*p)->spam);
- mutt_free_stailq(&(*p)->references);
- mutt_free_stailq(&(*p)->in_reply_to);
- mutt_free_stailq(&(*p)->userhdrs);
+ mutt_stailq_free(&(*p)->references);
+ mutt_stailq_free(&(*p)->in_reply_to);
+ mutt_stailq_free(&(*p)->userhdrs);
FREE(p);
}
/* spam and user headers should never be hashed, and the new envelope may
* have better values. Use new versions regardless. */
mutt_buffer_free(&base->spam);
- mutt_free_stailq(&base->userhdrs);
+ mutt_stailq_free(&base->userhdrs);
MOVE_ELEM(spam);
MOVE_STAILQ(userhdrs);
#undef MOVE_ELEM
static void parse_references(struct STailQHead *head, char *s)
{
- struct STailQNode *np = NULL;
char *m = NULL;
const char *sp = NULL;
- m = mutt_extract_message_id(s, &sp);
- while (m)
+ while ((m = mutt_extract_message_id(s, &sp)))
{
- np = safe_malloc(sizeof(struct STailQNode));
- np->data = m;
- STAILQ_INSERT_HEAD(head, np, entries);
- m = mutt_extract_message_id(NULL, &sp);
+ mutt_stailq_insert_head(head, m);
+ s = NULL;
}
}
case 'i':
if (mutt_strcasecmp(line + 1, "n-reply-to") == 0)
{
- mutt_free_stailq(&e->in_reply_to);
+ mutt_stailq_free(&e->in_reply_to);
parse_references(&e->in_reply_to, p);
matched = 1;
}
case 'r':
if (mutt_strcasecmp(line + 1, "eferences") == 0)
{
- mutt_free_stailq(&e->references);
+ mutt_stailq_free(&e->references);
parse_references(&e->references, p);
matched = 1;
}
if (!(weed && option(OPT_WEED) && mutt_matches_ignore(line)))
{
- struct STailQNode *np = calloc(1, sizeof(struct STailQNode));
- np->data = safe_strdup(line);
- STAILQ_INSERT_TAIL(&e->userhdrs, np, entries);
+ struct STailQNode *np = mutt_stailq_insert_tail(&e->userhdrs, safe_strdup(line));
if (do_2047)
rfc2047_decode(&np->data);
}
else if (mutt_strncmp("X-Mutt-Mix:", np->data, 11) == 0)
{
char *t = NULL;
- mutt_free_stailq(&hdr->chain);
+ mutt_stailq_free(&hdr->chain);
t = strtok(np->data + 11, " \t\n");
- struct STailQNode *n;
while (t)
{
- n = safe_calloc(1, sizeof(struct STailQNode));
- n->data = safe_strdup(t);
- STAILQ_INSERT_TAIL(&hdr->chain, n, entries);
+ mutt_stailq_insert_tail(&hdr->chain, safe_strdup(t));
t = strtok(NULL, " \t\n");
}
}
{
mix_chain_add(chain, p->data, type2_list);
}
- mutt_free_stailq(chainhead);
+ mutt_stailq_free(chainhead);
/* safety check */
for (i = 0; i < chain->cl; i++)
if (chain->cl)
{
- struct STailQNode *n = NULL;
for (i = 0; i < chain->cl; i++)
{
if ((j = chain->ch[i]))
else
t = "*";
- n = safe_calloc(1, sizeof(struct STailQNode));
- n->data = safe_strdup(t);
- STAILQ_INSERT_TAIL(chainhead, n, entries);
+ mutt_stailq_insert_tail(chainhead, safe_strdup(t));
}
}
(mutt_strncasecmp("subject:", uh->data, 8) != 0) &&
(mutt_strncasecmp("return-path:", uh->data, 12) != 0))
{
- struct STailQNode *np = safe_calloc(1, sizeof(struct STailQNode));
- np->data = safe_strdup(uh->data);
- STAILQ_INSERT_TAIL(&env->userhdrs, np, entries);
+ mutt_stailq_insert_tail(&env->userhdrs, safe_strdup(uh->data));
}
}
}
static void add_references(struct STailQHead *head, struct Envelope *e)
{
struct STailQHead *src;
- struct STailQNode *np, *new;
+ struct STailQNode *np;
src = !STAILQ_EMPTY(&e->references) ? &e->references : &e->in_reply_to;
STAILQ_FOREACH(np, src, entries)
{
- new = safe_calloc(1, sizeof(struct STailQNode));
- new->data = safe_strdup(np->data);
- STAILQ_INSERT_TAIL(head, new, entries);
+ mutt_stailq_insert_tail(head, safe_strdup(np->data));
}
}
{
if (e->message_id)
{
- struct STailQNode *new = safe_calloc(1, sizeof(struct STailQNode));
- new->data = safe_strdup(e->message_id);
- STAILQ_INSERT_HEAD(head, new, entries);
+ mutt_stailq_insert_head(head, safe_strdup(e->message_id));
}
}
discouraged by RfC2822, sect. 3.6.4 */
if (ctx->tagged > 0 && !STAILQ_EMPTY(&env->in_reply_to) &&
STAILQ_NEXT(STAILQ_FIRST(&env->in_reply_to), entries))
- mutt_free_stailq(&env->references);
+ mutt_stailq_free(&env->references);
}
static int envelope_defaults(struct Envelope *env, struct Context *ctx,
{
if (!reply || !reply->env || !orig || !orig->env)
return 0;
- return mutt_find_stailq(&orig->env->references, reply->env->message_id) ||
- mutt_find_stailq(&orig->env->in_reply_to, reply->env->message_id);
+ return mutt_stailq_find(&orig->env->references, reply->env->message_id) ||
+ mutt_stailq_find(&orig->env->in_reply_to, reply->env->message_id);
}
static int has_recips(struct Address *a)
void mutt_break_thread(struct Header *hdr)
{
- mutt_free_stailq(&hdr->env->in_reply_to);
- mutt_free_stailq(&hdr->env->references);
+ mutt_stailq_free(&hdr->env->in_reply_to);
+ mutt_stailq_free(&hdr->env->references);
hdr->env->irt_changed = hdr->env->refs_changed = hdr->changed = true;
clean_references(hdr->thread, hdr->thread->child);
return false;
mutt_break_thread(child);
-
- STAILQ_INIT(&child->env->in_reply_to);
- struct STailQNode *new = safe_calloc(1, sizeof(struct STailQNode));
- new->data = safe_strdup(parent->env->message_id);
- STAILQ_INSERT_HEAD(&child->env->in_reply_to, new, entries);
-
+ mutt_stailq_insert_head(&child->env->in_reply_to, safe_strdup(parent->env->message_id));
mutt_set_flag(ctx, child, MUTT_TAG, 0);
child->env->irt_changed = child->changed = true;