Don't bother parsing headers when we want to skip them

Speeds up body-only search
This commit is contained in:
Colin Leroy 2018-10-06 12:46:48 +02:00 committed by Andrej Kacian
parent 7aeffbd66c
commit 15bafe1779
3 changed files with 21 additions and 14 deletions

View file

@ -1329,19 +1329,6 @@ void matcherlist_free(MatcherList *cond)
g_free(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
*
@ -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 */

View file

@ -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;

View file

@ -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,