X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/e69e7a5cd492b55ef5c230bae5ba26bd989df65f..c4db59aa4b58bca9cd146ae30f507c16218a67d7:/sbr/m_getfld.c diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index a1f8c31d..0fe55499 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -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() - 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 @@ -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 ". - * "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 - * 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. @@ -268,7 +268,8 @@ void 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; @@ -450,12 +451,12 @@ read_more (m_getfld_state_t s) { but EOF is typically 0xffffffff. */ static int Getc (m_getfld_state_t s) { - if (s->end - s->readpos < 1 && read_more (s) == 0) { + if ((s->end - s->readpos < 1 && read_more (s) == 0) || + s->readpos >= s->end) return EOF; - } else { - ++s->bytes_read; - return s->readpos < s->end ? (unsigned char) *s->readpos++ : EOF; - } + + s->bytes_read++; + return (unsigned char)*s->readpos++; } static int @@ -489,17 +490,17 @@ m_getfld (m_getfld_state_t *gstate, char name[NAMESZ], char *buf, int *bufsz, 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 */ - 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); @@ -510,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 */ - 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 */ - 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); @@ -797,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 "; - 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; @@ -830,9 +833,9 @@ m_unknown(m_getfld_state_t *gstate, FILE *iob) 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); } @@ -880,9 +883,8 @@ m_Eom (m_getfld_state_t s) 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;