diff options
author | J. Alexander Treuman <jat@spatialrift.net> | 2007-02-24 00:54:54 +0000 |
---|---|---|
committer | J. Alexander Treuman <jat@spatialrift.net> | 2007-02-24 00:54:54 +0000 |
commit | 1ae3bdb7e6d5a5c4135f6046be9259d6f716498a (patch) | |
tree | b8e70764ebecf56536c683f98ab3e13a140f60cd /src/dbUtils.c | |
parent | d7e20861d490cf0743f740cec3506fd3aca3d34b (diff) |
Moving a bunch of the LocateTagItem code to locate.[ch] so that it can
later be used for playlist searching.
git-svn-id: https://svn.musicpd.org/mpd/trunk@5419 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/dbUtils.c')
-rw-r--r-- | src/dbUtils.c | 194 |
1 files changed, 7 insertions, 187 deletions
diff --git a/src/dbUtils.c b/src/dbUtils.c index 86fb3571e..7a1c0e54d 100644 --- a/src/dbUtils.c +++ b/src/dbUtils.c @@ -27,10 +27,6 @@ #include "tagTracker.h" #include "log.h" -#define LOCATE_TAG_FILE_KEY SONG_FILE -#define LOCATE_TAG_FILE_KEY_OLD "filename" -#define LOCATE_TAG_ANY_KEY "any" - typedef struct _ListCommandItem { mpd_sint8 tagType; int numConditionals; @@ -42,102 +38,6 @@ typedef struct _LocateTagItemArray { LocateTagItem *items; } LocateTagItemArray; -int getLocateTagItemType(char *str) -{ - int i; - - if (0 == strcasecmp(str, LOCATE_TAG_FILE_KEY) || - 0 == strcasecmp(str, LOCATE_TAG_FILE_KEY_OLD)) - { - return LOCATE_TAG_FILE_TYPE; - } - - if (0 == strcasecmp(str, LOCATE_TAG_ANY_KEY)) - { - return LOCATE_TAG_ANY_TYPE; - } - - for (i = 0; i < TAG_NUM_OF_ITEM_TYPES; i++) - { - if (0 == strcasecmp(str, mpdTagItemKeys[i])) - return i; - } - - return -1; -} - -static int initLocateTagItem(LocateTagItem * item, char *typeStr, char *needle) -{ - item->tagType = getLocateTagItemType(typeStr); - - if (item->tagType < 0) - return -1; - - item->needle = xstrdup(needle); - - return 0; -} - -LocateTagItem *newLocateTagItem(char *typeStr, char *needle) -{ - LocateTagItem *ret = xmalloc(sizeof(LocateTagItem)); - - if (initLocateTagItem(ret, typeStr, needle) < 0) { - free(ret); - ret = NULL; - } - - return ret; -} - -void freeLocateTagItemArray(int count, LocateTagItem * array) -{ - int i; - - for (i = 0; i < count; i++) - free(array[i].needle); - - free(array); -} - -int newLocateTagItemArrayFromArgArray(char *argArray[], - int numArgs, LocateTagItem ** arrayRet) -{ - int i, j; - LocateTagItem *item; - - if (numArgs == 0) - return 0; - - if (numArgs % 2 != 0) - return -1; - - *arrayRet = xmalloc(sizeof(LocateTagItem) * numArgs / 2); - - for (i = 0, item = *arrayRet; i < numArgs / 2; i++, item++) { - if (initLocateTagItem - (item, argArray[i * 2], argArray[i * 2 + 1]) < 0) - goto fail; - } - - return numArgs / 2; - -fail: - for (j = 0; j < i; j++) { - free((*arrayRet)[j].needle); - } - - free(*arrayRet); - *arrayRet = NULL; - return -1; -} - -void freeLocateTagItem(LocateTagItem * item) -{ - free(item->needle); - free(item); -} - static int countSongsInDirectory(int fd, Directory * directory, void *data) { int *count = (int *)data; @@ -162,53 +62,12 @@ static int printSongInDirectory(int fd, Song * song, void *data) return 0; } -static int strstrSearchTag(Song * song, int type, char *str) -{ - int i; - char *dup; - int ret = 0; - - if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) { - dup = strDupToUpper(getSongUrl(song)); - if (strstr(dup, str)) - ret = 1; - free(dup); - if (ret == 1 || type == LOCATE_TAG_FILE_TYPE) { - return ret; - } - } - - if (!song->tag) - return 0; - - for (i = 0; i < song->tag->numOfItems && !ret; i++) { - if (type != LOCATE_TAG_ANY_TYPE && - song->tag->items[i].type != type) { - continue; - } - - dup = strDupToUpper(song->tag->items[i].value); - if (strstr(dup, str)) - ret = 1; - free(dup); - } - - return ret; -} - static int searchInDirectory(int fd, Song * song, void *data) { LocateTagItemArray *array = data; - int i; - - for (i = 0; i < array->numItems; i++) { - if (!strstrSearchTag(song, array->items[i].tagType, - array->items[i].needle)) { - return 0; - } - } - printSongInfo(fd, song); + if (strstrSearchTags(song, array->numItems, array->items)) + printSongInfo(fd, song); return 0; } @@ -241,46 +100,12 @@ int searchForSongsIn(int fd, char *name, int numItems, LocateTagItem * items) return ret; } -static int tagItemFoundAndMatches(Song * song, int type, char *str) -{ - int i; - - if (type == LOCATE_TAG_FILE_TYPE || type == LOCATE_TAG_ANY_TYPE) { - if (0 == strcmp(str, getSongUrl(song))) - return 1; - if (type == LOCATE_TAG_FILE_TYPE) - return 0; - } - - if (!song->tag) - return 0; - - for (i = 0; i < song->tag->numOfItems; i++) { - if (type != LOCATE_TAG_ANY_TYPE && - song->tag->items[i].type != type) { - continue; - } - - if (0 == strcmp(str, song->tag->items[i].value)) - return 1; - } - - return 0; -} - static int findInDirectory(int fd, Song * song, void *data) { LocateTagItemArray *array = data; - int i; - for (i = 0; i < array->numItems; i++) { - if (!tagItemFoundAndMatches(song, array->items[i].tagType, - array->items[i].needle)) { - return 0; - } - } - - printSongInfo(fd, song); + if (tagItemsFoundAndMatches(song, array->numItems, array->items)) + printSongInfo(fd, song); return 0; } @@ -403,17 +228,12 @@ static void visitTag(int fd, Song * song, int tagType) static int listUniqueTagsInDirectory(int fd, Song * song, void *data) { ListCommandItem *item = data; - int i; - for (i = 0; i < item->numConditionals; i++) { - if (!tagItemFoundAndMatches(song, item->conditionals[i].tagType, - item->conditionals[i].needle)) { - return 0; - } + if (tagItemsFoundAndMatches(song, item->numConditionals, + item->conditionals)) { + visitTag(fd, song, item->tagType); } - visitTag(fd, song, item->tagType); - return 0; } |