From 5ad2319fe166e424a2815566396a63837e1d9e0c Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Sat, 2 Jul 2011 12:50:29 +0300 Subject: [PATCH] * refactor msg-sorting a bit --- src/mu-msg-fields.c | 50 --------------------------------- src/mu-msg-fields.h | 12 -------- src/mu-msg-file.c | 3 +- src/mu-msg.c | 51 ++++++++++++++++++++++++++-------- src/tests/test-mu-msg-fields.c | 2 -- 5 files changed, 42 insertions(+), 76 deletions(-) diff --git a/src/mu-msg-fields.c b/src/mu-msg-fields.c index 42ba0963..5b1f8417 100644 --- a/src/mu-msg-fields.c +++ b/src/mu-msg-fields.c @@ -65,7 +65,6 @@ struct _MuMsgField { const char _shortcut; /* the shortcut for use in * --fields and sorting */ const char _xprefix; /* the Xapian-prefix */ - GCompareDataFunc _cmpfunc; /* sort function */ FieldFlags _flags; /* the flags that tells us * what to do */ @@ -73,9 +72,6 @@ struct _MuMsgField { }; typedef struct _MuMsgField MuMsgField; -static int cmp_num (int a, int b); -static int cmp_str (const char* s1, const char* s2); - /* the name and shortcut fields must be lower case, or they might be * misinterpreted by the query-preprocesser which turns queries into * lowercase */ @@ -84,7 +80,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_ATTACH, MU_MSG_FIELD_TYPE_STRING, "attach" , 'a', 'A', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_NORMALIZE | FLAG_DONT_CACHE }, @@ -93,7 +88,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_BCC, MU_MSG_FIELD_TYPE_STRING, "bcc" , 'h', 'H', /* 'hidden */ - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE }, @@ -102,7 +96,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_BODY_TEXT, MU_MSG_FIELD_TYPE_STRING, "body", 'b', 'B', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE | FLAG_DONT_CACHE }, @@ -111,7 +104,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_BODY_HTML, MU_MSG_FIELD_TYPE_STRING, "bodyhtml", 'h', 0, - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_DONT_CACHE }, @@ -119,7 +111,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_CC, MU_MSG_FIELD_TYPE_STRING, "cc", 'c', 'C', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE }, @@ -127,7 +118,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_DATE, MU_MSG_FIELD_TYPE_TIME_T, "date", 'd', 'D', - (GCompareDataFunc)cmp_num, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY }, @@ -136,7 +126,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_FLAGS, MU_MSG_FIELD_TYPE_INT, "flag", 'g', 'G', /* flaGs */ - (GCompareDataFunc)cmp_num, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_PREFIX_ONLY }, @@ -145,7 +134,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_FROM, MU_MSG_FIELD_TYPE_STRING, "from", 'f', 'F', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE }, @@ -153,7 +141,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_PATH, MU_MSG_FIELD_TYPE_STRING, "path", 'l', 'L', /* 'l' for location */ - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY }, @@ -162,7 +149,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_MAILDIR, MU_MSG_FIELD_TYPE_STRING, "maildir", 'm', 'M', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY @@ -172,7 +158,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_PRIO, MU_MSG_FIELD_TYPE_INT, "prio", 'p', 'P', - (GCompareDataFunc)cmp_num, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_PREFIX_ONLY }, @@ -181,7 +166,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_SIZE, MU_MSG_FIELD_TYPE_BYTESIZE, "size", 'z', 'Z', /* siZe */ - (GCompareDataFunc)cmp_num, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_PREFIX_ONLY }, @@ -190,7 +174,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_SUBJECT, MU_MSG_FIELD_TYPE_STRING, "subject", 's', 'S', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE | FLAG_NORMALIZE }, @@ -199,7 +182,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_TO, MU_MSG_FIELD_TYPE_STRING, "to", 't', 'T', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE }, @@ -207,7 +189,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_MSGID, MU_MSG_FIELD_TYPE_STRING, "msgid", 'i', 'I', /* 'i' for Id */ - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_PREFIX_ONLY }, @@ -216,7 +197,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_TIMESTAMP, MU_MSG_FIELD_TYPE_TIME_T, "timestamp", 0, 0, - (GCompareDataFunc)cmp_num, FLAG_GMIME }, @@ -224,7 +204,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_REFS, MU_MSG_FIELD_TYPE_STRING_LIST, NULL, 'r', 'R', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_PREFIX_ONLY }, @@ -233,7 +212,6 @@ static const MuMsgField FIELD_DATA[] = { MU_MSG_FIELD_ID_TAGS, MU_MSG_FIELD_TYPE_STRING_LIST, "tag", 'x', 'X', - (GCompareDataFunc)cmp_str, FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_XAPIAN_PREFIX_ONLY } @@ -402,14 +380,6 @@ mu_msg_field_name (MuMsgFieldId id) } -GCompareDataFunc -mu_msg_field_cmp_func (MuMsgFieldId id) -{ - g_return_val_if_fail (mu_msg_field_id_is_valid(id),NULL); - return mu_msg_field(id)->_cmpfunc; -} - - char mu_msg_field_shortcut (MuMsgFieldId id) { @@ -436,23 +406,3 @@ mu_msg_field_type (MuMsgFieldId id) return mu_msg_field(id)->_type; } -static int -cmp_num (int a, int b) -{ - return a - b; -} - - -static int -cmp_str (const char* s1, const char *s2) -{ - if (s1 == s2) - return 0; - else if (!s1) - return -1; - else if (!s2) - return 1; - - return g_utf8_collate (s1, s2); -} - diff --git a/src/mu-msg-fields.h b/src/mu-msg-fields.h index 641b55f5..31d78631 100644 --- a/src/mu-msg-fields.h +++ b/src/mu-msg-fields.h @@ -259,18 +259,6 @@ gboolean mu_msg_field_xapian_escape (MuMsgFieldId id) G_GNUC_PURE; gboolean mu_msg_field_normalize (MuMsgFieldId id) G_GNUC_PURE; - -/** - * get the comparison function for this field, ie. the one that can be - * use for sorting them - * - * @param field a MuMsgField - * - * @return the comparison function (or NULL in case of error ) - */ -GCompareDataFunc mu_msg_field_cmp_func (MuMsgFieldId id) G_GNUC_PURE; - - /** * should this field be stored as contact information? This means that * e-mail address will be stored as terms, and names will be indexed diff --git a/src/mu-msg-file.c b/src/mu-msg-file.c index 7b406313..19d7d4de 100644 --- a/src/mu-msg-file.c +++ b/src/mu-msg-file.c @@ -720,7 +720,8 @@ get_tags (MuMsgFile *self) char* -mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, gboolean *do_free) +mu_msg_file_get_str_field (MuMsgFile *self, MuMsgFieldId mfid, + gboolean *do_free) { g_return_val_if_fail (self, NULL); g_return_val_if_fail (mu_msg_field_is_string(mfid), NULL); diff --git a/src/mu-msg.c b/src/mu-msg.c index 1628f6a9..67e7a66e 100644 --- a/src/mu-msg.c +++ b/src/mu-msg.c @@ -598,25 +598,54 @@ mu_msg_contact_foreach (MuMsg *msg, MuMsgContactForeachFunc func, } +static int +cmp_str (const char* s1, const char *s2) +{ + if (s1 == s2) + return 0; + else if (!s1) + return -1; + else if (!s2) + return 1; + + return g_utf8_collate (s1, s2); +} + + +static int +cmp_subject (const char* s1, const char *s2) +{ + if (s1 == s2) + return 0; + else if (!s1) + return -1; + else if (!s2) + return 1; + + return g_utf8_collate ( + mu_str_subject_normalize (s1), + mu_str_subject_normalize (s2)); +} + + int mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) { - GCompareDataFunc func; - g_return_val_if_fail (m1, 0); g_return_val_if_fail (m2, 0); g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), 0); - func = mu_msg_field_cmp_func (mfid); - + if (mfid == MU_MSG_FIELD_ID_SUBJECT) + return cmp_subject (get_str_field (m1, mfid), + get_str_field (m2, mfid)); + if (mu_msg_field_is_string (mfid)) - return func (get_str_field (m1, mfid), - get_str_field (m2, mfid), NULL); - /* TODO: special-case 64-bit nums */ - else if (mu_msg_field_is_numeric (mfid)) - return func (GUINT_TO_POINTER((guint)get_num_field(m1, mfid)), - GUINT_TO_POINTER((guint)get_num_field(m2, mfid)), - NULL); + return cmp_str (get_str_field (m1, mfid), + get_str_field (m2, mfid)); + + /* TODO: note, we cast (potentially > MAXINT to int) */ + if (mu_msg_field_is_numeric (mfid)) + return get_num_field(m1, mfid) - get_num_field(m2, mfid); return 0; /* TODO: handle lists */ } diff --git a/src/tests/test-mu-msg-fields.c b/src/tests/test-mu-msg-fields.c index ab9fd673..29f7e0b6 100644 --- a/src/tests/test-mu-msg-fields.c +++ b/src/tests/test-mu-msg-fields.c @@ -122,8 +122,6 @@ main (int argc, char *argv[]) g_test_add_func ("/mu-msg-fields/mu-msg-field-flags", test_mu_msg_field_flags); - - /* FIXME: add tests for mu_msg_str_flags; but note the * function simply calls mu_msg_field_str */