Don't bother parsing headers when we want to skip them
authorColin Leroy <colin@colino.net>
Sat, 6 Oct 2018 10:46:48 +0000 (12:46 +0200)
committerColin Leroy <colin@colino.net>
Sat, 6 Oct 2018 10:46:48 +0000 (12:46 +0200)
Speeds up body-only search

src/matcher.c
src/procheader.c
src/procheader.h

index 4a0392d..c58c559 100644 (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 */
index 174e283..6a98f12 100644 (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;
index 0588f30..50e6c55 100644 (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,