Support thunderbird naked "^From $" separators

This commit is contained in:
Jean-Francois Dockes 2011-01-11 18:36:40 +01:00
parent 58c4c12b04
commit d80f4478fc

View File

@ -350,7 +350,13 @@ static const char *frompat =
"[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?" // Time, secs optional "[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?" // Time, secs optional
; ;
// Extreme thunderbird brokiness. Will sometimes use From lines
// exactly like: From ^M (From followed by space and eol). We only
// test for this if QUIRKS_TBIRD is set
static const char *miniTbirdFrom = "^From $";
static regex_t fromregex; static regex_t fromregex;
static regex_t minifromregex;
static bool regcompiled; static bool regcompiled;
bool MimeHandlerMbox::next_document() bool MimeHandlerMbox::next_document()
@ -378,6 +384,7 @@ bool MimeHandlerMbox::next_document()
if (!regcompiled) { if (!regcompiled) {
regcomp(&fromregex, frompat, REG_NOSUB|REG_EXTENDED); regcomp(&fromregex, frompat, REG_NOSUB|REG_EXTENDED);
regcomp(&minifromregex, miniTbirdFrom, REG_NOSUB|REG_EXTENDED);
regcompiled = true; regcompiled = true;
} }
@ -398,7 +405,9 @@ bool MimeHandlerMbox::next_document()
(off = mcache.get_offset(m_udi, mtarg)) >= 0 && (off = mcache.get_offset(m_udi, mtarg)) >= 0 &&
fseeko(fp, (off_t)off, SEEK_SET) >= 0 && fseeko(fp, (off_t)off, SEEK_SET) >= 0 &&
fgets(line, LL, fp) && fgets(line, LL, fp) &&
!regexec(&fromregex, line, 0, 0, 0)) { (!regexec(&fromregex, line, 0, 0, 0) ||
((m_quirks & MBOXQUIRK_TBIRD) &&
!regexec(&minifromregex, line, 0, 0, 0))) ) {
LOGDEB0(("MimeHandlerMbox: Cache: From_ Ok\n")); LOGDEB0(("MimeHandlerMbox: Cache: From_ Ok\n"));
fseeko(fp, (off_t)off, SEEK_SET); fseeko(fp, (off_t)off, SEEK_SET);
m_msgnum = mtarg -1; m_msgnum = mtarg -1;
@ -437,7 +446,9 @@ bool MimeHandlerMbox::next_document()
// the best // the best
hademptyline = false; hademptyline = false;
} }
if (!regexec(&fromregex, line, 0, 0, 0)) { if (!regexec(&fromregex, line, 0, 0, 0) ||
((m_quirks & MBOXQUIRK_TBIRD) &&
!regexec(&minifromregex, line, 0, 0, 0)) ) {
LOGDEB1(("MimeHandlerMbox: msgnum %d, " LOGDEB1(("MimeHandlerMbox: msgnum %d, "
"From_ at line %d: [%s]\n", m_msgnum, m_lineno, line)); "From_ at line %d: [%s]\n", m_msgnum, m_lineno, line));
m_offsets.push_back(message_end); m_offsets.push_back(message_end);