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.
- 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
int edelimlen
char *msg_delim
int msg_style
- int (*eom_action)(int)
Usage
=====
* 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 && \
- (((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.
* 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 {
int fdelimlen;
char *edelim;
int edelimlen;
- int (*eom_action)(int);
int state;
int track_filepos;
};
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;
}
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;
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;
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);
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;
+ } else {
+ *cp = c;
}
}
* 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;
}
-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
-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) {
- if ((*cp = Getc (s)) == EOF) {
+ int c2;
+
+ if ((c2 = Getc (s)) == EOF) {
+ *cp = '\0';
break;
+ } else {
+ *cp = c2;
}
}
}
if (s->msg_style == MS_MBOX) {
+ int c;
while ((c = Getc (s)) != '\n')
if (c < 0)
break;