diff options
author | Max Kellermann <max@duempel.org> | 2012-08-07 23:25:42 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2012-08-07 23:27:23 +0200 |
commit | 6b39a5621d9c6724db8f03164e350ae6220fa00a (patch) | |
tree | 1d2284873c2a8bdb1f27703731ed1b6f988fb84c /src | |
parent | 0d46e118269689e2a98e8011f52bb4bb0459421a (diff) | |
download | mpd-6b39a5621d9c6724db8f03164e350ae6220fa00a.tar.gz mpd-6b39a5621d9c6724db8f03164e350ae6220fa00a.tar.xz mpd-6b39a5621d9c6724db8f03164e350ae6220fa00a.zip |
locate: add "casefold" flag to parser
Fold the case during construction, without having to create another
copy.
Diffstat (limited to 'src')
-rw-r--r-- | src/DatabaseCommands.cxx | 16 | ||||
-rw-r--r-- | src/DatabasePlaylist.cxx | 11 | ||||
-rw-r--r-- | src/DatabasePrint.cxx | 11 | ||||
-rw-r--r-- | src/DatabaseQueue.cxx | 11 | ||||
-rw-r--r-- | src/command.c | 4 | ||||
-rw-r--r-- | src/locate.c | 25 | ||||
-rw-r--r-- | src/locate.h | 10 | ||||
-rw-r--r-- | src/queue_print.c | 10 |
8 files changed, 26 insertions, 72 deletions
diff --git a/src/DatabaseCommands.cxx b/src/DatabaseCommands.cxx index 40ba88052..618fe0947 100644 --- a/src/DatabaseCommands.cxx +++ b/src/DatabaseCommands.cxx @@ -60,7 +60,7 @@ enum command_return handle_find(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, false); if (list == NULL || list->length == 0) { if (list != NULL) @@ -84,7 +84,7 @@ enum command_return handle_findadd(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, false); if (list == NULL || list->length == 0) { if (list != NULL) locate_item_list_free(list); @@ -108,7 +108,7 @@ enum command_return handle_search(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, true); if (list == NULL || list->length == 0) { if (list != NULL) @@ -132,7 +132,7 @@ enum command_return handle_searchadd(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, true); if (list == NULL || list->length == 0) { if (list != NULL) @@ -159,7 +159,7 @@ handle_searchaddpl(struct client *client, int argc, char *argv[]) const char *playlist = argv[1]; struct locate_item_list *list = - locate_item_list_parse(argv + 2, argc - 2); + locate_item_list_parse(argv + 2, argc - 2, true); if (list == NULL || list->length == 0) { if (list != NULL) @@ -184,7 +184,7 @@ enum command_return handle_count(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, false); if (list == NULL || list->length == 0) { if (list != NULL) @@ -245,14 +245,14 @@ handle_list(struct client *client, int argc, char *argv[]) return COMMAND_RETURN_ERROR; } - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, false); conditionals = locate_item_list_new(1); conditionals->items[0].tag = TAG_ARTIST; conditionals->items[0].needle = g_strdup(argv[2]); } else { conditionals = - locate_item_list_parse(argv + 2, argc - 2); + locate_item_list_parse(argv + 2, argc - 2, false); if (conditionals == NULL) { command_error(client, ACK_ERROR_ARG, "not able to parse args"); diff --git a/src/DatabasePlaylist.cxx b/src/DatabasePlaylist.cxx index e8d569877..c1524a335 100644 --- a/src/DatabasePlaylist.cxx +++ b/src/DatabasePlaylist.cxx @@ -66,15 +66,8 @@ search_add_to_playlist(const char *uri, const char *playlist_path_utf8, { const DatabaseSelection selection(uri, true); - struct locate_item_list *new_list - = locate_item_list_casefold(criteria); - using namespace std::placeholders; const auto f = std::bind(SearchAddSong, playlist_path_utf8, - new_list, _1, _2); - bool success = GetDatabase()->Visit(selection, f, error_r); - - locate_item_list_free(new_list); - - return success; + criteria, _1, _2); + return GetDatabase()->Visit(selection, f, error_r); } diff --git a/src/DatabasePrint.cxx b/src/DatabasePrint.cxx index 318bca8a4..0c5b2bb98 100644 --- a/src/DatabasePrint.cxx +++ b/src/DatabasePrint.cxx @@ -155,16 +155,9 @@ searchForSongsIn(struct client *client, const char *uri, { const DatabaseSelection selection(uri, true); - struct locate_item_list *new_list - = locate_item_list_casefold(criteria); - using namespace std::placeholders; - const auto f = std::bind(SearchPrintSong, client, new_list, _1); - bool success = GetDatabase()->Visit(selection, f, error_r); - - locate_item_list_free(new_list); - - return success; + const auto f = std::bind(SearchPrintSong, client, criteria, _1); + return GetDatabase()->Visit(selection, f, error_r); } static bool diff --git a/src/DatabaseQueue.cxx b/src/DatabaseQueue.cxx index e9a47a761..7bc18363f 100644 --- a/src/DatabaseQueue.cxx +++ b/src/DatabaseQueue.cxx @@ -92,14 +92,7 @@ search_add_songs(struct player_control *pc, const char *uri, { const DatabaseSelection selection(uri, true); - struct locate_item_list *new_list = - locate_item_list_casefold(criteria); - using namespace std::placeholders; - const auto f = std::bind(SearchAddSong, pc, new_list, _1, _2); - bool success = GetDatabase()->Visit(selection, f, error_r); - - locate_item_list_free(new_list); - - return success; + const auto f = std::bind(SearchAddSong, pc, criteria, _1, _2); + return GetDatabase()->Visit(selection, f, error_r); } diff --git a/src/command.c b/src/command.c index 08d508de7..b1d222250 100644 --- a/src/command.c +++ b/src/command.c @@ -677,7 +677,7 @@ static enum command_return handle_playlistfind(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, false); if (list == NULL || list->length == 0) { if (list != NULL) @@ -698,7 +698,7 @@ static enum command_return handle_playlistsearch(struct client *client, int argc, char *argv[]) { struct locate_item_list *list = - locate_item_list_parse(argv + 1, argc - 1); + locate_item_list_parse(argv + 1, argc - 1, true); if (list == NULL || list->length == 0) { if (list != NULL) diff --git a/src/locate.c b/src/locate.c index d4b902538..dd6902e3f 100644 --- a/src/locate.c +++ b/src/locate.c @@ -50,14 +50,17 @@ locate_parse_type(const char *str) static bool locate_item_init(struct locate_item *item, - const char *type_string, const char *needle) + const char *type_string, const char *needle, + bool fold_case) { item->tag = locate_parse_type(type_string); if (item->tag < 0) return false; - item->needle = g_strdup(needle); + item->needle = fold_case + ? g_utf8_casefold(needle, -1) + : g_strdup(needle); return true; } @@ -83,7 +86,7 @@ locate_item_list_new(unsigned length) } struct locate_item_list * -locate_item_list_parse(char *argv[], int argc) +locate_item_list_parse(char *argv[], int argc, bool fold_case) { if (argc % 2 != 0) return NULL; @@ -92,7 +95,7 @@ locate_item_list_parse(char *argv[], int argc) for (unsigned i = 0; i < list->length; ++i) { if (!locate_item_init(&list->items[i], argv[i * 2], - argv[i * 2 + 1])) { + argv[i * 2 + 1], fold_case)) { locate_item_list_free(list); return NULL; } @@ -101,20 +104,6 @@ locate_item_list_parse(char *argv[], int argc) return list; } -struct locate_item_list * -locate_item_list_casefold(const struct locate_item_list *list) -{ - struct locate_item_list *new_list = locate_item_list_new(list->length); - - for (unsigned i = 0; i < list->length; i++){ - new_list->items[i].needle = - g_utf8_casefold(list->items[i].needle, -1); - new_list->items[i].tag = list->items[i].tag; - } - - return new_list; -} - static bool locate_tag_search(const struct song *song, enum tag_type type, const char *str) { diff --git a/src/locate.h b/src/locate.h index 9ebb2c4ae..25ca790eb 100644 --- a/src/locate.h +++ b/src/locate.h @@ -61,15 +61,7 @@ locate_item_list_new(unsigned length); /* return number of items or -1 on error */ gcc_nonnull(1) struct locate_item_list * -locate_item_list_parse(char *argv[], int argc); - -/** - * Duplicate the struct locate_item_list object and convert all - * needles with g_utf8_casefold(). - */ -gcc_nonnull(1) -struct locate_item_list * -locate_item_list_casefold(const struct locate_item_list *list); +locate_item_list_parse(char *argv[], int argc, bool fold_case); gcc_nonnull(1) void diff --git a/src/queue_print.c b/src/queue_print.c index d149e8b6f..032a7dec5 100644 --- a/src/queue_print.c +++ b/src/queue_print.c @@ -95,18 +95,12 @@ void queue_search(struct client *client, const struct queue *queue, const struct locate_item_list *criteria) { - unsigned i; - struct locate_item_list *new_list = - locate_item_list_casefold(criteria); - - for (i = 0; i < queue_length(queue); i++) { + for (unsigned i = 0; i < queue_length(queue); i++) { const struct song *song = queue_get(queue, i); - if (locate_song_search(song, new_list)) + if (locate_song_search(song, criteria)) queue_print_song_info(client, queue, i); } - - locate_item_list_free(new_list); } void |