Mercurial > audlegacy
changeset 2131:a416e188db64 trunk
[svn] regex-powered jump to file - should be considerably faster than the old one
author | giacomo |
---|---|
date | Fri, 15 Dec 2006 16:04:22 -0800 |
parents | fb57249c8702 |
children | aec6570f056f |
files | ChangeLog audacious/mainwin.c |
diffstat | 2 files changed, 48 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Fri Dec 15 11:22:42 2006 -0800 +++ b/ChangeLog Fri Dec 15 16:04:22 2006 -0800 @@ -1,3 +1,10 @@ +2006-12-15 19:22:42 +0000 Giacomo Lozito <james@develia.org> + revision [3265] + do not assume that a tuple field exists just cause the tuple does, regexec hates null strings + trunk/audacious/playlist.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + + 2006-12-15 19:14:46 +0000 Giacomo Lozito <james@develia.org> revision [3263] added a regex-based search option in playlist that allows to select playlist entries using multiple match criteria
--- a/audacious/mainwin.c Fri Dec 15 11:22:42 2006 -0800 +++ b/audacious/mainwin.c Fri Dec 15 16:04:22 2006 -0800 @@ -41,6 +41,9 @@ #include <X11/Xlib.h> +#include <sys/types.h> +#include <regex.h> + #include "widgets/widgetcore.h" #include "mainwin.h" #include "pixmaps.h" @@ -1852,22 +1855,22 @@ } static gboolean -mainwin_jump_to_file_match(const gchar * song, gchar ** keys) +mainwin_jump_to_file_match(const gchar * song, GSList *regex_list) { gint i = 0; gboolean rv = TRUE; - while (keys[i]) { - gint len = strlen(keys[i]); - gint j = 0; - while (*(song + j)) { - if (!g_strncasecmp(song + j, keys[i], len)) - goto found; - j++; + if ( song == NULL ) + return FALSE; + + for ( ; regex_list ; regex_list = g_slist_next(regex_list) ) + { + regex_t *regex = regex_list->data; + if ( regexec( regex , song , 0 , NULL , 0 ) != 0 ) + { + rv = FALSE; + break; } - rv = FALSE; - found: - i++; } return rv; @@ -1940,9 +1943,20 @@ gboolean match = FALSE; - /* Chop the key string into ' '-separated key words */ + GSList *regex_list = NULL, *regex_list_tmp = NULL; + gint i = -1; + + /* Chop the key string into ' '-separated key regex-pattern strings */ words = g_strsplit(gtk_entry_get_text(entry), " ", 0); + /* create a list of regex using the regex-pattern strings */ + while ( words[++i] != NULL ) + { + regex_t *regex = g_malloc(sizeof(regex_t)); + if ( regcomp( regex , words[i] , REG_NOSUB | REG_ICASE ) == 0 ) + regex_list = g_slist_append( regex_list , regex ); + } + /* FIXME: Remove the connected signals before clearing * (row-selected will still eventually arrive once) */ store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); @@ -1967,8 +1981,8 @@ title = filename; } - /* Compare the key words to the string - if all the words - match, add to the ListStore */ + /* Compare the reg.expressions to the string - if all the + regexp in regex_list match, add to the ListStore */ /* * FIXME: The search string should be adapted to the @@ -1979,8 +1993,8 @@ * In any case the string to match should _never_ contain * something the user can't actually see in the playlist. */ - if (words[0] != NULL) - match = mainwin_jump_to_file_match(title, words); + if (regex_list != NULL) + match = mainwin_jump_to_file_match(title, regex_list); else match = TRUE; @@ -2000,6 +2014,17 @@ PLAYLIST_UNLOCK(); + if ( regex_list != NULL ) + { + regex_list_tmp = regex_list; + while ( regex_list != NULL ) + { + regex_t *regex = regex_list->data; + regfree( regex ); + regex_list = g_slist_next(regex_list); + } + g_slist_free( regex_list_tmp ); + } g_strfreev(words); if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) {