diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/dbUtils.c | 194 | ||||
-rw-r--r-- | src/dbUtils.h | 25 | ||||
-rw-r--r-- | src/locate.c | 193 | ||||
-rw-r--r-- | src/locate.h | 28 |
5 files changed, 233 insertions, 213 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 0207cb90f..ab2f2d80c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -73,7 +73,8 @@ mpd_headers = \ utf8.h \ utils.h \ volume.h \ - zeroconf.h + zeroconf.h \ + locate.h mpd_SOURCES = \ @@ -123,7 +124,8 @@ mpd_SOURCES = \ utils.c \ volume.c \ utf8.c \ - zeroconf.c + zeroconf.c \ + locate.c mpd_CFLAGS = $(MPD_CFLAGS) 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; } diff --git a/src/dbUtils.h b/src/dbUtils.h index ebd4dcfba..632772023 100644 --- a/src/dbUtils.h +++ b/src/dbUtils.h @@ -21,30 +21,7 @@ #include <stdio.h> -#include "tag.h" - -#define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10 -#define LOCATE_TAG_ANY_TYPE TAG_NUM_OF_ITEM_TYPES+20 - -/* struct used for search, find, list queries */ -typedef struct _LocateTagItem { - mpd_sint8 tagType; - /* what we are looking for */ - char *needle; -} LocateTagItem; - -int getLocateTagItemType(char *str); - -/* returns NULL if not a known type */ -LocateTagItem *newLocateTagItem(char *typeString, char *needle); - -/* return number of items or -1 on error */ -int newLocateTagItemArrayFromArgArray(char *argArray[], int numArgs, - LocateTagItem ** arrayRet); - -void freeLocateTagItemArray(int count, LocateTagItem * array); - -void freeLocateTagItem(LocateTagItem * item); +#include "locate.h" int printAllIn(int fd, char *name); diff --git a/src/locate.c b/src/locate.c new file mode 100644 index 000000000..931a566ad --- /dev/null +++ b/src/locate.c @@ -0,0 +1,193 @@ +#include "locate.h" + +#include "utils.h" + +#define LOCATE_TAG_FILE_KEY SONG_FILE +#define LOCATE_TAG_FILE_KEY_OLD "filename" +#define LOCATE_TAG_ANY_KEY "any" + +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 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; +} + +int strstrSearchTags(Song * song, int numItems, LocateTagItem * items) +{ + int i; + + for (i = 0; i < numItems; i++) { + if (!strstrSearchTag(song, items[i].tagType, + items[i].needle)) { + return 0; + } + } + + return 1; +} + +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; +} + + +int tagItemsFoundAndMatches(Song * song, int numItems, LocateTagItem * items) +{ + int i; + + for (i = 0; i < numItems; i++) { + if (!tagItemFoundAndMatches(song, items[i].tagType, + items[i].needle)) { + return 0; + } + } + + return 1; +} diff --git a/src/locate.h b/src/locate.h new file mode 100644 index 000000000..c4eae687a --- /dev/null +++ b/src/locate.h @@ -0,0 +1,28 @@ +#include "song.h" + +#define LOCATE_TAG_FILE_TYPE TAG_NUM_OF_ITEM_TYPES+10 +#define LOCATE_TAG_ANY_TYPE TAG_NUM_OF_ITEM_TYPES+20 + +/* struct used for search, find, list queries */ +typedef struct _LocateTagItem { + mpd_sint8 tagType; + /* what we are looking for */ + char *needle; +} LocateTagItem; + +int getLocateTagItemType(char *str); + +/* returns NULL if not a known type */ +LocateTagItem *newLocateTagItem(char *typeString, char *needle); + +/* return number of items or -1 on error */ +int newLocateTagItemArrayFromArgArray(char *argArray[], int numArgs, + LocateTagItem ** arrayRet); + +void freeLocateTagItemArray(int count, LocateTagItem * array); + +void freeLocateTagItem(LocateTagItem * item); + +int strstrSearchTags(Song * song, int numItems, LocateTagItem * items); + +int tagItemsFoundAndMatches(Song * song, int numItems, LocateTagItem * items); |