talons

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

commit 2afd55869a7b6ad215cab2f19b1c23a385ae87d9
parent 53b770e396312512a2c0553fb7484aa8e106d2f5
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:
Msrc/matcher.c | 15+--------------
Msrc/procheader.c | 18++++++++++++++++++
Msrc/procheader.h | 2++
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,