]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
Create $MH_OBJ_DIR/test/testdir if it doesn't already exist. This
[nmh] / sbr / m_getfld.c
index 9884ba44980e5c4e87e73cc5f2b420114995ae56..9315059d83ead0e4e5f8e6b0fcee27c5910b1fd9 100644 (file)
    state to FLD.
 
    void m_unknown(FILE *iob):  Determines the message delimiter string
    state to FLD.
 
    void m_unknown(FILE *iob):  Determines the message delimiter string
-   for the maildrop.  Called by inc, scan, and msh when reading from a
+   for the maildrop.  Called by inc and scan when reading from a
    maildrop file.
 
    maildrop file.
 
-   void m_eomsbr (int (*action)(int)):  Sets the hook to check for end
-   of message in a maildrop.  Called only by msh.
-
    State variables
    ===============
    m_getfld() retains state internally between calls in the
    State variables
    ===============
    m_getfld() retains state internally between calls in the
@@ -61,7 +58,6 @@
      int edelimlen
      char *msg_delim
      int msg_style
      int edelimlen
      char *msg_delim
      int msg_style
-     int (*eom_action)(int)
 
    Usage
    =====
 
    Usage
    =====
@@ -94,7 +90,7 @@
    be parsed as well.  Unfortunately the speed issue finally caught up with
    us since this routine is at the very heart of MH.
 
    be parsed as well.  Unfortunately the speed issue finally caught up with
    us since this routine is at the very heart of MH.
 
-   To speed things up considerably, the routine Eom() was made an auxilary
+   To speed things up considerably, the routine Eom() was made an auxiliary
    function called by the macro eom().  Unless we are bursting a maildrop,
    the eom() macro returns FALSE saying we aren't at the end of the
    message.
    function called by the macro eom().  Unless we are bursting a maildrop,
    the eom() macro returns FALSE saying we aren't at the end of the
    message.
  * static prototypes
  */
 struct m_getfld_state;
  * static prototypes
  */
 struct m_getfld_state;
-static int m_Eom (m_getfld_state_t, int);
+static int m_Eom (m_getfld_state_t);
 static char *matchc(int, char *, int, char *);
 
 #define eom(c,s)       (s->msg_style != MS_DEFAULT && \
 static char *matchc(int, char *, int, char *);
 
 #define eom(c,s)       (s->msg_style != MS_DEFAULT && \
-                        (((c) == *s->msg_delim && m_Eom(s,c)) || \
-                         (s->eom_action && (*s->eom_action)(c))))
+                        ((c) == *s->msg_delim && m_Eom(s)))
 
 /* This replaces the old approach, with its direct access to stdio
  * internals.  It uses one fread() to load a buffer that we manage.
 
 /* This replaces the old approach, with its direct access to stdio
  * internals.  It uses one fread() to load a buffer that we manage.
@@ -222,9 +217,9 @@ static char *matchc(int, char *, int, char *);
  * separate messages in a maildrop, such as mbox "From ".
  *
  * Some of the tests in the test suite assume a MSG_INPUT_SIZE
  * separate messages in a maildrop, such as mbox "From ".
  *
  * Some of the tests in the test suite assume a MSG_INPUT_SIZE
- * of 4096.
+ * of 8192.
  */
  */
-#define MSG_INPUT_SIZE 4096
+#define MSG_INPUT_SIZE NMH_BUFSIZ
 #define MAX_DELIMITER_SIZE 5
 
 struct m_getfld_state {
 #define MAX_DELIMITER_SIZE 5
 
 struct m_getfld_state {
@@ -264,7 +259,6 @@ struct m_getfld_state {
     int fdelimlen;
     char *edelim;
     int edelimlen;
     int fdelimlen;
     char *edelim;
     int edelimlen;
-    int (*eom_action)(int);
     int state;
     int track_filepos;
 };
     int state;
     int track_filepos;
 };
@@ -284,7 +278,6 @@ m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) {
     s->msg_delim = "";
     s->fdelim = s->delimend = s->edelim = NULL;
     s->fdelimlen = s->edelimlen = 0;
     s->msg_delim = "";
     s->fdelim = s->delimend = s->edelim = NULL;
     s->fdelimlen = s->edelimlen = 0;
-    s->eom_action = NULL;
     s->state = FLD;
     s->track_filepos = 0;
 }
     s->state = FLD;
     s->track_filepos = 0;
 }
@@ -504,14 +497,12 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
        return s->state = FILEEOF;
     }
     if (eom (c, s)) {
        return s->state = FILEEOF;
     }
     if (eom (c, s)) {
-       if (! s->eom_action) {
-           /* flush null messages */
-           while ((c = Getc(s)) >= 0 && eom (c, s))
-               ;
+       /* flush null messages */
+       while ((c = Getc(s)) >= 0 && eom (c, s))
+           ;
 
 
-           if (c >= 0)
-               Ungetc(c, s);
-       }
+       if (c >= 0)
+           Ungetc(c, s);
        *bufsz = *buf = 0;
        leave_getfld (s);
        return s->state = FILEEOF;
        *bufsz = *buf = 0;
        leave_getfld (s);
        return s->state = FILEEOF;
@@ -524,13 +515,11 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
                while (c != '\n' && (c = Getc(s)) >= 0) continue;
 
                if (c < 0 || (c = Getc(s)) < 0 || eom (c, s)) {
                while (c != '\n' && (c = Getc(s)) >= 0) continue;
 
                if (c < 0 || (c = Getc(s)) < 0 || eom (c, s)) {
-                   if (! s->eom_action) {
-                       /* flush null messages */
-                       while ((c = Getc(s)) >= 0 && eom (c, s))
-                           ;
-                       if (c >= 0)
-                           Ungetc(c, s);
-                   }
+                   /* flush null messages */
+                   while ((c = Getc(s)) >= 0 && eom (c, s))
+                       ;
+                   if (c >= 0)
+                       Ungetc(c, s);
                    *bufsz = *buf = 0;
                    leave_getfld (s);
                    return s->state = FILEEOF;
                    *bufsz = *buf = 0;
                    leave_getfld (s);
                    return s->state = FILEEOF;
@@ -630,7 +619,7 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
            n = 0;
            for (finished = 0; ! finished; ) {
                while (c != '\n'  &&  c != EOF  &&  n++ < max) {
            n = 0;
            for (finished = 0; ! finished; ) {
                while (c != '\n'  &&  c != EOF  &&  n++ < max) {
-                   *cp++ = c = Getc (s);
+                   if ((c = Getc (s)) != EOF) { *cp++ = c; }
                }
 
                if (c != EOF) c = Peek (s);
                }
 
                if (c != EOF) c = Peek (s);
@@ -799,8 +788,11 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
     s->msg_style = MS_UNKNOWN;
 
     for (i = 0, cp = text; i < sizeof text; ++i, ++cp) {
     s->msg_style = MS_UNKNOWN;
 
     for (i = 0, cp = text; i < sizeof text; ++i, ++cp) {
-       if ((*cp = Getc (s)) == EOF) {
+       if ((c = Getc (s)) == EOF) {
+           *cp = '\0';
            break;
            break;
+       } else {
+           *cp = c;
        }
     }
 
        }
     }
 
@@ -833,7 +825,7 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
      * separator) or the last char (since the matchc would have found it
      * if it was a real delim).
      */
      * separator) or the last char (since the matchc would have found it
      * if it was a real delim).
      */
-    s->pat_map = (char **) calloc (256, sizeof(char *));
+    s->pat_map = (char **) mh_xcalloc (256, sizeof(char *));
 
     for (cp = s->fdelim + 1; cp < s->delimend; cp++ )
        s->pat_map[(unsigned char)*cp] = cp;
 
     for (cp = s->fdelim + 1; cp < s->delimend; cp++ )
        s->pat_map[(unsigned char)*cp] = cp;
@@ -850,37 +842,25 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
 }
 
 
 }
 
 
-void
-m_eomsbr (m_getfld_state_t s, int (*action)(int))
-{
-    if ((s->eom_action = action)) {
-       s->msg_style = MS_MSH;
-       *s->msg_delim = 0;
-       s->fdelimlen = 1;
-       s->delimend = s->fdelim;
-    } else {
-       s->msg_style = MS_MMDF;
-       s->msg_delim = s->fdelim + 1;
-       s->fdelimlen = strlen (s->fdelim);
-       s->delimend = s->msg_delim + s->edelimlen;
-    }
-}
-
-
 /*
  * test for msg delimiter string
  */
 
 static int
 /*
  * test for msg delimiter string
  */
 
 static int
-m_Eom (m_getfld_state_t s, int c)
+m_Eom (m_getfld_state_t s)
 {
     register int i;
     char text[MAX_DELIMITER_SIZE];
     char *cp;
 
     for (i = 0, cp = text; i < s->edelimlen; ++i, ++cp) {
 {
     register int i;
     char text[MAX_DELIMITER_SIZE];
     char *cp;
 
     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;
            break;
+       } else {
+           *cp = c2;
        }
     }
 
        }
     }
 
@@ -901,6 +881,7 @@ m_Eom (m_getfld_state_t s, int c)
     }
 
     if (s->msg_style == MS_MBOX) {
     }
 
     if (s->msg_style == MS_MBOX) {
+       int c;
        while ((c = Getc (s)) != '\n')
            if (c < 0)
                break;
        while ((c = Getc (s)) != '\n')
            if (c < 0)
                break;