]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
Updates for 1.7 release.
[nmh] / sbr / m_getfld.c
index 683db1755ad7a8ad315bc90e2d52b76b768e115e..d74f3869a3fc2f079d218e69a08a0c83bbc45450 100644 (file)
@@ -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,12 +882,16 @@ 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) {
-       if ((*cp = Getc (s)) == EOF) {
+       int c2;
+
+       if ((c2 = Getc (s)) == EOF) {
            *cp = '\0';
            break;
        }
+       *cp = c2;
     }
 
     if (i != s->edelimlen  ||
@@ -891,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;
     }