]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
Removed recommendation from mhstore man page that users not put
[nmh] / sbr / m_getfld.c
index 45bcebabda08e16d2ded8eb582d821957bd2b527..d278e5288828917ca1f48e1259f2d5c68c59155b 100644 (file)
@@ -313,7 +313,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;
     }
@@ -627,12 +630,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') {
@@ -799,6 +811,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;
     }
@@ -883,6 +896,7 @@ 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;
     }
 
        return 0;
     }