commit bd8a5595641a887f063a6e77978413ebd456e299
parent e1d42e70e677662613badb7e09ed4ac71ff5e9e9
Author: Colin Leroy <colin@colino.net>
Date: Wed, 26 Sep 2012 13:15:47 +0000
2012-09-26 [colin] 3.8.1cvs79
* src/main.c
* src/matcher.c
* src/matcher.h
Prepare the context strings, their translation take
CPU time. Shaves 6 seconds out of 17 on my reference
folder body search.
* src/summary_search.c
Fix a warning
Diffstat:
7 files changed, 94 insertions(+), 107 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,14 @@
+2012-09-26 [colin] 3.8.1cvs79
+
+ * src/main.c
+ * src/matcher.c
+ * src/matcher.h
+ Prepare the context strings, their translation take
+ CPU time. Shaves 6 seconds out of 17 on my reference
+ folder body search.
+ * src/summary_search.c
+ Fix a warning
+
2012-09-26 [colin] 3.8.1cvs78
* src/matcher.c
diff --git a/PATCHSETS b/PATCHSETS
@@ -4453,3 +4453,4 @@
( cvs diff -u -r 1.15.2.71 -r 1.15.2.72 src/summary_search.c; cvs diff -u -r 1.395.2.455 -r 1.395.2.456 src/summaryview.c; cvs diff -u -r 1.68.2.62 -r 1.68.2.63 src/summaryview.h; cvs diff -u -r 1.1.2.114 -r 1.1.2.115 src/gtk/quicksearch.c; ) > 3.8.1cvs76.patchset
( cvs diff -u -r 1.15.2.72 -r 1.15.2.73 src/summary_search.c; cvs diff -u -r 1.1.2.115 -r 1.1.2.116 src/gtk/quicksearch.c; ) > 3.8.1cvs77.patchset
( cvs diff -u -r 1.75.2.76 -r 1.75.2.77 src/matcher.c; cvs diff -u -r 1.49.2.151 -r 1.49.2.152 src/procmime.c; cvs diff -u -r 1.17.2.30 -r 1.17.2.31 src/procmime.h; ) > 3.8.1cvs78.patchset
+( cvs diff -u -r 1.115.2.258 -r 1.115.2.259 src/main.c; cvs diff -u -r 1.75.2.77 -r 1.75.2.78 src/matcher.c; cvs diff -u -r 1.39.2.22 -r 1.39.2.23 src/matcher.h; cvs diff -u -r 1.15.2.73 -r 1.15.2.74 src/summary_search.c; ) > 3.8.1cvs79.patchset
diff --git a/configure.ac b/configure.ac
@@ -12,7 +12,7 @@ MINOR_VERSION=8
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=78
+EXTRA_VERSION=79
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
diff --git a/src/main.c b/src/main.c
@@ -1337,6 +1337,7 @@ int main(int argc, char *argv[])
prefs_receive_init();
prefs_send_init();
tags_read_tags();
+ matcher_init();
#ifdef USE_ENCHANT
gtkaspell_checkers_init();
prefs_spelling_init();
@@ -1802,6 +1803,7 @@ static void exit_claws(MainWindow *mainwin)
plugin_unload_all("GTK2");
+ matcher_done();
prefs_toolbar_done();
#ifndef USE_NEW_ADDRBOOK
diff --git a/src/matcher.c b/src/matcher.c
@@ -182,6 +182,50 @@ enum {
MATCH_ONE = 2
};
+enum {
+ CONTEXT_SUBJECT,
+ CONTEXT_FROM,
+ CONTEXT_TO,
+ CONTEXT_CC,
+ CONTEXT_NEWSGROUPS,
+ CONTEXT_IN_REPLY_TO,
+ CONTEXT_REFERENCES,
+ CONTEXT_HEADER,
+ CONTEXT_HEADER_LINE,
+ CONTEXT_BODY_LINE,
+ CONTEXT_TAG,
+ N_CONTEXT_STRS
+};
+
+static gchar *context_str[N_CONTEXT_STRS];
+
+void matcher_init(void)
+{
+ if (context_str[CONTEXT_SUBJECT] != NULL)
+ return;
+
+ context_str[CONTEXT_SUBJECT] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Subject:"));
+ context_str[CONTEXT_FROM] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("From:"));
+ context_str[CONTEXT_TO] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("To:"));
+ context_str[CONTEXT_CC] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Cc:"));
+ context_str[CONTEXT_NEWSGROUPS] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Newsgroups:"));
+ context_str[CONTEXT_IN_REPLY_TO] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("In-Reply-To:"));
+ context_str[CONTEXT_REFERENCES] = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("References:"));
+ context_str[CONTEXT_HEADER] = g_strdup(_("header"));
+ context_str[CONTEXT_HEADER_LINE] = g_strdup(_("header line"));
+ context_str[CONTEXT_BODY_LINE] = g_strdup(_("body line"));
+ context_str[CONTEXT_TAG] = g_strdup(_("tag"));
+}
+
+void matcher_done(void)
+{
+ int i;
+ for (i = 0; i < N_CONTEXT_STRS; i++) {
+ g_free(context_str[i]);
+ context_str[i] = NULL;
+ }
+}
+
extern gboolean debug_filtering_session;
/*!
@@ -806,86 +850,35 @@ static gboolean matcherprop_match(MatcherProp *prop,
case MATCHCRITERIA_NOT_WATCH_THREAD:
return !MSG_IS_WATCH_THREAD(info->flags);
case MATCHCRITERIA_SUBJECT:
- return matcherprop_string_match(prop, info->subject,
- prefs_common_translated_header_name("Subject:"));
+ return matcherprop_string_match(prop, info->subject, context_str[CONTEXT_SUBJECT]);
case MATCHCRITERIA_NOT_SUBJECT:
- return !matcherprop_string_match(prop, info->subject,
- prefs_common_translated_header_name("Subject:"));
+ return !matcherprop_string_match(prop, info->subject, context_str[CONTEXT_SUBJECT]);
case MATCHCRITERIA_FROM:
+ return matcherprop_string_match(prop, info->from, context_str[CONTEXT_FROM]);
case MATCHCRITERIA_NOT_FROM:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("From:"));
- ret = matcherprop_string_match(prop, info->from, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_FROM)? ret : !ret;
- }
+ return !matcherprop_string_match(prop, info->from, context_str[CONTEXT_FROM]);
case MATCHCRITERIA_TO:
+ return matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]);
case MATCHCRITERIA_NOT_TO:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("To:"));
- ret = matcherprop_string_match(prop, info->to, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_TO)? ret : !ret;
- }
+ return !matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]);
case MATCHCRITERIA_CC:
+ return matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]);
case MATCHCRITERIA_NOT_CC:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Cc:"));
- ret = matcherprop_string_match(prop, info->cc, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_CC)? ret : !ret;
- }
+ return !matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]);
case MATCHCRITERIA_TO_OR_CC:
- {
- gchar *context1, *context2;
- gboolean ret;
-
- context1 = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("To:"));
- context2 = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Cc:"));
- ret = matcherprop_string_match(prop, info->to, context1)
- || matcherprop_string_match(prop, info->cc, context2);
- g_free(context1);
- g_free(context2);
- return ret;
- }
+ return matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO])
+ || matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]);
case MATCHCRITERIA_NOT_TO_AND_NOT_CC:
- {
- gchar *context1, *context2;
- gboolean ret;
-
- context1 = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("To:"));
- context2 = g_strdup_printf(_("%s header"), prefs_common_translated_header_name("Cc:"));
- ret = !(matcherprop_string_match(prop, info->to, context1)
- || matcherprop_string_match(prop, info->cc, context2));
- g_free(context1);
- g_free(context2);
- return ret;
- }
+ return !matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO])
+ && !matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]);
case MATCHCRITERIA_TAG:
+ return matcherprop_tag_match(prop, info, context_str[CONTEXT_TAG]);
case MATCHCRITERIA_NOT_TAG:
- {
- gboolean ret;
-
- ret = matcherprop_tag_match(prop, info, _("Tag"));
- return (prop->criteria == MATCHCRITERIA_TAG)? ret : !ret;
- }
+ return !matcherprop_tag_match(prop, info, context_str[CONTEXT_TAG]);
case MATCHCRITERIA_TAGGED:
+ return info->tags != NULL;
case MATCHCRITERIA_NOT_TAGGED:
- {
- gboolean ret;
-
- ret = (info->tags != NULL);
- return (prop->criteria == MATCHCRITERIA_TAGGED)? ret : !ret;
- }
+ return info->tags == NULL;
case MATCHCRITERIA_AGE_GREATER:
{
gboolean ret;
@@ -1090,41 +1083,17 @@ static gboolean matcherprop_match(MatcherProp *prop,
return ret;
}
case MATCHCRITERIA_NEWSGROUPS:
+ return matcherprop_string_match(prop, info->newsgroups, context_str[CONTEXT_NEWSGROUPS]);
case MATCHCRITERIA_NOT_NEWSGROUPS:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"),
- prefs_common_translated_header_name("Newsgroups:"));
- ret = matcherprop_string_match(prop, info->newsgroups, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_NEWSGROUPS)? ret : !ret;
- }
+ return !matcherprop_string_match(prop, info->newsgroups, context_str[CONTEXT_NEWSGROUPS]);
case MATCHCRITERIA_INREPLYTO:
+ return matcherprop_string_match(prop, info->inreplyto, context_str[CONTEXT_IN_REPLY_TO]);
case MATCHCRITERIA_NOT_INREPLYTO:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"),
- prefs_common_translated_header_name("In-Reply-To:"));
- ret = matcherprop_string_match(prop, info->inreplyto, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_INREPLYTO)? ret : !ret;
- }
+ return !matcherprop_string_match(prop, info->inreplyto, context_str[CONTEXT_IN_REPLY_TO]);
case MATCHCRITERIA_REFERENCES:
+ return matcherprop_list_match(prop, info->references, context_str[CONTEXT_REFERENCES]);
case MATCHCRITERIA_NOT_REFERENCES:
- {
- gchar *context;
- gboolean ret;
-
- context = g_strdup_printf(_("%s header"),
- prefs_common_translated_header_name("References:"));
- ret = matcherprop_list_match(prop, info->references, context);
- g_free(context);
- return (prop->criteria == MATCHCRITERIA_REFERENCES)? ret : !ret;
- }
+ return !matcherprop_list_match(prop, info->references, context_str[CONTEXT_REFERENCES]);
case MATCHCRITERIA_TEST:
return matcherprop_match_test(prop, info);
case MATCHCRITERIA_NOT_TEST:
@@ -1209,9 +1178,9 @@ static gboolean matcherprop_match_one_header(MatcherProp *matcher,
if (procheader_headername_equal(header->name,
matcher->header)) {
if (matcher->criteria == MATCHCRITERIA_HEADER)
- result = matcherprop_string_match(matcher, header->body, _("header"));
+ result = matcherprop_string_match(matcher, header->body, context_str[CONTEXT_HEADER]);
else
- result = !matcherprop_string_match(matcher, header->body, _("header"));
+ result = !matcherprop_string_match(matcher, header->body, context_str[CONTEXT_HEADER]);
procheader_header_free(header);
return result;
}
@@ -1225,7 +1194,7 @@ static gboolean matcherprop_match_one_header(MatcherProp *matcher,
if (!header)
return FALSE;
result = matcherprop_header_line_match(matcher,
- header->name, header->body, _("header line"));
+ header->name, header->body, context_str[CONTEXT_HEADER_LINE]);
procheader_header_free(header);
return result;
case MATCHCRITERIA_NOT_HEADERS_PART:
@@ -1234,7 +1203,7 @@ static gboolean matcherprop_match_one_header(MatcherProp *matcher,
if (!header)
return FALSE;
result = !matcherprop_header_line_match(matcher,
- header->name, header->body, _("header line"));
+ header->name, header->body, context_str[CONTEXT_HEADER_LINE]);
procheader_header_free(header);
return result;
case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK:
@@ -1439,7 +1408,7 @@ static gboolean matcherprop_criteria_body(const MatcherProp *matcher)
return FALSE;
}
}
-
+
static gboolean matcherlist_match_binary_content(MatcherList *matchers, MimeInfo *partinfo)
{
FILE *outfp;
@@ -1477,7 +1446,7 @@ static gboolean matcherlist_match_binary_content(MatcherList *matchers, MimeInfo
if (matcher->criteria == MATCHCRITERIA_NOT_BODY_PART ||
matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) {
if (matcherprop_string_match(matcher, buf,
- _("body line"))) {
+ context_str[CONTEXT_BODY_LINE])) {
matcher->result = FALSE;
matcher->done = TRUE;
} else
@@ -1486,7 +1455,7 @@ static gboolean matcherlist_match_binary_content(MatcherList *matchers, MimeInfo
} else if (matcherprop_criteria_body(matcher) ||
matcherprop_criteria_message(matcher)) {
if (matcherprop_string_match(matcher, buf,
- _("body line"))) {
+ context_str[CONTEXT_BODY_LINE])) {
matcher->result = TRUE;
matcher->done = TRUE;
}
@@ -1525,7 +1494,7 @@ static gboolean match_content_cb(const gchar *buf, gpointer data)
if (matcher->criteria == MATCHCRITERIA_NOT_BODY_PART ||
matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) {
if (matcherprop_string_match(matcher, buf,
- _("body line"))) {
+ context_str[CONTEXT_BODY_LINE])) {
matcher->result = FALSE;
matcher->done = TRUE;
} else
@@ -1534,7 +1503,7 @@ static gboolean match_content_cb(const gchar *buf, gpointer data)
} else if (matcherprop_criteria_body(matcher) ||
matcherprop_criteria_message(matcher)) {
if (matcherprop_string_match(matcher, buf,
- _("body line"))) {
+ context_str[CONTEXT_BODY_LINE])) {
matcher->result = TRUE;
matcher->done = TRUE;
}
diff --git a/src/matcher.h b/src/matcher.h
@@ -142,6 +142,9 @@ enum {
MB_(AND)
};
+void matcher_init(void);
+void matcher_done(void);
+
const gchar *get_matchparser_tab_str (gint id);
gint get_matchparser_tab_id (const gchar *str);
diff --git a/src/summary_search.c b/src/summary_search.c
@@ -53,6 +53,7 @@
#include "prefs_matcher.h"
#include "manual.h"
#include "prefs_common.h"
+#include "statusbar.h"
static struct SummarySearchWindow {
GtkWidget *window;