X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=thread.c;h=5dc98426336364fae25c911d5e65194750345359;hp=36ed25e229088736f0ce3481ae1d64c6ee73d65f;hb=049b21f53af51ad7259613f5eefaa0f37b1b2167;hpb=b17296ba049d71986028ac83f0b415a021d0691c diff --git a/thread.c b/thread.c index 36ed25e..5dc9842 100644 --- a/thread.c +++ b/thread.c @@ -7,20 +7,12 @@ * please see the file GPL in the top level source directory. */ -#if HAVE_CONFIG_H -# include "config.h" -#endif +#include #include "mutt.h" #include "sort.h" #include "thread.h" -#include "lib/mem.h" -#include "lib/intl.h" - -#include -#include - #define VISIBLE(hdr, ctx) (hdr->virtual >= 0 || (hdr->collapsed && (!ctx->pattern || hdr->limited))) /* determine whether a is a descendant of b */ @@ -28,10 +20,10 @@ static int is_descendant (THREAD * a, THREAD * b) { while (a) { if (a == b) - return (1); + return 1; a = a->parent; } - return (0); + return 0; } /* Determines whether to display a message's subject. */ @@ -41,11 +33,11 @@ static int need_display_subject (CONTEXT * ctx, HEADER * hdr) /* if the user disabled subject hiding, display it */ if (!option (OPTHIDETHREADSUBJECT)) - return (1); + return 1; /* if our subject is different from our parent's, display it */ if (hdr->subject_changed) - return (1); + return 1; /* if our subject is different from that of our closest previously displayed * sibling, display the subject */ @@ -53,7 +45,7 @@ static int need_display_subject (CONTEXT * ctx, HEADER * hdr) hdr = tmp->message; if (hdr && VISIBLE (hdr, ctx)) { if (hdr->subject_changed) - return (1); + return 1; else break; } @@ -65,14 +57,14 @@ static int need_display_subject (CONTEXT * ctx, HEADER * hdr) hdr = tmp->message; if (hdr) { if (VISIBLE (hdr, ctx)) - return (0); + return 0; else if (hdr->subject_changed) - return (1); + return 1; } } /* if we have no visible parent or previous sibling, display the subject */ - return (1); + return 1; } static void linearize_tree (CONTEXT * ctx) @@ -123,13 +115,13 @@ static void calculate_visibility (CONTEXT * ctx, int *max_depth) tree = tree->next; *max_depth = 0; - FOREVER { + for (;;) { if (depth > *max_depth) *max_depth = depth; tree->subtree_visible = 0; if (tree->message) { - mem_free (&tree->message->tree); + p_delete(&tree->message->tree); if (VISIBLE (tree->message, ctx)) { tree->deep = 1; tree->visible = 1; @@ -179,7 +171,7 @@ static void calculate_visibility (CONTEXT * ctx, int *max_depth) /* now fix up for the OPTHIDETOP* options if necessary */ if (hide_top_limited || hide_top_missing) { tree = ctx->tree; - FOREVER { + for (;;) { if (!tree->visible && tree->deep && tree->subtree_visible < 2 && ((tree->message && hide_top_limited) || (!tree->message && hide_top_missing))) @@ -203,10 +195,6 @@ static void calculate_visibility (CONTEXT * ctx, int *max_depth) /* Since the graphics characters have a value >255, I have to resort to * using escape sequences to pass the information to print_enriched_string(). * These are the macros M_TREE_* defined in mutt.h. - * - * ncurses should automatically use the default ASCII characters instead of - * graphics chars on terminals which don't support them (see the man page - * for curs_addch). */ void mutt_draw_tree (CONTEXT * ctx) { @@ -221,8 +209,8 @@ void mutt_draw_tree (CONTEXT * ctx) * From now on we can simply ignore invisible subtrees */ calculate_visibility (ctx, &max_depth); - pfx = mem_malloc (width * max_depth + 2); - arrow = mem_malloc (width * max_depth + 2); + pfx = p_new(char, width * max_depth + 2); + arrow = p_new(char, width * max_depth + 2); while (tree) { if (depth) { myarrow = arrow + (depth - start_depth - (start_depth ? 0 : 1)) * width; @@ -240,14 +228,14 @@ void mutt_draw_tree (CONTEXT * ctx) if (tree->visible) { myarrow[width] = M_TREE_RARROW; myarrow[width + 1] = 0; - new_tree = mem_malloc ((2 + depth * width)); + new_tree = p_new(char, (2 + depth * width)); if (start_depth > 1) { - strncpy (new_tree, pfx, (start_depth - 1) * width); - strfcpy (new_tree + (start_depth - 1) * width, - arrow, (1 + depth - start_depth) * width + 2); + memcpy(new_tree, pfx, (start_depth - 1) * width); + m_strcpy(new_tree + (start_depth - 1) * width, + (1 + depth - start_depth) * width + 2, arrow); } else - strfcpy (new_tree, arrow, 2 + depth * width); + m_strcpy(new_tree, 2 + depth * width, arrow); tree->message->tree = new_tree; } } @@ -307,23 +295,23 @@ void mutt_draw_tree (CONTEXT * ctx) while (!tree->deep); } - mem_free (&pfx); - mem_free (&arrow); + p_delete(&pfx); + p_delete(&arrow); } /* since we may be trying to attach as a pseudo-thread a THREAD that * has no message, we have to make a list of all the subjects of its * most immediate existing descendants. we also note the earliest * date on any of the parents and put it in *dateptr. */ -static LIST *make_subject_list (THREAD * cur, time_t * dateptr) +static string_list_t *make_subject_list (THREAD * cur, time_t * dateptr) { THREAD *start = cur; ENVELOPE *env; time_t thisdate; - LIST *curlist, *oldlist, *newlist, *subjects = NULL; + string_list_t *curlist, *oldlist, *newlist, *subjects = NULL; int rc = 0; - FOREVER { + for (;;) { while (!cur->message) cur = cur->child; @@ -339,12 +327,12 @@ static LIST *make_subject_list (THREAD * cur, time_t * dateptr) ((env->real_subj != env->subject) || (!option (OPTSORTRE)))) { for (curlist = subjects, oldlist = NULL; curlist; oldlist = curlist, curlist = curlist->next) { - rc = str_cmp (env->real_subj, curlist->data); + rc = m_strcmp(env->real_subj, curlist->data); if (rc >= 0) break; } if (!curlist || rc > 0) { - newlist = mem_calloc (1, sizeof (LIST)); + newlist = p_new(string_list_t, 1); newlist->data = env->real_subj; if (oldlist) { newlist->next = oldlist->next; @@ -365,7 +353,7 @@ static LIST *make_subject_list (THREAD * cur, time_t * dateptr) cur = cur->next; } - return (subjects); + return subjects; } /* find the best possible match for a parent mesage based upon subject. @@ -377,7 +365,7 @@ static THREAD *find_subject (CONTEXT * ctx, THREAD * cur) struct hash_elem *ptr; THREAD *tmp, *last = NULL; int hash; - LIST *subjects = NULL, *oldlist; + string_list_t *subjects = NULL, *oldlist; time_t date = 0; subjects = make_subject_list (cur, &date); @@ -399,15 +387,15 @@ static THREAD *find_subject (CONTEXT * ctx, THREAD * cur) (last->message->received < tmp->message->received) : (last->message->date_sent < tmp->message->date_sent))) && tmp->message->env->real_subj && - str_cmp (subjects->data, tmp->message->env->real_subj) == 0) + m_strcmp(subjects->data, tmp->message->env->real_subj) == 0) last = tmp; /* best match so far */ } oldlist = subjects; subjects = subjects->next; - mem_free (&oldlist); + p_delete(&oldlist); } - return (last); + return last; } /* remove cur and its descendants from their current location. @@ -462,7 +450,7 @@ static void pseudo_threads (CONTEXT * ctx) insert_message (&parent->child, parent, cur); parent->sort_children = 1; tmp = cur; - FOREVER { + for (;;) { while (!tmp->message) tmp = tmp->child; @@ -472,7 +460,7 @@ static void pseudo_threads (CONTEXT * ctx) * parent, since otherwise they rightly belong to the message * we're attaching. */ if (tmp == cur - || !str_cmp (tmp->message->env->real_subj, + || !m_strcmp(tmp->message->env->real_subj, parent->message->env->real_subj)) { tmp->message->subject_changed = 0; @@ -510,7 +498,7 @@ void mutt_clear_threads (CONTEXT * ctx) ctx->tree = NULL; if (ctx->thread_hash) - hash_destroy (&ctx->thread_hash, free); + hash_delete (&ctx->thread_hash, free); } static int compare_threads (const void *a, const void *b) @@ -526,7 +514,7 @@ static int compare_threads (const void *a, const void *b) else { sort_func = NULL; sort_func = mutt_get_sort_func (Sort); - return (sort_func ? 1 : 0); + return sort_func ? 1 : 0; } } @@ -543,11 +531,11 @@ THREAD *mutt_sort_subthreads (THREAD * thread, int init) */ Sort ^= SORT_REVERSE; if (!compare_threads (NULL, NULL)) - return (thread); + return thread; top = thread; - array = mem_calloc ((array_size = 256), sizeof (THREAD *)); + array = p_new(THREAD *, (array_size = 256)); while (1) { if (init || !thread->sort_key) { thread->sort_key = NULL; @@ -579,7 +567,7 @@ THREAD *mutt_sort_subthreads (THREAD * thread, int init) /* put them into the array */ for (i = 0; thread; i++, thread = thread->prev) { if (i >= array_size) - mem_realloc (&array, (array_size *= 2) * sizeof (THREAD *)); + p_realloc(&array, array_size *= 2); array[i] = thread; } @@ -639,8 +627,8 @@ THREAD *mutt_sort_subthreads (THREAD * thread, int init) } else { Sort ^= SORT_REVERSE; - mem_free (&array); - return (top); + p_delete(&array); + return top; } } @@ -670,7 +658,7 @@ static void check_subjects (CONTEXT * ctx, int init) if (!tmp) cur->subject_changed = 1; else if (cur->env->real_subj && tmp->message->env->real_subj) - cur->subject_changed = str_cmp (cur->env->real_subj, + cur->subject_changed = m_strcmp(cur->env->real_subj, tmp->message->env-> real_subj) ? 1 : 0; else @@ -684,7 +672,7 @@ void mutt_sort_threads (CONTEXT * ctx, int init) HEADER *cur; int i, oldsort, using_refs = 0; THREAD *thread, *new, *tmp, top; - LIST *ref = NULL; + string_list_t *ref = NULL; /* set Sort to the secondary method to support the set sort_aux=reverse-* * settings. The sorting functions just look at the value of @@ -697,7 +685,7 @@ void mutt_sort_threads (CONTEXT * ctx, int init) init = 1; if (init) - ctx->thread_hash = hash_create (ctx->msgcount * 2); + ctx->thread_hash = hash_new (ctx->msgcount * 2, 1); /* we want a quick way to see if things are actually attached to the top of the * thread tree or if they're just dangling, so we attach everything to a top @@ -756,13 +744,13 @@ void mutt_sort_threads (CONTEXT * ctx, int init) else { new = (option (OPTDUPTHREADS) ? thread : NULL); - thread = mem_calloc (1, sizeof (THREAD)); + thread = p_new(THREAD, 1); thread->message = cur; thread->check_subject = 1; cur->thread = thread; hash_insert (ctx->thread_hash, cur->env->message_id ? cur->env->message_id : "", - thread, 1); + thread); if (new) { if (new->duplicate_thread) @@ -822,7 +810,7 @@ void mutt_sort_threads (CONTEXT * ctx, int init) if (!cur->env->references) ref = ref->next; else { - if (str_cmp (ref->data, cur->env->references->data)) + if (m_strcmp(ref->data, cur->env->references->data)) ref = cur->env->references; else ref = cur->env->references->next; @@ -837,8 +825,8 @@ void mutt_sort_threads (CONTEXT * ctx, int init) break; if ((new = hash_find (ctx->thread_hash, ref->data)) == NULL) { - new = mem_calloc (1, sizeof (THREAD)); - hash_insert (ctx->thread_hash, ref->data, new, 1); + new = p_new(THREAD, 1); + hash_insert (ctx->thread_hash, ref->data, new); } else { if (new->duplicate_thread) @@ -889,18 +877,18 @@ static HEADER *find_virtual (THREAD * cur, int reverse) THREAD *top; if (cur->message && cur->message->virtual >= 0) - return (cur->message); + return cur->message; top = cur; if ((cur = cur->child) == NULL) - return (NULL); + return NULL; while (reverse && cur->next) cur = cur->next; - FOREVER { + for (;;) { if (cur->message && cur->message->virtual >= 0) - return (cur->message); + return cur->message; if (cur->child) { cur = cur->child; @@ -914,7 +902,7 @@ static HEADER *find_virtual (THREAD * cur, int reverse) while (!(reverse ? cur->prev : cur->next)) { cur = cur->parent; if (cur == top) - return (NULL); + return NULL; } cur = reverse ? cur->prev : cur->next; } @@ -930,7 +918,7 @@ int _mutt_aside_thread (HEADER * hdr, short dir, short subthreads) if ((Sort & SORT_MASK) != SORT_THREADS) { mutt_error _("Threading is not enabled."); - return (hdr->virtual); + return hdr->virtual; } cur = hdr->thread; @@ -954,7 +942,7 @@ int _mutt_aside_thread (HEADER * hdr, short dir, short subthreads) do { cur = cur->next; if (!cur) - return (-1); + return -1; tmp = find_virtual (cur, 0); } while (!tmp); } @@ -962,12 +950,12 @@ int _mutt_aside_thread (HEADER * hdr, short dir, short subthreads) do { cur = cur->prev; if (!cur) - return (-1); + return -1; tmp = find_virtual (cur, 1); } while (!tmp); } - return (tmp->virtual); + return tmp->virtual; } int mutt_parent_message (CONTEXT * ctx, HEADER * hdr) @@ -977,24 +965,24 @@ int mutt_parent_message (CONTEXT * ctx, HEADER * hdr) if ((Sort & SORT_MASK) != SORT_THREADS) { mutt_error _("Threading is not enabled."); - return (hdr->virtual); + return hdr->virtual; } for (thread = hdr->thread->parent; thread; thread = thread->parent) { if ((hdr = thread->message) != NULL) { if (VISIBLE (hdr, ctx)) - return (hdr->virtual); + return hdr->virtual; else { mutt_error _("Parent message is not visible in this limited view."); - return (-1); + return -1; } } } mutt_error _("Parent message is not available."); - return (-1); + return -1; } void mutt_set_virtual (CONTEXT * ctx) @@ -1031,7 +1019,7 @@ int _mutt_traverse_thread (CONTEXT * ctx, HEADER * cur, int flag) if ((Sort & SORT_MASK) != SORT_THREADS && !(flag & M_THREAD_GET_HIDDEN)) { mutt_error (_("Threading is not enabled.")); - return (cur->virtual); + return cur->virtual; } final = cur->virtual; @@ -1071,16 +1059,16 @@ int _mutt_traverse_thread (CONTEXT * ctx, HEADER * cur, int flag) if (thread == top && (thread = thread->child) == NULL) { /* return value depends on action requested */ if (flag & (M_THREAD_COLLAPSE | M_THREAD_UNCOLLAPSE)) - return (final); + return final; else if (flag & M_THREAD_UNREAD) - return ((old && new) ? new : (old ? old : new)); + return (old && new) ? new : (old ? old : new); else if (flag & M_THREAD_GET_HIDDEN) - return (num_hidden); + return num_hidden; else if (flag & M_THREAD_NEXT_UNREAD) - return (min_unread); + return min_unread; } - FOREVER { + for (;;) { cur = thread->message; if (cur) { @@ -1147,15 +1135,15 @@ int _mutt_traverse_thread (CONTEXT * ctx, HEADER * cur, int flag) /* return value depends on action requested */ if (flag & (M_THREAD_COLLAPSE | M_THREAD_UNCOLLAPSE)) - return (final); + return final; else if (flag & M_THREAD_UNREAD) - return ((old && new) ? new : (old ? old : new)); + return (old && new) ? new : (old ? old : new); else if (flag & M_THREAD_GET_HIDDEN) - return (num_hidden + 1); + return num_hidden + 1; else if (flag & M_THREAD_NEXT_UNREAD) - return (min_unread); + return min_unread; - return (0); + return 0; #undef CHECK_LIMIT } @@ -1169,7 +1157,7 @@ int mutt_messages_in_thread (CONTEXT * ctx, HEADER * hdr, int flag) int i, rc; if ((Sort & SORT_MASK) != SORT_THREADS || !hdr->thread) - return (1); + return 1; threads[0] = hdr->thread; while (threads[0]->parent) @@ -1194,53 +1182,53 @@ int mutt_messages_in_thread (CONTEXT * ctx, HEADER * hdr, int flag) if (flag) rc += 1; - return (rc); + return rc; } -HASH *mutt_make_id_hash (CONTEXT * ctx) +hash_t *mutt_make_id_hash (CONTEXT * ctx) { int i; HEADER *hdr; - HASH *hash; + hash_t *hash; - hash = hash_create (ctx->msgcount * 2); + hash = hash_new (ctx->msgcount * 2, 0); for (i = 0; i < ctx->msgcount; i++) { hdr = ctx->hdrs[i]; if (hdr->env->message_id) - hash_insert (hash, hdr->env->message_id, hdr, 0); + hash_insert (hash, hdr->env->message_id, hdr); } return hash; } -HASH *mutt_make_subj_hash (CONTEXT * ctx) +hash_t *mutt_make_subj_hash (CONTEXT * ctx) { int i; HEADER *hdr; - HASH *hash; + hash_t *hash; - hash = hash_create (ctx->msgcount * 2); + hash = hash_new (ctx->msgcount * 2, 1); for (i = 0; i < ctx->msgcount; i++) { hdr = ctx->hdrs[i]; if (hdr->env->real_subj) - hash_insert (hash, hdr->env->real_subj, hdr, 1); + hash_insert(hash, hdr->env->real_subj, hdr); } return hash; } -static void clean_references (THREAD * brk, THREAD * cur) +static void clean_references (THREAD * tbrk, THREAD * cur) { THREAD *p; - LIST *ref = NULL; + string_list_t *ref = NULL; int done = 0; for (; cur; cur = cur->next, done = 0) { /* parse subthread recursively */ - clean_references (brk, cur->child); + clean_references (tbrk, cur->child); if (!cur->message) break; /* skip pseudo-message */ @@ -1248,10 +1236,10 @@ static void clean_references (THREAD * brk, THREAD * cur) /* Looking for the first bad reference according to the new threading. * Optimal since Mutt stores the references in reverse order, and the * first loop should match immediatly for mails respecting RFC2822. */ - for (p = brk; !done && p; p = p->parent) + for (p = tbrk; !done && p; p = p->parent) for (ref = cur->message->env->references; p->message && ref; ref = ref->next) - if (!str_casecmp (ref->data, p->message->env->message_id)) { + if (!m_strcasecmp(ref->data, p->message->env->message_id)) { done = 1; break; } @@ -1260,7 +1248,7 @@ static void clean_references (THREAD * brk, THREAD * cur) HEADER *h = cur->message; /* clearing the References: header from obsolete Message-ID(s) */ - mutt_free_list (&ref->next); + string_list_wipe(&ref->next); h->env->refs_changed = h->changed = 1; } @@ -1269,9 +1257,9 @@ static void clean_references (THREAD * brk, THREAD * cur) void mutt_break_thread (HEADER * hdr) { - mutt_free_list (&hdr->env->in_reply_to); - mutt_free_list (&hdr->env->references); - hdr->env->irt_changed = hdr->env->refs_changed = 1; + string_list_wipe(&hdr->env->in_reply_to); + string_list_wipe(&hdr->env->references); + hdr->env->irt_changed = hdr->env->refs_changed = hdr->changed = 1; clean_references (hdr->thread, hdr->thread->child); } @@ -1282,8 +1270,8 @@ static int link_threads (HEADER * parent, HEADER * child, CONTEXT * ctx) mutt_break_thread (child); - child->env->in_reply_to = mutt_new_list (); - child->env->in_reply_to->data = str_dup (parent->env->message_id); + child->env->in_reply_to = string_item_new(); + child->env->in_reply_to->data = m_strdup(parent->env->message_id); mutt_set_flag (ctx, child, M_TAG, 0);