commit 15bafe17796fd4429fe2b09abd9e2bab6c2a3ac7
parent 7aeffbd66c0b2b8f3d1003894fe39e1491763eeb
Author: Colin Leroy <colin@colino.net>
Date: Sat, 6 Oct 2018 12:46:48 +0200
Don't bother parsing headers when we want to skip them
Speeds up body-only search
Diffstat:
3 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/src/matcher.c b/src/matcher.c
@@ -1330,19 +1330,6 @@ void matcherlist_free(MatcherList *cond)
}
/*!
- *\brief Skip all headers in a message file
- *
- *\param fp Message file
- */
-static void matcherlist_skip_headers(FILE *fp)
-{
- gchar *buf = NULL;
-
- while (procheader_get_one_field(&buf, fp, NULL) != -1)
- g_free(buf);
-}
-
-/*!
*\brief Check if a header matches a matcher condition
*
*\param matcher Matcher structure to check header for
@@ -1848,7 +1835,7 @@ static gboolean matcherlist_match_file(MatcherList *matchers, MsgInfo *info,
if (matcherlist_match_headers(matchers, fp))
read_body = FALSE;
} else {
- matcherlist_skip_headers(fp);
+ procheader_skip_headers(fp);
}
/* read the body */
diff --git a/src/procheader.c b/src/procheader.c
@@ -83,6 +83,24 @@ static gint string_get_one_field(gchar **buf, char **str,
TRUE);
}
+gboolean procheader_skip_headers(FILE *fp)
+{
+ gchar *buf = g_malloc(BUFFSIZE);
+ do {
+ if (fgets_crlf(buf, BUFFSIZE - 1, fp) == NULL) {
+ g_free(buf);
+ return FALSE;
+ }
+ if (buf[0] == '\r' || buf[0] == '\n') {
+ break;
+ }
+ } while (TRUE);
+ g_free(buf);
+
+ return TRUE;
+}
+
+
static char *string_getline(char *buf, size_t len, char **str)
{
gboolean is_cr = FALSE;
diff --git a/src/procheader.h b/src/procheader.h
@@ -51,6 +51,8 @@ GPtrArray *procheader_get_header_array_asis (FILE *fp);
void procheader_header_array_destroy (GPtrArray *harray);
void procheader_header_free (Header *header);
+gboolean procheader_skip_headers(FILE *fp);
+
void procheader_get_header_fields (FILE *fp,
HeaderEntry hentry[]);
MsgInfo *procheader_parse_file (const gchar *file,