]> diplodocus.org Git - nmh/blobdiff - sbr/m_getfld.c
Replace getcpy() with mh_xstrdup() where the string isn't NULL.
[nmh] / sbr / m_getfld.c
index b09605474e44d88d4f83970585a107dd3bfaa31d..2e1ed998791fd638d2fd381774e31505545b7527 100644 (file)
@@ -90,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.
@@ -228,7 +228,7 @@ struct m_getfld_state {
     char *end;  /* One past the last character read in. */
     /* The following support tracking of the read position in the
        input file stream so that callers can interleave m_getfld()
     char *end;  /* One past the last character read in. */
     /* The following support tracking of the read position in the
        input file stream so that callers can interleave m_getfld()
-       calls with ftell() and fseek().  ytes_read replaces the old
+       calls with ftell() and fseek().  bytes_read replaces the old
        m_getfld() msg_count global.  last_caller_pos is stored when
        leaving m_getfld()/m_unknown(), then checked on the next entry.
        last_internal_pos is used to remember the position used
        m_getfld() msg_count global.  last_caller_pos is stored when
        leaving m_getfld()/m_unknown(), then checked on the next entry.
        last_internal_pos is used to remember the position used
@@ -245,10 +245,10 @@ struct m_getfld_state {
      * The "full" delimiter string for a packed maildrop consists
      * of a newline followed by the actual delimiter.  E.g., the
      * full string for a Unix maildrop would be: "\n\nFrom ".
      * The "full" delimiter string for a packed maildrop consists
      * of a newline followed by the actual delimiter.  E.g., the
      * full string for a Unix maildrop would be: "\n\nFrom ".
-     * "Fdelim" points to the start of the full string and is used
+     * "fdelim" points to the start of the full string and is used
      * in the BODY case of the main routine to search the buffer for
      * a possible eom.  Msg_delim points to the first character of
      * in the BODY case of the main routine to search the buffer for
      * a possible eom.  Msg_delim points to the first character of
-     * the actual delim. string (i.e., fdelim+1).  Edelim
+     * the actual delim. string (i.e., fdelim+1).  edelim
      * points to the 2nd character of actual delimiter string.  It
      * is used in m_Eom because the first character of the string
      * has been read and matched before m_Eom is called.
      * points to the 2nd character of actual delimiter string.  It
      * is used in m_Eom because the first character of the string
      * has been read and matched before m_Eom is called.
@@ -268,7 +268,8 @@ void
 m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) {
     m_getfld_state_t s;
 
 m_getfld_state_init (m_getfld_state_t *gstate, FILE *iob) {
     m_getfld_state_t s;
 
-    s = *gstate = (m_getfld_state_t) mh_xmalloc(sizeof (struct m_getfld_state));
+    NEW(s);
+    *gstate = s;
     s->readpos = s->end = s->msg_buf;
     s->bytes_read = s->total_bytes_read = 0;
     s->last_caller_pos = s->last_internal_pos = 0;
     s->readpos = s->end = s->msg_buf;
     s->bytes_read = s->total_bytes_read = 0;
     s->last_caller_pos = s->last_internal_pos = 0;
@@ -347,7 +348,8 @@ void m_getfld_state_destroy (m_getfld_state_t *gstate) {
 static void
 enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
     m_getfld_state_t s;
 static void
 enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
     m_getfld_state_t s;
-    off_t pos = ftello (iob);
+    off_t pos;
+    off_t pos_movement;
 
     if (! *gstate) {
        m_getfld_state_init (gstate, iob);
 
     if (! *gstate) {
        m_getfld_state_init (gstate, iob);
@@ -363,46 +365,51 @@ enter_getfld (m_getfld_state_t *gstate, FILE *iob) {
        readpos shift code being currently unused. */
     s->iob = iob;
 
        readpos shift code being currently unused. */
     s->iob = iob;
 
-    if (s->track_filepos  &&  (pos != 0  ||  s->last_internal_pos != 0)) {
-       if (s->last_internal_pos == 0) {
-           s->total_bytes_read = pos;
-       } else {
-           off_t pos_movement = pos - s->last_caller_pos; /* Can be < 0. */
-
-           if (pos_movement == 0) {
-               pos = s->last_internal_pos;
-           } else {
-               /* The current file stream position differs from the
-                  last one, so caller must have called ftell/o().
-                  Or, this is the first call and the file position
-                  was not at 0. */
-
-               if (s->readpos + pos_movement >= s->msg_buf  &&
-                   s->readpos + pos_movement < s->end) {
-                   /* This is currently unused.  It could be used by
-                      parse_mime() if it was changed to use a global
-                      m_getfld_state. */
-                   /* We can shift readpos and remain within the
-                      bounds of msg_buf. */
-                   s->readpos += pos_movement;
-                   s->total_bytes_read += pos_movement;
-                   pos = s->last_internal_pos;
-               } else {
-                   size_t num_read;
-
-                   /* This seek skips past an integral number of
-                      chunks of size MSG_INPUT_SIZE. */
-                   fseeko (iob, pos/MSG_INPUT_SIZE * MSG_INPUT_SIZE, SEEK_SET);
-                   num_read = fread (s->msg_buf, 1, MSG_INPUT_SIZE, iob);
-                   s->readpos = s->msg_buf  +  pos % MSG_INPUT_SIZE;
-                   s->end = s->msg_buf + num_read;
-                   s->total_bytes_read = pos;
-               }
-           }
+    if (!s->track_filepos)
+        return;
 
 
-           fseeko (iob, pos, SEEK_SET);
-       }
+    pos = ftello(iob);
+    if (pos == 0 && s->last_internal_pos == 0)
+        return;
+
+    if (s->last_internal_pos == 0) {
+        s->total_bytes_read = pos;
+        return;
+    }
+
+    pos_movement = pos - s->last_caller_pos; /* Can be < 0. */
+    if (pos_movement == 0) {
+        pos = s->last_internal_pos;
+    } else {
+        /* The current file stream position differs from the
+           last one, so caller must have called ftell/o().
+           Or, this is the first call and the file position
+           was not at 0. */
+
+        if (s->readpos + pos_movement >= s->msg_buf  &&
+            s->readpos + pos_movement < s->end) {
+            /* This is currently unused.  It could be used by
+               parse_mime() if it was changed to use a global
+               m_getfld_state. */
+            /* We can shift readpos and remain within the
+               bounds of msg_buf. */
+            s->readpos += pos_movement;
+            s->total_bytes_read += pos_movement;
+            pos = s->last_internal_pos;
+        } else {
+            size_t num_read;
+
+            /* This seek skips past an integral number of
+               chunks of size MSG_INPUT_SIZE. */
+            fseeko (iob, pos/MSG_INPUT_SIZE * MSG_INPUT_SIZE, SEEK_SET);
+            num_read = fread (s->msg_buf, 1, MSG_INPUT_SIZE, iob);
+            s->readpos = s->msg_buf  +  pos % MSG_INPUT_SIZE;
+            s->end = s->msg_buf + num_read;
+            s->total_bytes_read = pos;
+        }
     }
     }
+
+    fseeko (iob, pos, SEEK_SET);
 }
 
 static void
 }
 
 static void
@@ -444,29 +451,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) ||
+        s->readpos >= s->end)
+        return EOF;
 
 
-    ++s->bytes_read;
-    return s->readpos < s->end  ?  (unsigned char) *s->readpos++  :  EOF;
+    s->bytes_read++;
+    return (unsigned char)*s->readpos++;
 }
 
 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
@@ -485,23 +484,23 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
           FILE *iob)
 {
     m_getfld_state_t s;
           FILE *iob)
 {
     m_getfld_state_t s;
-    register char *cp;
-    register int max, n, c;
+    char *cp;
+    int max, n, c;
 
     enter_getfld (gstate, iob);
     s = *gstate;
 
 
     enter_getfld (gstate, iob);
     s = *gstate;
 
-    if ((c = Getc(s)) < 0) {
+    if ((c = Getc(s)) == EOF) {
        *bufsz = *buf = 0;
        leave_getfld (s);
        return s->state = FILEEOF;
     }
     if (eom (c, s)) {
        /* flush null messages */
        *bufsz = *buf = 0;
        leave_getfld (s);
        return s->state = FILEEOF;
     }
     if (eom (c, s)) {
        /* flush null messages */
-       while ((c = Getc(s)) >= 0 && eom (c, s))
+       while ((c = Getc(s)) != EOF && eom (c, s))
            ;
 
            ;
 
-       if (c >= 0)
+       if (c != EOF)
            Ungetc(c, s);
        *bufsz = *buf = 0;
        leave_getfld (s);
            Ungetc(c, s);
        *bufsz = *buf = 0;
        leave_getfld (s);
@@ -512,13 +511,14 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz,
        case FLD:
            if (c == '\n' || c == '-') {
                /* we hit the header/body separator */
        case FLD:
            if (c == '\n' || c == '-') {
                /* we hit the header/body separator */
-               while (c != '\n' && (c = Getc(s)) >= 0) continue;
+               while (c != '\n' && (c = Getc(s)) != EOF)
+                    ;
 
 
-               if (c < 0 || (c = Getc(s)) < 0 || eom (c, s)) {
+               if (c == EOF || (c = Getc(s)) == EOF || eom (c, s)) {
                    /* flush null messages */
                    /* flush null messages */
-                   while ((c = Getc(s)) >= 0 && eom (c, s))
+                   while ((c = Getc(s)) != EOF && eom (c, s))
                        ;
                        ;
-                   if (c >= 0)
+                   if (c != EOF)
                        Ungetc(c, s);
                    *bufsz = *buf = 0;
                    leave_getfld (s);
                        Ungetc(c, s);
                    *bufsz = *buf = 0;
                    leave_getfld (s);
@@ -762,11 +762,11 @@ void
 m_unknown(m_getfld_state_t *gstate, FILE *iob)
 {
     m_getfld_state_t s;
 m_unknown(m_getfld_state_t *gstate, FILE *iob)
 {
     m_getfld_state_t s;
-    register int c;
+    int c;
     char text[MAX_DELIMITER_SIZE];
     char from[] = "From ";
     char text[MAX_DELIMITER_SIZE];
     char from[] = "From ";
-    register char *cp;
-    register char *delimstr;
+    char *cp;
+    char *delimstr;
     unsigned int i;
 
     enter_getfld (gstate, iob);
     unsigned int i;
 
     enter_getfld (gstate, iob);
@@ -799,7 +799,8 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
     if (i == sizeof from-1  &&  strncmp (text, "From ", sizeof from-1) == 0) {
        s->msg_style = MS_MBOX;
        delimstr = "\nFrom ";
     if (i == sizeof from-1  &&  strncmp (text, "From ", sizeof from-1) == 0) {
        s->msg_style = MS_MBOX;
        delimstr = "\nFrom ";
-       while ((c = Getc (s)) != '\n' && c >= 0) continue;
+       while ((c = Getc(s)) != EOF && c != '\n')
+            ;
     } else {
        /* not a Unix style maildrop */
        s->readpos -= s->bytes_read;
     } else {
        /* not a Unix style maildrop */
        s->readpos -= s->bytes_read;
@@ -832,9 +833,9 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
 
     if (s->msg_style == MS_MMDF) {
        /* flush extra msg hdrs */
 
     if (s->msg_style == MS_MMDF) {
        /* flush extra msg hdrs */
-       while ((c = Getc(s)) >= 0 && eom (c, s))
+       while ((c = Getc(s)) != EOF && eom (c, s))
            ;
            ;
-       if (c >= 0)
+       if (c != EOF)
            Ungetc(c, s);
     }
 
            Ungetc(c, s);
     }
 
@@ -849,7 +850,7 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob)
 static int
 m_Eom (m_getfld_state_t s)
 {
 static int
 m_Eom (m_getfld_state_t s)
 {
-    register int i;
+    int i;
     char text[MAX_DELIMITER_SIZE];
     char *cp;
 
     char text[MAX_DELIMITER_SIZE];
     char *cp;
 
@@ -882,9 +883,8 @@ m_Eom (m_getfld_state_t s)
 
     if (s->msg_style == MS_MBOX) {
        int c;
 
     if (s->msg_style == MS_MBOX) {
        int c;
-       while ((c = Getc (s)) != '\n')
-           if (c < 0)
-               break;
+       while ((c = Getc(s)) != EOF && c != '\n')
+            ;
     }
 
     return 1;
     }
 
     return 1;
@@ -894,11 +894,11 @@ m_Eom (m_getfld_state_t s)
 static char *
 matchc(int patln, char *pat, int strln, char *str)
 {
 static char *
 matchc(int patln, char *pat, int strln, char *str)
 {
-       register char *es = str + strln - patln;
-       register char *sp;
-       register char *pp;
-       register char *ep = pat + patln;
-       register char pc = *pat++;
+       char *es = str + strln - patln;
+       char *sp;
+       char *pp;
+       char *ep = pat + patln;
+       char pc = *pat++;
 
        for(;;) {
                while (pc != *str++)
 
        for(;;) {
                while (pc != *str++)