X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sort.c;h=444dc9daf925434911e8c319ebac2a8f41dfadef;hp=e6942ba621e7c8301093e6df93fc4767360aec3a;hb=3d937534e7b1ee723f86594b5e4c64c95158a933;hpb=d7c69d8f0180e24b9ee48088d08090df7b4e27c2 diff --git a/sort.c b/sort.c index e6942ba..444dc9d 100644 --- a/sort.c +++ b/sort.c @@ -177,6 +177,57 @@ int compare_order (const void *a, const void *b) return (SORTCODE ((*ha)->index - (*hb)->index)); } +int compare_spam (const void *a, const void *b) +{ + HEADER **ppa = (HEADER **) a; + HEADER **ppb = (HEADER **) b; + char *aptr, *bptr; + int ahas, bhas; + int result = 0; + + /* Firstly, require spam attributes for both msgs */ + /* to compare. Determine which msgs have one. */ + ahas = (*ppa)->env && (*ppa)->env->spam; + bhas = (*ppb)->env && (*ppb)->env->spam; + + /* If one msg has spam attr but other does not, sort the one with first. */ + if (ahas && !bhas) + return (SORTCODE(1)); + if (!ahas && bhas) + return (SORTCODE(-1)); + + /* Else, if neither has a spam attr, presume equality. Fall back on aux. */ + if (!ahas && !bhas) + { + AUXSORT(result, a, b); + return (SORTCODE(result)); + } + + + /* Both have spam attrs. */ + + /* preliminary numeric examination */ + result = (strtoul((*ppa)->env->spam->data, &aptr, 10) - + strtoul((*ppb)->env->spam->data, &bptr, 10)); + + /* If either aptr or bptr is equal to data, there is no numeric */ + /* value for that spam attribute. In this case, compare lexically. */ + if ((aptr == (*ppa)->env->spam->data) || (bptr == (*ppb)->env->spam->data)) + return (SORTCODE(strcmp(aptr, bptr))); + + /* Otherwise, we have numeric value for both attrs. If these values */ + /* are equal, then we first fall back upon string comparison, then */ + /* upon auxiliary sort. */ + if (result == 0) + { + result = strcmp(aptr, bptr); + if (result == 0) + AUXSORT(result, a, b); + } + + return (SORTCODE(result)); +} + sort_t *mutt_get_sort_func (int method) { switch (method & SORT_MASK) @@ -197,6 +248,8 @@ sort_t *mutt_get_sort_func (int method) return (compare_to); case SORT_SCORE: return (compare_score); + case SORT_SPAM: + return (compare_spam); default: return (NULL); }