}
switch (state) {
- case FLDEOF:
- case BODYEOF:
- case FLD:
- if (c == '\n' || c == '-') {
- /* we hit the header/body separator */
- while (c != '\n' && (c = getc(iob)) >= 0)
- ;
-
- if (c < 0 || (c = getc(iob)) < 0 || eom(c, iob)) {
- if (! eom_action) {
- /* flush null messages */
- while ((c = getc(iob)) >= 0 && eom(c, iob))
- ;
- if (c >= 0)
- ungetc(c, iob);
- }
- msg_count = 0;
- *buf = 0;
- return FILEEOF;
+ case FLDEOF:
+ case BODYEOF:
+ case FLD:
+ if (c == '\n' || c == '-') {
+ /* we hit the header/body separator */
+ while (c != '\n' && (c = getc(iob)) >= 0)
+ ;
+
+ if (c < 0 || (c = getc(iob)) < 0 || eom(c, iob)) {
+ if (! eom_action) {
+ /* flush null messages */
+ while ((c = getc(iob)) >= 0 && eom(c, iob))
+ ;
+ if (c >= 0)
+ ungetc(c, iob);
}
- state = BODY;
- goto body;
+ msg_count = 0;
+ *buf = 0;
+ return FILEEOF;
}
- /*
- ** get the name of this component. take characters up
- ** to a ':', a newline or NAMESZ-1 characters,
- ** whichever comes first.
- */
- cp = name;
- i = NAMESZ - 1;
- for (;;) {
+ state = BODY;
+ goto body;
+ }
+ /*
+ ** get the name of this component. take characters up
+ ** to a ':', a newline or NAMESZ-1 characters,
+ ** whichever comes first.
+ */
+ cp = name;
+ i = NAMESZ - 1;
+ for (;;) {
#ifdef LINUX_STDIO
- bp = sp = (unsigned char *) iob->_IO_read_ptr - 1;
- j = (cnt = ((long) iob->_IO_read_end -
- (long) iob->_IO_read_ptr) + 1) < i ? cnt : i;
+ bp = sp = (unsigned char *) iob->_IO_read_ptr - 1;
+ j = (cnt = ((long) iob->_IO_read_end -
+ (long) iob->_IO_read_ptr) + 1) < i ? cnt : i;
#elif defined(__DragonFly__)
- bp = sp = (unsigned char *) ((struct __FILE_public *)iob)->_p - 1;
- j = (cnt = ((struct __FILE_public *)iob)->_r+1) < i ? cnt : i;
+ bp = sp = (unsigned char *) ((struct __FILE_public *)iob)->_p - 1;
+ j = (cnt = ((struct __FILE_public *)iob)->_r+1) < i ? cnt : i;
#else
- bp = sp = (unsigned char *) iob->_ptr - 1;
- j = (cnt = iob->_cnt+1) < i ? cnt : i;
+ bp = sp = (unsigned char *) iob->_ptr - 1;
+ j = (cnt = iob->_cnt+1) < i ? cnt : i;
#endif
- while (--j >= 0 && (c = *bp++) != ':' && c != '\n')
- *cp++ = c;
+ while (--j >= 0 && (c = *bp++) != ':' && c != '\n')
+ *cp++ = c;
- j = bp - sp;
- if ((cnt -= j) <= 0) {
+ j = bp - sp;
+ if ((cnt -= j) <= 0) {
#ifdef LINUX_STDIO
- iob->_IO_read_ptr = iob->_IO_read_end;
- if (__underflow(iob) == EOF) {
+ iob->_IO_read_ptr = iob->_IO_read_end;
+ if (__underflow(iob) == EOF) {
#elif defined(__DragonFly__)
- if (__srget(iob) == EOF) {
+ if (__srget(iob) == EOF) {
#else
- if (_filbuf(iob) == EOF) {
+ if (_filbuf(iob) == EOF) {
#endif
- *cp = *buf = 0;
- advise(NULL, "eof encountered in field \"%s\"", name);
- return FMTERR;
- }
+ *cp = *buf = 0;
+ advise(NULL, "eof encountered in field \"%s\"", name);
+ return FMTERR;
+ }
#ifdef LINUX_STDIO
- iob->_IO_read_ptr++; /* NOT automatic in __underflow()! */
+ iob->_IO_read_ptr++; /* NOT automatic in __underflow()! */
#endif
- } else {
+ } else {
#ifdef LINUX_STDIO
- iob->_IO_read_ptr = bp + 1;
+ iob->_IO_read_ptr = bp + 1;
#elif defined(__DragonFly__)
- ((struct __FILE_public *)iob)->_p = bp + 1;
- ((struct __FILE_public *)iob)->_r = cnt - 1;
+ ((struct __FILE_public *)iob)->_p = bp + 1;
+ ((struct __FILE_public *)iob)->_r = cnt - 1;
#else
- iob->_ptr = bp + 1;
- iob->_cnt = cnt - 1;
+ iob->_ptr = bp + 1;
+ iob->_cnt = cnt - 1;
#endif
- }
- if (c == ':')
- break;
+ }
+ if (c == ':')
+ break;
+ /*
+ ** something went wrong. possibilities are:
+ ** . hit a newline (error)
+ ** . got more than namesz chars. (error)
+ ** . hit the end of the buffer. (loop)
+ */
+ if (c == '\n') {
/*
- ** something went wrong. possibilities are:
- ** . hit a newline (error)
- ** . got more than namesz chars. (error)
- ** . hit the end of the buffer. (loop)
+ ** We hit the end of the line without
+ ** seeing ':' to terminate the field name.
+ ** This is usually (always?) spam. But,
+ ** blowing up is lame, especially when
+ ** scan(1)ing a folder with such messages.
+ ** Pretend such lines are the first of
+ ** the body (at least mutt also handles
+ ** it this way).
*/
- if (c == '\n') {
- /*
- ** We hit the end of the line
- ** without seeing ':' to terminate
- ** the field name. This is usually
- ** (always?) spam. But, blowing
- ** up is lame, especially when
- ** scan(1)ing a folder with such
- ** messages. Pretend such lines are
- ** the first of the body (at least
- ** mutt also handles it this way).
- */
+ /*
+ ** See if buf can hold this line, since we
+ ** were assuming we had a buffer of NAMESZ,
+ ** not bufsz.
+ */
+ /* + 1 for the newline */
+ if (bufsz < j + 1) {
/*
- ** See if buf can hold this line,
- ** since we were assuming we had
- ** a buffer of NAMESZ, not bufsz.
- */
- /* + 1 for the newline */
- if (bufsz < j + 1) {
- /*
- ** No, it can't. Oh well,
- ** guess we'll blow up.
- */
- *cp = *buf = 0;
- advise(NULL, "eol encountered in field \"%s\"", name);
- state = FMTERR;
- goto finish;
- }
- memcpy(buf, name, j - 1);
- buf[j - 1] = '\n';
- buf[j] = '\0';
- /*
- ** mhparse.c:get_content wants to
- ** find the position of the body
- ** start, but it thinks there's a
- ** blank line between the header
- ** and the body (naturally!), so
- ** seek back so that things line
- ** up even though we don't have
- ** that blank line in this case.
- ** Simpler parsers (e.g. mhl)
- ** get extra newlines, but that
- ** should be harmless enough, right?
- ** This is a corrupt message anyway.
+ ** No, it can't. Oh well,
+ ** guess we'll blow up.
*/
- fseek(iob, ftell(iob) - 2, SEEK_SET);
- return BODY;
- }
- if ((i -= j) <= 0) {
*cp = *buf = 0;
- advise(NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 2);
- state = LENERR;
+ advise(NULL, "eol encountered in field \"%s\"", name);
+ state = FMTERR;
goto finish;
}
+ memcpy(buf, name, j - 1);
+ buf[j - 1] = '\n';
+ buf[j] = '\0';
+ /*
+ ** mhparse.c:get_content wants to find
+ ** the position of the body start, but
+ ** it thinks there's a blank line between
+ ** the header and the body (naturally!),
+ ** so seek back so that things line up
+ ** even though we don't have that blank
+ ** line in this case. Simpler parsers
+ ** (e.g. mhl) get extra newlines, but
+ ** that should be harmless enough, right?
+ ** This is a corrupt message anyway.
+ */
+ fseek(iob, ftell(iob) - 2, SEEK_SET);
+ return BODY;
}
+ if ((i -= j) <= 0) {
+ *cp = *buf = 0;
+ advise(NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 2);
+ state = LENERR;
+ goto finish;
+ }
+ }
- while (isspace(*--cp) && cp >= name)
- ;
- *++cp = 0;
- /* fall through */
-
- case FLDPLUS:
- /*
- ** get (more of) the text of a field. take
- ** characters up to the end of this field (newline
- ** followed by non-blank) or bufsz-1 characters.
- */
- cp = buf; i = bufsz-1;
- for (;;) {
+ while (isspace(*--cp) && cp >= name)
+ ;
+ *++cp = 0;
+ /* fall through */
+
+ case FLDPLUS:
+ /*
+ ** get (more of) the text of a field. take
+ ** characters up to the end of this field (newline
+ ** followed by non-blank) or bufsz-1 characters.
+ */
+ cp = buf; i = bufsz-1;
+ for (;;) {
#ifdef LINUX_STDIO
- cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
- bp = (unsigned char *) --iob->_IO_read_ptr;
+ cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
+ bp = (unsigned char *) --iob->_IO_read_ptr;
#elif defined(__DragonFly__)
- cnt = ((struct __FILE_public *)iob)->_r++;
- bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
+ cnt = ((struct __FILE_public *)iob)->_r++;
+ bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
#else
- cnt = iob->_cnt++;
- bp = (unsigned char *) --iob->_ptr;
+ cnt = iob->_cnt++;
+ bp = (unsigned char *) --iob->_ptr;
#endif
- c = cnt < i ? cnt : i;
- while ((ep = locc( c, bp, '\n' ))) {
- /*
- ** if we hit the end of this field,
- ** return.
- */
- if ((j = *++ep) != ' ' && j != '\t') {
+ c = cnt < i ? cnt : i;
+ while ((ep = locc( c, bp, '\n' ))) {
+ /*
+ ** if we hit the end of this field,
+ ** return.
+ */
+ if ((j = *++ep) != ' ' && j != '\t') {
#ifdef LINUX_STDIO
- j = ep - (unsigned char *) iob->_IO_read_ptr;
- memcpy(cp, iob->_IO_read_ptr, j);
- iob->_IO_read_ptr = ep;
+ j = ep - (unsigned char *) iob->_IO_read_ptr;
+ memcpy(cp, iob->_IO_read_ptr, j);
+ iob->_IO_read_ptr = ep;
#elif defined(__DragonFly__)
- j = ep - (unsigned char *) ((struct __FILE_public *)iob)->_p;
- memcpy(cp, ((struct __FILE_public *)iob)->_p, j);
- ((struct __FILE_public *)iob)->_p = ep;
- ((struct __FILE_public *)iob)->_r -= j;
+ j = ep - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+ memcpy(cp, ((struct __FILE_public *)iob)->_p, j);
+ ((struct __FILE_public *)iob)->_p = ep;
+ ((struct __FILE_public *)iob)->_r -= j;
#else
- j = ep - (unsigned char *) iob->_ptr;
- memcpy(cp, iob->_ptr, j);
- iob->_ptr = ep;
- iob->_cnt -= j;
+ j = ep - (unsigned char *) iob->_ptr;
+ memcpy(cp, iob->_ptr, j);
+ iob->_ptr = ep;
+ iob->_cnt -= j;
#endif
- cp += j;
- state = FLD;
- goto finish;
- }
- c -= ep - bp;
- bp = ep;
+ cp += j;
+ state = FLD;
+ goto finish;
}
- /*
- ** end of input or dest buffer - copy what
- ** we've found.
- */
+ c -= ep - bp;
+ bp = ep;
+ }
+ /*
+ ** end of input or dest buffer - copy what
+ ** we've found.
+ */
#ifdef LINUX_STDIO
- c += bp - (unsigned char *) iob->_IO_read_ptr;
- memcpy(cp, iob->_IO_read_ptr, c);
+ c += bp - (unsigned char *) iob->_IO_read_ptr;
+ memcpy(cp, iob->_IO_read_ptr, c);
#elif defined(__DragonFly__)
- c += bp - (unsigned char *) ((struct __FILE_public *)iob)->_p;
- memcpy(cp, ((struct __FILE_public *)iob)->_p, c);
+ c += bp - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+ memcpy(cp, ((struct __FILE_public *)iob)->_p, c);
#else
- c += bp - (unsigned char *) iob->_ptr;
- memcpy(cp, iob->_ptr, c);
+ c += bp - (unsigned char *) iob->_ptr;
+ memcpy(cp, iob->_ptr, c);
#endif
- i -= c;
- cp += c;
- if (i <= 0) {
- /* the dest buffer is full */
+ i -= c;
+ cp += c;
+ if (i <= 0) {
+ /* the dest buffer is full */
#ifdef LINUX_STDIO
- iob->_IO_read_ptr += c;
+ iob->_IO_read_ptr += c;
#elif defined(__DragonFly__)
- ((struct __FILE_public *)iob)->_r -= c;
- ((struct __FILE_public *)iob)->_p += c;
+ ((struct __FILE_public *)iob)->_r -= c;
+ ((struct __FILE_public *)iob)->_p += c;
#else
- iob->_cnt -= c;
- iob->_ptr += c;
+ iob->_cnt -= c;
+ iob->_ptr += c;
#endif
- state = FLDPLUS;
- break;
- }
- /*
- ** There's one character left in the input
- ** buffer. Copy it & fill the buffer.
- ** If the last char was a newline and the
- ** next char is not whitespace, this is
- ** the end of the field. Otherwise loop.
- */
- --i;
+ state = FLDPLUS;
+ break;
+ }
+ /*
+ ** There's one character left in the input
+ ** buffer. Copy it & fill the buffer.
+ ** If the last char was a newline and the
+ ** next char is not whitespace, this is
+ ** the end of the field. Otherwise loop.
+ */
+ --i;
#ifdef LINUX_STDIO
- *cp++ = j = *(iob->_IO_read_ptr + c);
- iob->_IO_read_ptr = iob->_IO_read_end;
- c = __underflow(iob);
- iob->_IO_read_ptr++; /* NOT automatic! */
+ *cp++ = j = *(iob->_IO_read_ptr + c);
+ iob->_IO_read_ptr = iob->_IO_read_end;
+ c = __underflow(iob);
+ iob->_IO_read_ptr++; /* NOT automatic! */
#elif defined(__DragonFly__)
- *cp++ =j = *(((struct __FILE_public *)iob)->_p + c);
- c = __srget(iob);
+ *cp++ =j = *(((struct __FILE_public *)iob)->_p + c);
+ c = __srget(iob);
#else
- *cp++ = j = *(iob->_ptr + c);
- c = _filbuf(iob);
+ *cp++ = j = *(iob->_ptr + c);
+ c = _filbuf(iob);
#endif
- if (c == EOF ||
- ((j == '\0' || j == '\n') && c != ' ' && c != '\t')) {
- if (c != EOF) {
+ if (c == EOF ||
+ ((j == '\0' || j == '\n') && c != ' ' && c != '\t')) {
+ if (c != EOF) {
#ifdef LINUX_STDIO
- --iob->_IO_read_ptr;
+ --iob->_IO_read_ptr;
#elif defined(__DragonFly__)
- --((struct __FILE_public *)iob)->_p;
- ++((struct __FILE_public *)iob)->_r;
+ --((struct __FILE_public *)iob)->_p;
+ ++((struct __FILE_public *)iob)->_r;
#else
- --iob->_ptr;
- ++iob->_cnt;
+ --iob->_ptr;
+ ++iob->_cnt;
#endif
- }
- state = FLD;
- break;
}
+ state = FLD;
+ break;
}
- break;
-
- case BODY:
- body:
- /*
- ** get the message body up to bufsz characters or
- ** the end of the message. Sleazy hack: if bufsz
- ** is negative we assume that we were called to
- ** copy directly into the output buffer and we
- ** don't add an eos.
- */
- i = (bufsz < 0) ? -bufsz : bufsz-1;
+ }
+ break;
+
+ case BODY:
+ body:
+ /*
+ ** get the message body up to bufsz characters or
+ ** the end of the message. Sleazy hack: if bufsz
+ ** is negative we assume that we were called to
+ ** copy directly into the output buffer and we
+ ** don't add an eos.
+ */
+ i = (bufsz < 0) ? -bufsz : bufsz-1;
#ifdef LINUX_STDIO
- bp = (unsigned char *) --iob->_IO_read_ptr;
- cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
+ bp = (unsigned char *) --iob->_IO_read_ptr;
+ cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
#elif defined(__DragonFly__)
- bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
- cnt = ++((struct __FILE_public *)iob)->_r;
+ bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
+ cnt = ++((struct __FILE_public *)iob)->_r;
#else
- bp = (unsigned char *) --iob->_ptr;
- cnt = ++iob->_cnt;
+ bp = (unsigned char *) --iob->_ptr;
+ cnt = ++iob->_cnt;
#endif
- c = (cnt < i ? cnt : i);
- if (msg_style != MS_DEFAULT && c > 1) {
+ c = (cnt < i ? cnt : i);
+ if (msg_style != MS_DEFAULT && c > 1) {
+ /*
+ ** packed maildrop - only take up to the (possible)
+ ** start of the next message. This "matchc" should
+ ** probably be a Boyer-Moore matcher for non-vaxen,
+ ** particularly since we have the alignment table
+ ** all built for the end-of-buffer test (next).
+ ** But our vax timings indicate that the "matchc"
+ ** instruction is 50% faster than a carefully coded
+ ** B.M. matcher for most strings. (So much for
+ ** elegant algorithms vs. brute force.) Since I
+ ** (currently) run MH on a vax, we use the matchc
+ ** instruction. --vj
+ */
+ if ((ep = matchc( fdelimlen, fdelim, c, bp )))
+ c = ep - bp + 1;
+ else {
/*
- ** packed maildrop - only take up to the
- ** (possible) start of the next message.
- ** This "matchc" should probably be a
- ** Boyer-Moore matcher for non-vaxen,
- ** particularly since we have the alignment
- ** table all built for the end-of-buffer
- ** test (next). But our vax timings
- ** indicate that the "matchc" instruction
- ** is 50% faster than a carefully coded
- ** B.M. matcher for most strings. (So much
- ** for elegant algorithms vs. brute force.)
- ** Since I (currently) run MH on a vax,
- ** we use the matchc instruction. --vj
+ ** There's no delim in the buffer but
+ ** there may be a partial one at the end.
+ ** If so, we want to leave it so the "eom"
+ ** check on the next call picks it up. Use a
+ ** modified Boyer-Moore matcher to make this
+ ** check relatively cheap. The first "if"
+ ** figures out what position in the pattern
+ ** matches the last character in the buffer.
+ ** The inner "while" matches the pattern
+ ** against the buffer, backwards starting
+ ** at that position. Note that unless the
+ ** buffer ends with one of the characters
+ ** in the pattern (excluding the first
+ ** and last), we do only one test.
*/
- if ((ep = matchc( fdelimlen, fdelim, c, bp )))
- c = ep - bp + 1;
- else {
- /*
- ** There's no delim in the buffer
- ** but there may be a partial one
- ** at the end. If so, we want
- ** to leave it so the "eom" check
- ** on the next call picks it up.
- ** Use a modified Boyer-Moore
- ** matcher to make this check
- ** relatively cheap. The first
- ** "if" figures out what position
- ** in the pattern matches the
- ** last character in the buffer.
- ** The inner "while" matches the
- ** pattern against the buffer,
- ** backwards starting at that
- ** position. Note that unless
- ** the buffer ends with one of
- ** the characters in the pattern
- ** (excluding the first and last),
- ** we do only one test.
- */
- ep = bp + c - 1;
- if ((sp = pat_map[*ep])) {
- do {
+ ep = bp + c - 1;
+ if ((sp = pat_map[*ep])) {
+ do {
+ /*
+ ** This if() is true unless
+ ** (a) the buffer is too
+ ** small to contain this
+ ** delimiter prefix,
+ ** or (b) it contains
+ ** exactly enough chars for
+ ** the delimiter prefix.
+ ** For case (a) obviously we
+ ** aren't going to match.
+ ** For case (b), if the
+ ** buffer really contained
+ ** exactly a delim prefix,
+ ** then the m_eom call
+ ** at entry should have
+ ** found it. Thus it's
+ ** not a delim and we know
+ ** we won't get a match.
+ */
+ if (((sp - fdelim) + 2) <= c) {
+ cp = sp;
/*
- ** This if() is
- ** true unless (a)
- ** the buffer is too
- ** small to contain
- ** this delimiter
- ** prefix, or (b)
- ** it contains
- ** exactly enough
- ** chars for the
- ** delimiter prefix.
- ** For case (a)
- ** obviously we
- ** aren't going
- ** to match.
- ** For case (b),
- ** if the buffer
- ** really contained
- ** exactly a delim
- ** prefix, then
- ** the m_eom call
- ** at entry should
- ** have found it.
- ** Thus it's not
- ** a delim and we
- ** know we won't
- ** get a match.
+ ** Unfortunately although fdelim has a preceding NUL
+ ** we can't use this as a sentinel in case the buffer
+ ** contains a NUL in exactly the wrong place (this
+ ** would cause us to run off the front of fdelim).
*/
- if (((sp - fdelim) + 2) <= c) {
- cp = sp;
- /*
- ** Unfortunately although fdelim has a preceding NUL
- ** we can't use this as a sentinel in case the buffer
- ** contains a NUL in exactly the wrong place (this
- ** would cause us to run off the front of fdelim).
- */
- while (*--ep == *--cp)
- if (cp < fdelim)
- break;
- if (cp < fdelim) {
- /* we matched the entire delim prefix,
- ** so only take the buffer up to there.
- ** we know ep >= bp -- check above prevents underrun
- */
- c = (ep - bp) + 2;
+ while (*--ep == *--cp)
+ if (cp < fdelim)
break;
- }
+ if (cp < fdelim) {
+ /* we matched the entire delim prefix,
+ ** so only take the buffer up to there.
+ ** we know ep >= bp -- check above prevents underrun
+ */
+ c = (ep - bp) + 2;
+ break;
}
- /* try matching one less char of delim string */
- ep = bp + c - 1;
- } while (--sp > fdelim);
- }
+ }
+ /* try matching one less char of delim string */
+ ep = bp + c - 1;
+ } while (--sp > fdelim);
}
}
- memcpy( buf, bp, c );
+ }
+ memcpy( buf, bp, c );
#ifdef LINUX_STDIO
- iob->_IO_read_ptr += c;
+ iob->_IO_read_ptr += c;
#elif defined(__DragonFly__)
- ((struct __FILE_public *)iob)->_r -= c;
- ((struct __FILE_public *)iob)->_p += c;
+ ((struct __FILE_public *)iob)->_r -= c;
+ ((struct __FILE_public *)iob)->_p += c;
#else
- iob->_cnt -= c;
- iob->_ptr += c;
+ iob->_cnt -= c;
+ iob->_ptr += c;
#endif
- if (bufsz < 0) {
- msg_count = c;
- return (state);
- }
- cp = buf + c;
- break;
+ if (bufsz < 0) {
+ msg_count = c;
+ return (state);
+ }
+ cp = buf + c;
+ break;
- default:
- adios(NULL, "m_getfld() called with bogus state of %d", state);
+ default:
+ adios(NULL, "m_getfld() called with bogus state of %d", state);
}
finish:
*cp = 0;
pos = ftell(iob);
if ((i = fread(text, sizeof *text, edelimlen, iob)) != edelimlen
- || strncmp(text, (char *)edelim, edelimlen)) {
+ || (strncmp(text, (char *)edelim, edelimlen)!=0)) {
if (i == 0 && msg_style == MS_MBOX)
/*
** the final newline in the (brain damaged) unix-format