X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=sort.c;h=ae2a8e57eb60ce5213f7385321c0eae1fd29e4b8;hp=e6942ba621e7c8301093e6df93fc4767360aec3a;hb=b1dfcb5c755ef8c2be60369432bc91e434b72a1f;hpb=6833ce8bdca2d64e14485118f2a4417b7e1cb1b1 diff --git a/sort.c b/sort.c index e6942ba..ae2a8e5 100644 --- a/sort.c +++ b/sort.c @@ -16,6 +16,10 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include "mutt.h" #include "sort.h" #include "mutt_idna.h" @@ -177,6 +181,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 +252,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); }