]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
Garbage-collect all of this unused code.
[nmh] / sbr / m_getfld.c
index c6716284d7f65732dc4575461e4aa75d82f0ad90..4da2f3eeb34c8fd93fb8e2527b7331a7f5a40d22 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;
 }
@@ -313,7 +306,10 @@ void m_getfld_state_destroy (m_getfld_state_t *gstate) {
     m_getfld_state_t s = *gstate;
 
     if (s) {
     m_getfld_state_t s = *gstate;
 
     if (s) {
-       if (s->fdelim) free (s->fdelim-1);
+       if (s->fdelim) {
+           free (s->fdelim-1);
+           free (s->pat_map);
+       }
        free (s);
        *gstate = 0;
     }
        free (s);
        *gstate = 0;
     }
@@ -431,7 +427,7 @@ read_more (m_getfld_state_t s) {
     size_t num_read;
 
     if (retain < s->end - s->readpos) retain = s->end - s->readpos;
     size_t num_read;
 
     if (retain < s->end - s->readpos) retain = s->end - s->readpos;
-    /* assert (retain <= s->readpos - s->msg_buf <= sizeof msg_buf); */
+    assert (retain <= s->readpos - s->msg_buf);
 
     /* Move what we want to retain at end of the buffer to the beginning. */
     memmove (s->msg_buf, s->readpos - retain, retain);
 
     /* Move what we want to retain at end of the buffer to the beginning. */
     memmove (s->msg_buf, s->readpos - retain, retain);
@@ -448,29 +444,21 @@ read_more (m_getfld_state_t s) {
    but EOF is typically 0xffffffff. */
 static int
 Getc (m_getfld_state_t s) {
    but EOF is typically 0xffffffff. */
 static int
 Getc (m_getfld_state_t s) {
-    if (s->end - s->readpos < 1) {
-       if (read_more (s) == 0) {
-           /* Pretend that we read a character.  That's what stdio does. */
-           ++s->readpos;
-           return EOF;
-       }
+    if (s->end - s->readpos < 1  &&  read_more (s) == 0) {
+        return EOF;
+    } else {
+        ++s->bytes_read;
+        return s->readpos < s->end  ?  (unsigned char) *s->readpos++  :  EOF;
     }
     }
-
-    ++s->bytes_read;
-    return s->readpos < s->end  ?  (unsigned char) *s->readpos++  :  EOF;
 }
 
 static int
 Peek (m_getfld_state_t s) {
 }
 
 static int
 Peek (m_getfld_state_t s) {
-    if (s->end - s->readpos < 1) {
-       if (read_more (s) == 0) {
-           /* Pretend that we read a character.  That's what stdio does. */
-           ++s->readpos;
-           return EOF;
-       }
+    if (s->end - s->readpos < 1  &&  read_more (s) == 0) {
+        return EOF;
+    } else {
+        return s->readpos < s->end  ?  (unsigned char) *s->readpos  :  EOF;
     }
     }
-
-    return s->readpos < s->end  ?  (unsigned char) *s->readpos  :  EOF;
 }
 
 static int
 }
 
 static int
@@ -501,14 +489,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;
@@ -521,13 +507,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;
@@ -627,12 +611,21 @@ 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 (max < n) {
                }
 
                if (c != EOF) c = Peek (s);
                if (max < n) {
-                   /* the dest buffer is full */
+                   /* The dest buffer is full.  Need to back the read
+                      pointer up by one because when m_getfld() is
+                      reentered, it will read a character.  Then
+                      we'll jump right to the FLDPLUS handling code,
+                      which will not store that character, but
+                      instead move on to the next one. */
+                   if (s->readpos > s->msg_buf) {
+                       --s->readpos;
+                       --s->bytes_read;
+                   }
                    s->state = FLDPLUS;
                    finished = 1;
                } else if (c != ' '  &&  c != '\t') {
                    s->state = FLDPLUS;
                    finished = 1;
                } else if (c != ' '  &&  c != '\t') {
@@ -787,8 +780,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;
        }
     }
 
        }
     }
 
@@ -799,6 +795,7 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
     } else {
        /* not a Unix style maildrop */
        s->readpos -= s->bytes_read;
     } else {
        /* not a Unix style maildrop */
        s->readpos -= s->bytes_read;
+       s->bytes_read = 0;
        delimstr = mmdlm2;
        s->msg_style = MS_MMDF;
     }
        delimstr = mmdlm2;
        s->msg_style = MS_MMDF;
     }
@@ -820,7 +817,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;
@@ -837,37 +834,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;
        }
     }
 
        }
     }
 
@@ -883,10 +868,12 @@ m_Eom (m_getfld_state_t s, int c)
           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;
           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;
        return 0;
     }
 
     if (s->msg_style == MS_MBOX) {
        return 0;
     }
 
     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;