X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=thread.c;h=36ed25e229088736f0ce3481ae1d64c6ee73d65f;hp=814e00e9972b8fd3c8a79657f2fd252cb3e54568;hb=ce31869e540c4f27d4a398482a44856f314883da;hpb=0f44dc85fc1280372ffab911d701e703d803fb4b diff --git a/thread.c b/thread.c index 814e00e..36ed25e 100644 --- a/thread.c +++ b/thread.c @@ -13,6 +13,7 @@ #include "mutt.h" #include "sort.h" +#include "thread.h" #include "lib/mem.h" #include "lib/intl.h" @@ -128,7 +129,7 @@ static void calculate_visibility (CONTEXT * ctx, int *max_depth) tree->subtree_visible = 0; if (tree->message) { - FREE (&tree->message->tree); + mem_free (&tree->message->tree); if (VISIBLE (tree->message, ctx)) { tree->deep = 1; tree->visible = 1; @@ -220,8 +221,8 @@ void mutt_draw_tree (CONTEXT * ctx) * From now on we can simply ignore invisible subtrees */ calculate_visibility (ctx, &max_depth); - pfx = safe_malloc (width * max_depth + 2); - arrow = safe_malloc (width * max_depth + 2); + pfx = mem_malloc (width * max_depth + 2); + arrow = mem_malloc (width * max_depth + 2); while (tree) { if (depth) { myarrow = arrow + (depth - start_depth - (start_depth ? 0 : 1)) * width; @@ -239,7 +240,7 @@ void mutt_draw_tree (CONTEXT * ctx) if (tree->visible) { myarrow[width] = M_TREE_RARROW; myarrow[width + 1] = 0; - new_tree = safe_malloc ((2 + depth * width)); + new_tree = mem_malloc ((2 + depth * width)); if (start_depth > 1) { strncpy (new_tree, pfx, (start_depth - 1) * width); strfcpy (new_tree + (start_depth - 1) * width, @@ -306,8 +307,8 @@ void mutt_draw_tree (CONTEXT * ctx) while (!tree->deep); } - FREE (&pfx); - FREE (&arrow); + mem_free (&pfx); + mem_free (&arrow); } /* since we may be trying to attach as a pseudo-thread a THREAD that @@ -338,12 +339,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 = safe_strcmp (env->real_subj, curlist->data); + rc = str_cmp (env->real_subj, curlist->data); if (rc >= 0) break; } if (!curlist || rc > 0) { - newlist = safe_calloc (1, sizeof (LIST)); + newlist = mem_calloc (1, sizeof (LIST)); newlist->data = env->real_subj; if (oldlist) { newlist->next = oldlist->next; @@ -398,13 +399,13 @@ 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 && - safe_strcmp (subjects->data, tmp->message->env->real_subj) == 0) + str_cmp (subjects->data, tmp->message->env->real_subj) == 0) last = tmp; /* best match so far */ } oldlist = subjects; subjects = subjects->next; - FREE (&oldlist); + mem_free (&oldlist); } return (last); } @@ -471,7 +472,7 @@ static void pseudo_threads (CONTEXT * ctx) * parent, since otherwise they rightly belong to the message * we're attaching. */ if (tmp == cur - || !safe_strcmp (tmp->message->env->real_subj, + || !str_cmp (tmp->message->env->real_subj, parent->message->env->real_subj)) { tmp->message->subject_changed = 0; @@ -512,7 +513,7 @@ void mutt_clear_threads (CONTEXT * ctx) hash_destroy (&ctx->thread_hash, free); } -int compare_threads (const void *a, const void *b) +static int compare_threads (const void *a, const void *b) { static sort_t *sort_func = NULL; @@ -546,7 +547,7 @@ THREAD *mutt_sort_subthreads (THREAD * thread, int init) top = thread; - array = safe_calloc ((array_size = 256), sizeof (THREAD *)); + array = mem_calloc ((array_size = 256), sizeof (THREAD *)); while (1) { if (init || !thread->sort_key) { thread->sort_key = NULL; @@ -578,7 +579,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) - safe_realloc (&array, (array_size *= 2) * sizeof (THREAD *)); + mem_realloc (&array, (array_size *= 2) * sizeof (THREAD *)); array[i] = thread; } @@ -638,7 +639,7 @@ THREAD *mutt_sort_subthreads (THREAD * thread, int init) } else { Sort ^= SORT_REVERSE; - FREE (&array); + mem_free (&array); return (top); } } @@ -669,7 +670,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 = safe_strcmp (cur->env->real_subj, + cur->subject_changed = str_cmp (cur->env->real_subj, tmp->message->env-> real_subj) ? 1 : 0; else @@ -755,7 +756,7 @@ void mutt_sort_threads (CONTEXT * ctx, int init) else { new = (option (OPTDUPTHREADS) ? thread : NULL); - thread = safe_calloc (1, sizeof (THREAD)); + thread = mem_calloc (1, sizeof (THREAD)); thread->message = cur; thread->check_subject = 1; cur->thread = thread; @@ -821,7 +822,7 @@ void mutt_sort_threads (CONTEXT * ctx, int init) if (!cur->env->references) ref = ref->next; else { - if (safe_strcmp (ref->data, cur->env->references->data)) + if (str_cmp (ref->data, cur->env->references->data)) ref = cur->env->references; else ref = cur->env->references->next; @@ -836,14 +837,14 @@ void mutt_sort_threads (CONTEXT * ctx, int init) break; if ((new = hash_find (ctx->thread_hash, ref->data)) == NULL) { - new = safe_calloc (1, sizeof (THREAD)); + new = mem_calloc (1, sizeof (THREAD)); hash_insert (ctx->thread_hash, ref->data, new, 1); } else { if (new->duplicate_thread) new = new->parent; if (is_descendant (new, thread)) /* no loops! */ - break; + continue; } if (thread->parent) @@ -1250,7 +1251,7 @@ static void clean_references (THREAD * brk, THREAD * cur) for (p = brk; !done && p; p = p->parent) for (ref = cur->message->env->references; p->message && ref; ref = ref->next) - if (!safe_strcasecmp (ref->data, p->message->env->message_id)) { + if (!str_casecmp (ref->data, p->message->env->message_id)) { done = 1; break; } @@ -1258,17 +1259,10 @@ static void clean_references (THREAD * brk, THREAD * cur) if (done) { HEADER *h = cur->message; - /* clearing the References: header from obsolete Message-Id(s) */ + /* clearing the References: header from obsolete Message-ID(s) */ mutt_free_list (&ref->next); - if (h->new_env) - mutt_free_list (&h->new_env->references); - else - h->new_env = mutt_new_envelope (); - - h->new_env->references = mutt_copy_list (h->env->references); - - h->refs_changed = h->changed = 1; + h->env->refs_changed = h->changed = 1; } } } @@ -1277,15 +1271,7 @@ void mutt_break_thread (HEADER * hdr) { mutt_free_list (&hdr->env->in_reply_to); mutt_free_list (&hdr->env->references); - hdr->irt_changed = hdr->refs_changed = hdr->changed = 1; - - if (hdr->new_env) { - mutt_free_list (&hdr->new_env->in_reply_to); - mutt_free_list (&hdr->new_env->references); - } - else - hdr->new_env = mutt_new_envelope (); - + hdr->env->irt_changed = hdr->env->refs_changed = 1; clean_references (hdr->thread, hdr->thread->child); } @@ -1297,14 +1283,11 @@ 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 = safe_strdup (parent->env->message_id); - - child->new_env->in_reply_to = mutt_new_list (); - child->new_env->in_reply_to->data = safe_strdup (parent->env->message_id); + child->env->in_reply_to->data = str_dup (parent->env->message_id); mutt_set_flag (ctx, child, M_TAG, 0); - child->irt_changed = child->changed = 1; + child->env->irt_changed = child->changed = 1; return 1; } @@ -1322,3 +1305,24 @@ int mutt_link_threads (HEADER * cur, HEADER * last, CONTEXT * ctx) return changed; } + +void mutt_adjust_subject (ENVELOPE* e) { + regmatch_t pmatch[1]; + + if (e && e->subject) { + if (regexec (ReplyRegexp.rx, e->subject, 1, pmatch, 0) == 0) + e->real_subj = e->subject + pmatch[0].rm_eo; + else + e->real_subj = e->subject; + } +} + +void mutt_adjust_all_subjects (void) { + int i = 0; + + if (!Context || !Context->msgcount) + return; + + for (i = 0; i < Context->msgcount; i++) + mutt_adjust_subject (Context->hdrs[i]->env); +}