* refactor msg-sorting a bit

This commit is contained in:
Dirk-Jan C. Binnema
2011-07-02 12:50:29 +03:00
parent 58fdfa9bc1
commit 5ad2319fe1
5 changed files with 42 additions and 76 deletions

View File

@ -65,7 +65,6 @@ struct _MuMsgField {
const char _shortcut; /* the shortcut for use in const char _shortcut; /* the shortcut for use in
* --fields and sorting */ * --fields and sorting */
const char _xprefix; /* the Xapian-prefix */ const char _xprefix; /* the Xapian-prefix */
GCompareDataFunc _cmpfunc; /* sort function */
FieldFlags _flags; /* the flags that tells us FieldFlags _flags; /* the flags that tells us
* what to do */ * what to do */
@ -73,9 +72,6 @@ struct _MuMsgField {
}; };
typedef struct _MuMsgField 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 /* the name and shortcut fields must be lower case, or they might be
* misinterpreted by the query-preprocesser which turns queries into * misinterpreted by the query-preprocesser which turns queries into
* lowercase */ * lowercase */
@ -84,7 +80,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_ATTACH, MU_MSG_FIELD_ID_ATTACH,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"attach" , 'a', 'A', "attach" , 'a', 'A',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_NORMALIZE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_NORMALIZE |
FLAG_DONT_CACHE FLAG_DONT_CACHE
}, },
@ -93,7 +88,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_BCC, MU_MSG_FIELD_ID_BCC,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"bcc" , 'h', 'H', /* 'hidden */ "bcc" , 'h', 'H', /* 'hidden */
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_GMIME | FLAG_XAPIAN_CONTACT |
FLAG_XAPIAN_VALUE FLAG_XAPIAN_VALUE
}, },
@ -102,7 +96,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_BODY_TEXT, MU_MSG_FIELD_ID_BODY_TEXT,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"body", 'b', 'B', "body", 'b', 'B',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE | FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_NORMALIZE |
FLAG_DONT_CACHE FLAG_DONT_CACHE
}, },
@ -111,7 +104,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_BODY_HTML, MU_MSG_FIELD_ID_BODY_HTML,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"bodyhtml", 'h', 0, "bodyhtml", 'h', 0,
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_DONT_CACHE FLAG_GMIME | FLAG_DONT_CACHE
}, },
@ -119,7 +111,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_CC, MU_MSG_FIELD_ID_CC,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"cc", 'c', 'C', "cc", 'c', 'C',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE 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_ID_DATE,
MU_MSG_FIELD_TYPE_TIME_T, MU_MSG_FIELD_TYPE_TIME_T,
"date", 'd', 'D', "date", 'd', 'D',
(GCompareDataFunc)cmp_num,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -136,7 +126,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_FLAGS, MU_MSG_FIELD_ID_FLAGS,
MU_MSG_FIELD_TYPE_INT, MU_MSG_FIELD_TYPE_INT,
"flag", 'g', 'G', /* flaGs */ "flag", 'g', 'G', /* flaGs */
(GCompareDataFunc)cmp_num,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -145,7 +134,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_FROM, MU_MSG_FIELD_ID_FROM,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"from", 'f', 'F', "from", 'f', 'F',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE 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_ID_PATH,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"path", 'l', 'L', /* 'l' for location */ "path", 'l', 'L', /* 'l' for location */
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -162,7 +149,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_MAILDIR, MU_MSG_FIELD_ID_MAILDIR,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"maildir", 'm', 'M', "maildir", 'm', 'M',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE | FLAG_NORMALIZE | FLAG_XAPIAN_ESCAPE |
FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_BOOLEAN | FLAG_XAPIAN_PREFIX_ONLY
@ -172,7 +158,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_PRIO, MU_MSG_FIELD_ID_PRIO,
MU_MSG_FIELD_TYPE_INT, MU_MSG_FIELD_TYPE_INT,
"prio", 'p', 'P', "prio", 'p', 'P',
(GCompareDataFunc)cmp_num,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -181,7 +166,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_SIZE, MU_MSG_FIELD_ID_SIZE,
MU_MSG_FIELD_TYPE_BYTESIZE, MU_MSG_FIELD_TYPE_BYTESIZE,
"size", 'z', 'Z', /* siZe */ "size", 'z', 'Z', /* siZe */
(GCompareDataFunc)cmp_num,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -190,7 +174,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_SUBJECT, MU_MSG_FIELD_ID_SUBJECT,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"subject", 's', 'S', "subject", 's', 'S',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_INDEX | FLAG_XAPIAN_VALUE |
FLAG_NORMALIZE FLAG_NORMALIZE
}, },
@ -199,7 +182,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_TO, MU_MSG_FIELD_ID_TO,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"to", 't', 'T', "to", 't', 'T',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_CONTACT | FLAG_XAPIAN_VALUE 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_ID_MSGID,
MU_MSG_FIELD_TYPE_STRING, MU_MSG_FIELD_TYPE_STRING,
"msgid", 'i', 'I', /* 'i' for Id */ "msgid", 'i', 'I', /* 'i' for Id */
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_ESCAPE | FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -216,7 +197,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_TIMESTAMP, MU_MSG_FIELD_ID_TIMESTAMP,
MU_MSG_FIELD_TYPE_TIME_T, MU_MSG_FIELD_TYPE_TIME_T,
"timestamp", 0, 0, "timestamp", 0, 0,
(GCompareDataFunc)cmp_num,
FLAG_GMIME FLAG_GMIME
}, },
@ -224,7 +204,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_REFS, MU_MSG_FIELD_ID_REFS,
MU_MSG_FIELD_TYPE_STRING_LIST, MU_MSG_FIELD_TYPE_STRING_LIST,
NULL, 'r', 'R', NULL, 'r', 'R',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_PREFIX_ONLY FLAG_XAPIAN_PREFIX_ONLY
}, },
@ -233,7 +212,6 @@ static const MuMsgField FIELD_DATA[] = {
MU_MSG_FIELD_ID_TAGS, MU_MSG_FIELD_ID_TAGS,
MU_MSG_FIELD_TYPE_STRING_LIST, MU_MSG_FIELD_TYPE_STRING_LIST,
"tag", 'x', 'X', "tag", 'x', 'X',
(GCompareDataFunc)cmp_str,
FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE | FLAG_GMIME | FLAG_XAPIAN_TERM | FLAG_XAPIAN_VALUE |
FLAG_XAPIAN_PREFIX_ONLY 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 char
mu_msg_field_shortcut (MuMsgFieldId id) mu_msg_field_shortcut (MuMsgFieldId id)
{ {
@ -436,23 +406,3 @@ mu_msg_field_type (MuMsgFieldId id)
return mu_msg_field(id)->_type; 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);
}

View File

@ -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; 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 * should this field be stored as contact information? This means that
* e-mail address will be stored as terms, and names will be indexed * e-mail address will be stored as terms, and names will be indexed

View File

@ -720,7 +720,8 @@ get_tags (MuMsgFile *self)
char* 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 (self, NULL);
g_return_val_if_fail (mu_msg_field_is_string(mfid), NULL); g_return_val_if_fail (mu_msg_field_is_string(mfid), NULL);

View File

@ -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 int
mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid) mu_msg_cmp (MuMsg *m1, MuMsg *m2, MuMsgFieldId mfid)
{ {
GCompareDataFunc func;
g_return_val_if_fail (m1, 0); g_return_val_if_fail (m1, 0);
g_return_val_if_fail (m2, 0); g_return_val_if_fail (m2, 0);
g_return_val_if_fail (mu_msg_field_id_is_valid(mfid), 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)) if (mu_msg_field_is_string (mfid))
return func (get_str_field (m1, mfid), return cmp_str (get_str_field (m1, mfid),
get_str_field (m2, mfid), NULL); get_str_field (m2, mfid));
/* TODO: special-case 64-bit nums */
else if (mu_msg_field_is_numeric (mfid)) /* TODO: note, we cast (potentially > MAXINT to int) */
return func (GUINT_TO_POINTER((guint)get_num_field(m1, mfid)), if (mu_msg_field_is_numeric (mfid))
GUINT_TO_POINTER((guint)get_num_field(m2, mfid)), return get_num_field(m1, mfid) - get_num_field(m2, mfid);
NULL);
return 0; /* TODO: handle lists */ return 0; /* TODO: handle lists */
} }

View File

@ -122,8 +122,6 @@ main (int argc, char *argv[])
g_test_add_func ("/mu-msg-fields/mu-msg-field-flags", g_test_add_func ("/mu-msg-fields/mu-msg-field-flags",
test_mu_msg_field_flags); test_mu_msg_field_flags);
/* FIXME: add tests for mu_msg_str_flags; but note the /* FIXME: add tests for mu_msg_str_flags; but note the
* function simply calls mu_msg_field_str */ * function simply calls mu_msg_field_str */