talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit b82f405dfb3400c60ec5af79c74708caec74cd4f
parent b24d520a837d1505e2b897858f3e6767fa831f92
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 16 Nov 2012 13:10:06 +0000

2012-11-16 [colin]	3.9.0cvs8

	* src/advsearch.c
		Fix missing initialisation of bool_and which could
		lead to From/To/Subject/Tag searches searching with
		binary and.
		Also clean up tag expansion. No need to create a
		matcher string and re-parse it.

Diffstat:
MChangeLog | 9+++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/advsearch.c | 82+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
4 files changed, 62 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,12 @@ +2012-11-16 [colin] 3.9.0cvs8 + + * src/advsearch.c + Fix missing initialisation of bool_and which could + lead to From/To/Subject/Tag searches searching with + binary and. + Also clean up tag expansion. No need to create a + matcher string and re-parse it. + 2012-11-16 [paul] 3.9.0cvs7 * po/de.po diff --git a/PATCHSETS b/PATCHSETS @@ -4505,3 +4505,4 @@ ( cvs diff -u -r 1.115.2.261 -r 1.115.2.262 src/main.c; cvs diff -u -r 1.5.2.33 -r 1.5.2.34 src/statusbar.c; cvs diff -u -r 1.1.2.24 -r 1.1.2.25 src/gtk/gtkcmclist.c; cvs diff -u -r 1.1.2.10 -r 1.1.2.11 src/gtk/gtkcmclist.h; ) > 3.9.0cvs5.patchset ( cvs diff -u -r 1.395.2.457 -r 1.395.2.458 src/summaryview.c; ) > 3.9.0cvs6.patchset ( cvs diff -u -r 1.58.2.51 -r 1.58.2.52 po/de.po; ) > 3.9.0cvs7.patchset +( cvs diff -u -r 1.1.2.7 -r 1.1.2.8 src/advsearch.c; ) > 3.9.0cvs8.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=9 MICRO_VERSION=0 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=7 +EXTRA_VERSION=8 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/advsearch.c b/src/advsearch.c @@ -314,32 +314,6 @@ gchar *advsearch_expand_search_string(const gchar *search_string) return returnstr; } -// -------------------------- - -static gchar *expand_tag_search_string(const gchar *search_string) -{ - gchar *newstr = NULL; - gchar **words = search_string ? g_strsplit(search_string, " ", -1):NULL; - gint i = 0; - while (words && words[i] && *words[i]) { - g_strstrip(words[i]); - if (!newstr) { - newstr = g_strdup_printf("tag matchcase \"%s\"", words[i]); - } else { - gint o_len = strlen(newstr); - gint s_len = 17; /* strlen("|tag matchcase \"\"") */ - gint n_len = s_len + strlen(words[i]); - newstr = g_realloc(newstr, o_len + n_len + 1); - strcpy(newstr + o_len, "|tag matchcase \""); - strcpy(newstr + o_len + (s_len - 1), words[i]); - strcpy(newstr + o_len + (n_len - 1), "\""); - } - i++; - } - g_strfreev(words); - return newstr; -} - static void prepare_matcher_extended(AdvancedSearch *search) { gchar *newstr = advsearch_expand_search_string(search->request.matchstring); @@ -350,19 +324,51 @@ static void prepare_matcher_extended(AdvancedSearch *search) } } +#define debug_matcher_list(prefix, list) \ +do { \ + gchar *str = list ? matcherlist_to_string(list) : g_strdup("(NULL)"); \ + \ + debug_print("%s: %s\n", prefix, str); \ + \ + g_free(str); \ +} while(0) + static void prepare_matcher_tag(AdvancedSearch *search) { - char *newstr = expand_tag_search_string(search->request.matchstring); - search->predicate = matcher_parser_get_cond(newstr, &search->is_fast); - g_free(newstr); + gchar **words = search->request.matchstring + ? g_strsplit(search->request.matchstring, " ", -1) + : NULL; + gint i = 0; + + if (search->predicate == NULL) { + search->predicate = g_new0(MatcherList, 1); + search->predicate->bool_and = FALSE; + search->is_fast = TRUE; + } + + while (words && words[i] && *words[i]) { + MatcherProp *matcher; + + g_strstrip(words[i]); + + matcher = matcherprop_new(MATCHCRITERIA_TAG, NULL, + MATCHTYPE_MATCHCASE, words[i], 0); + + search->predicate->matchers = g_slist_prepend(search->predicate->matchers, matcher); + + i++; + } + g_strfreev(words); } static void prepare_matcher_header(AdvancedSearch *search, gint match_header) { MatcherProp *matcher; - if (search->predicate == NULL) + if (search->predicate == NULL) { search->predicate = g_new0(MatcherList, 1); + search->predicate->bool_and = FALSE; + } matcher = matcherprop_new(match_header, NULL, MATCHTYPE_MATCHCASE, search->request.matchstring, 0); @@ -373,10 +379,18 @@ static void prepare_matcher_header(AdvancedSearch *search, gint match_header) static void prepare_matcher_mixed(AdvancedSearch *search) { prepare_matcher_tag(search); + debug_matcher_list("tag matcher list", search->predicate); + + /* we want an OR search */ + if (search->predicate) + search->predicate->bool_and = FALSE; prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); + debug_matcher_list("tag + subject matcher list", search->predicate); prepare_matcher_header(search, MATCHCRITERIA_FROM); + debug_matcher_list("tag + subject + from matcher list", search->predicate); prepare_matcher_header(search, MATCHCRITERIA_TO); + debug_matcher_list("tag + subject + from + to matcher list", search->predicate); } static void prepare_matcher(AdvancedSearch *search) @@ -398,26 +412,32 @@ static void prepare_matcher(AdvancedSearch *search) switch (search->request.type) { case ADVANCED_SEARCH_SUBJECT: prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); + debug_matcher_list("subject search", search->predicate); break; case ADVANCED_SEARCH_FROM: prepare_matcher_header(search, MATCHCRITERIA_FROM); + debug_matcher_list("from search", search->predicate); break; case ADVANCED_SEARCH_TO: prepare_matcher_header(search, MATCHCRITERIA_TO); + debug_matcher_list("to search", search->predicate); break; case ADVANCED_SEARCH_TAG: - prepare_matcher_header(search, MATCHCRITERIA_TAG); + prepare_matcher_tag(search); + debug_matcher_list("tag search", search->predicate); break; case ADVANCED_SEARCH_MIXED: prepare_matcher_mixed(search); + debug_matcher_list("mixed search", search->predicate); break; case ADVANCED_SEARCH_EXTENDED: prepare_matcher_extended(search); + debug_matcher_list("extended search", search->predicate); break; default: