aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am6
-rw-r--r--src/dbUtils.c194
-rw-r--r--src/dbUtils.h25
-rw-r--r--src/locate.c193
-rw-r--r--src/locate.h28
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);