commit b35c72da7e3a73d031cdf4200eadc3145436336b
Author: Christophe Fergeau <t...@gnome.org>
Date:   Thu Jul 7 22:21:48 2011 +0200

    make smart playlist string comparisons case-insensitive
    
    Bring behaviour in line with iTunes by making
    smart playlist string comparisons case-insensitive. Based on a patch
    from James Burton <burtonjam...@googlemail.com>.

 src/itdb_playlist.c |   62 +++++++++++++++++++++++++++++---------------------
 1 files changed, 36 insertions(+), 26 deletions(-)
---
diff --git a/src/itdb_playlist.c b/src/itdb_playlist.c
index fbb4aac..33ae6c8 100644
--- a/src/itdb_playlist.c
+++ b/src/itdb_playlist.c
@@ -382,35 +382,35 @@ gboolean itdb_splr_eval (Itdb_SPLRule *splr, Itdb_Track 
*track)
     switch (splr->field)
     {
     case ITDB_SPLFIELD_SONG_NAME:
-       strcomp = track->title;
+       strcomp = g_utf8_casefold(track->title, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_ALBUM:
-       strcomp = track->album;
+       strcomp = g_utf8_casefold(track->album, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_ARTIST:
-       strcomp = track->artist;
+       strcomp = g_utf8_casefold(track->artist, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_GENRE:
-       strcomp = track->genre;
+       strcomp = g_utf8_casefold(track->genre, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_KIND:
-       strcomp = track->filetype;
+       strcomp = g_utf8_casefold(track->filetype, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_COMMENT:
-       strcomp = track->comment;
+       strcomp = g_utf8_casefold(track->comment, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_COMPOSER:
-       strcomp = track->composer;
+       strcomp = g_utf8_casefold(track->composer, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_GROUPING:
-       strcomp = track->grouping;
+       strcomp = g_utf8_casefold(track->grouping, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_BITRATE:
@@ -474,11 +474,11 @@ gboolean itdb_splr_eval (Itdb_SPLRule *splr, Itdb_Track 
*track)
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_ALBUMARTIST:
-       strcomp = track->albumartist;
+       strcomp = g_utf8_casefold(track->albumartist, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_TVSHOW:
-       strcomp = track->tvshow;
+       strcomp = g_utf8_casefold(track->tvshow, -1);
        handled = TRUE;
        break;
     case ITDB_SPLFIELD_LAST_SKIPPED:
@@ -509,33 +509,43 @@ gboolean itdb_splr_eval (Itdb_SPLRule *splr, Itdb_Track 
*track)
     case ITDB_SPLFT_STRING:
        if(strcomp && splr->string)
        {
-           gint len1 = strlen (strcomp);
-           gint len2 = strlen (splr->string);
+           gchar *casefolded_str;
+           gboolean cmp_result;
+
+           casefolded_str = g_utf8_casefold(splr->string, -1);
+           cmp_result = FALSE;
            switch (splr->action)
            {
            case ITDB_SPLACTION_IS_STRING:
-               return (strcmp (strcomp, splr->string) == 0);
+               cmp_result = (strcmp (strcomp, casefolded_str) == 0);
+               break;
            case ITDB_SPLACTION_IS_NOT:
-               return (strcmp (strcomp, splr->string) != 0);
+               cmp_result = (strcmp (strcomp, casefolded_str) != 0);
+               break;
            case ITDB_SPLACTION_CONTAINS:
-               return (strstr (strcomp, splr->string) != NULL);
+               cmp_result = (strstr (strcomp, casefolded_str) != NULL);
+               break;
            case ITDB_SPLACTION_DOES_NOT_CONTAIN:
-               return (strstr (strcomp, splr->string) == NULL);
+               cmp_result = (strstr (strcomp, casefolded_str) == NULL);
+               break;
            case ITDB_SPLACTION_STARTS_WITH:
-               return (strncmp (strcomp, splr->string, len2) == 0);
+               cmp_result = g_str_has_prefix(strcomp, casefolded_str);
+               break;
            case ITDB_SPLACTION_ENDS_WITH:
-           if (len2 > len1)  return FALSE;
-           return (strncmp (strcomp+len1-len2,
-                            splr->string, len2) == 0);
+               cmp_result = g_str_has_suffix(strcomp, casefolded_str);
+               break;
            case ITDB_SPLACTION_DOES_NOT_START_WITH:
-               return (strncmp (strcomp, splr->string,
-                                strlen (splr->string)) != 0);
+               cmp_result = !g_str_has_prefix(strcomp, casefolded_str);
+               break;
            case ITDB_SPLACTION_DOES_NOT_END_WITH:
-               if (len2 > len1)  return TRUE;
-               return (strncmp (strcomp+len1-len2,
-                                splr->string, len2) != 0);
-           };
+               cmp_result = !g_str_has_suffix(strcomp, casefolded_str);
+               break;
+           }
+           g_free(casefolded_str);
+           g_free(strcomp);
+           return cmp_result;
        }
+       g_free(strcomp);
        return FALSE;
     case ITDB_SPLFT_INT:
        switch(splr->action)

------------------------------------------------------------------------------
Storage Efficiency Calculator
This modeling tool is based on patent-pending intellectual property that
has been used successfully in hundreds of IBM storage optimization engage-
ments, worldwide.  Store less, Store more with what you own, Move data to 
the right place. Try It Now! http://www.accelacomm.com/jaw/sfnl/114/51427378/
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to