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:
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: