X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/278ab4487e14f01d66c6c7c2979ee8a4c645c05d..1a2ef2eed6ab723cbf2280c01cb6e1a0500d4001:/sbr/m_getfld.c diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index f7a7acb9..d74f3869 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -205,6 +205,14 @@ static int m_Eom (m_getfld_state_t); #define eom(c,s) (s->msg_style != MS_DEFAULT && \ ((c) == *s->msg_delim && m_Eom(s))) +/* + * Maildrop styles + */ +#define MS_DEFAULT 0 /* default (one msg per file) */ +#define MS_UNKNOWN 1 /* type not known yet */ +#define MS_MBOX 2 /* Unix-style "from" lines */ +#define MS_MMDF 3 /* string MMDF_DELIM */ + /* This replaces the old approach, with its direct access to stdio * internals. It uses one fread() to load a buffer that we manage. * @@ -874,6 +882,7 @@ m_Eom (m_getfld_state_t s) int i; char text[MAX_DELIMITER_SIZE]; char *cp; + int adjust = 1; for (i = 0, cp = text; i < s->edelimlen; ++i, ++cp) { int c2; @@ -882,7 +891,7 @@ m_Eom (m_getfld_state_t s) *cp = '\0'; break; } - *cp = c2; + *cp = c2; } if (i != s->edelimlen || @@ -894,11 +903,19 @@ m_Eom (m_getfld_state_t s) return 1; } + if (i <= 2 && s->msg_style == MS_MBOX && + i != s->edelimlen && ! strncmp(text, s->fdelim, i)) { + /* If all or part of fdelim appeared at the end of the file, + back up even more so that the bytes are included in the + message. */ + adjust = 2; + } + /* Did not find delimiter, so restore the read position. Note that on input, a character had already been read with Getc(). It will be unget by m_getfld () on return. */ - s->readpos -= s->bytes_read - 1; - s->bytes_read = 1; + s->readpos -= s->bytes_read - adjust; + s->bytes_read = adjust; return 0; }