sync with 0.8.11cvs2
[claws.git] / src / common / utils.c
index 0d49ca6f520a7044f936447962fb8b22d156f900..ce69f9b28ff490eecb028aafa4862443fed43413 100644 (file)
@@ -506,15 +506,33 @@ gint subject_compare(const gchar *s1, const gchar *s2)
        Xstrdup_a(str1, s1, return -1);
        Xstrdup_a(str2, s2, return -1);
 
-       trim_subject(str1);
-       trim_subject(str2);
+       trim_subject_for_compare(str1);
+       trim_subject_for_compare(str2);
 
        if (!*str1 || !*str2) return -1;
 
        return strcmp(str1, str2);
 }
 
-void trim_subject(gchar *str)
+gint subject_compare_for_sort(const gchar *s1, const gchar *s2)
+{
+       gchar *str1, *str2;
+
+       if (!s1 || !s2) return -1;
+       if (!*s1 || !*s2) return -1;
+
+       Xstrdup_a(str1, s1, return -1);
+       Xstrdup_a(str2, s2, return -1);
+
+       trim_subject_for_sort(str1);
+       trim_subject_for_sort(str2);
+
+       if (!*str1 || !*str2) return -1;
+
+       return strcasecmp(str1, str2);
+}
+
+void trim_subject_for_compare(gchar *str)
 {
        gchar *srcp;
 
@@ -529,6 +547,55 @@ void trim_subject(gchar *str)
        }
 }
 
+void trim_subject_for_sort(gchar *str)
+{
+       gchar *srcp;
+
+       g_strstrip(str);
+
+       while (!strncasecmp(str, "Re:", 3)) {
+               srcp = str + 3;
+               while (isspace(*srcp)) srcp++;
+               memmove(str, srcp, strlen(srcp) + 1);
+       }
+}
+
+void trim_subject(gchar *str)
+{
+       register gchar *srcp, *destp;
+       gchar op, cl;
+       gint in_brace;
+
+       destp = str;
+       while (!strncasecmp(destp, "Re:", 3)) {
+               destp += 3;
+               while (isspace(*destp)) destp++;
+       }
+
+       if (*destp == '[') {
+               op = '[';
+               cl = ']';
+       } else if (*destp == '(') {
+               op = '(';
+               cl = ')';
+       } else
+               return;
+
+       srcp = destp + 1;
+       in_brace = 1;
+       while (*srcp) {
+               if (*srcp == op)
+                       in_brace++;
+               else if (*srcp == cl)
+                       in_brace--;
+               srcp++;
+               if (in_brace == 0)
+                       break;
+       }
+       while (isspace(*srcp)) srcp++;
+       memmove(destp, srcp, strlen(srcp) + 1);
+}
+
 void eliminate_parenthesis(gchar *str, gchar op, gchar cl)
 {
        register gchar *srcp, *destp;