#define BODY 3 /* Body returned with more to come */
#define FILEEOF 5 /* Reached end of input file */
+struct m_getfld_state;
+typedef struct m_getfld_state *m_getfld_state_t;
+
/*
* Maildrop styles
*/
char *m_backup (char *);
int m_convert (struct msgs *, char *);
char *m_draft (char *, char *, int, int *);
-void m_eomsbr (int (*)(int));
-int m_getfld (int, unsigned char[NAMESZ], unsigned char *, int *, FILE *);
+void m_eomsbr (m_getfld_state_t, int (*)(int));
+void m_getfld_state_init (m_getfld_state_t *);
+void m_getfld_state_reset (m_getfld_state_t *);
+void m_getfld_state_destroy (m_getfld_state_t *);
+int m_getfld (m_getfld_state_t, unsigned char[NAMESZ], unsigned char *, int *, FILE *);
int m_gmprot (void);
char *m_maildir (char *);
char *m_mailpath (char *);
int m_rand (unsigned char *, size_t);
char *m_mktemp(const char *, int *, FILE **);
char *m_mktemp2(const char *, const char *, int *, FILE **);
-void m_unknown(FILE *);
+void m_unknown(m_getfld_state_t, FILE *);
int makedir (char *);
char *message_id (time_t, int);
char *nmh_getpass(const char *);
Inputs
======
-state: message parse state
+gstate: opaque parse state
bufsz: maximum number of characters to load into buf
iob: input file stream
void m_eomsbr (int (*action)(int)): Sets the hook to check for end of
message in a maildrop. Called only by msh.
-Those functions save state in the State variables listed below.
-
State variables
===============
-m_getfld() retains state internally between calls in some state variables.
-These are used for detecting the end of each message when reading maildrops:
+m_getfld() retains state internally between calls in the m_getfld_state_t
+variable. These are used for detecting the end of each message when reading
+maildrops:
+
unsigned char **pat_map
unsigned char *fdelim
unsigned char *delimend
int msg_style
int (*eom_action)(int)
-Restrictions
-============
-m_getfld() is restricted to operate on one file stream at a time
-because of the retained state (see "State variables" above). And the
-first call to m_getfld() on that file stream requires that the read
-pointer be at the beginning of the file (ftell() of 0).
-
-Current usage
-=============
-The first call to m_getfld() on a file stream is with a state of FLD.
-Subsequent calls provide the state returned by the previous call.
-Therefore, given the Restrictions above, the state variable could be
-removed from the signature and just retained internally.
+Usage
+=====
+ m_getfld_state_t gstate;
+ m_getfld_state_init (&gstate);
+ int state = m_getfld (gstate, ...);
+ ...
+ m_getfld_state_destroy (&gstate);
+
+The state is retained internally by gstate. To reset its state to FLD:
+
+ m_getfld_state_reset (&gstate);
*/
/*
* static prototypes
*/
struct m_getfld_state;
-static int m_Eom (int, struct m_getfld_state *);
+static int m_Eom (m_getfld_state_t, int);
static unsigned char *matchc(int, char *, int, char *);
#define eom(c,s) (s->msg_style != MS_DEFAULT && \
- (((c) == *s->msg_delim && m_Eom(c,s)) || \
+ (((c) == *s->msg_delim && m_Eom(s,c)) || \
(s->eom_action && (*s->eom_action)(c))))
/* This replaces the old approach, with its direct access to stdio
#define MSG_INPUT_SIZE (BUFSIZ >= 1024 ? BUFSIZ : 1024)
#define MAX_DELIMITER_SIZE 32
-static struct m_getfld_state {
+struct m_getfld_state {
unsigned char msg_buf[2 * MSG_INPUT_SIZE + MAX_DELIMITER_SIZE];
unsigned char *readpos;
unsigned char *end; /* One past the last character read in. */
input file stream so that callers can interleave m_getfld()
calls with ftell() and fseek(). ytes_read replaces the old
m_getfld() msg_count global. last_caller_pos is stored when
- leaving m_getfld()/m_unkown(), then checked on the next entry.
+ leaving m_getfld()/m_unknown(), then checked on the next entry.
last_internal_pos is used to remember the position used
internally by m_getfld() (read_more(), actually). */
off_t bytes_read;
unsigned char *edelim;
int edelimlen;
int (*eom_action)(int);
-} m;
+ int state;
+};
+
+void
+m_getfld_state_init (m_getfld_state_t *s) {
+ *s = (m_getfld_state_t) mh_xmalloc(sizeof (struct m_getfld_state));
+ (*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)->iob gets loaded on every call to m_getfld()/m_unknown(). */
+ (*s)->pat_map = NULL;
+ (*s)->msg_style = MS_DEFAULT;
+ (*s)->msg_delim = "";
+ (*s)->fdelim = (*s)->delimend = (*s)->edelim = NULL;
+ (*s)->fdelimlen = (*s)->edelimlen = 0;
+ (*s)->eom_action = NULL;
+ (*s)->state = FLD;
+}
+
+/* scan() needs to force a state an initial state of FLD for each message. */
+void
+m_getfld_state_reset (m_getfld_state_t *s) {
+ (*s)->state = FLD;
+}
+
+void m_getfld_state_destroy (m_getfld_state_t *s) {
+ if (*s) {
+ free (*s);
+ *s = 0;
+ }
+}
/*
Summary of file and message input buffer positions:
static void
-enter_getfld (struct m_getfld_state *m, FILE *iob) {
+enter_getfld (m_getfld_state_t s, FILE *iob) {
off_t pos;
- /* Ugly. The parser opens the input file mutliple times, so we
+ /* Ugly. The parser opens the input file multiple times, so we
have to always use the FILE * that's passed to m_getfld(). */
- m->iob = iob;
+ s->iob = iob;
+
pos = ftello (iob);
- /* Rely on Restriction that the first call to m_getfld (), etc.,
- is with the read position for the file stream set to 0. */
- if (pos == 0) {
- /* A new file stream, so reset the buffer state. */
- m->iob = iob;
- m->readpos = m->end = m->msg_buf;
- m->total_bytes_read = 0;
- m->last_caller_pos = m->last_internal_pos = ftello (iob);
- m->pat_map = NULL;
- m->fdelim = m->delimend = m->edelim = NULL;
- m->msg_style = MS_DEFAULT;
- m->msg_delim = "";
- m->fdelimlen = m->edelimlen = 0;
- m->eom_action = NULL;
- } else {
- off_t pos_movement = pos - m->last_caller_pos; /* Can be < 0. */
+ if (pos != 0) {
+ off_t pos_movement = pos - s->last_caller_pos; /* Can be < 0. */
if (pos_movement == 0) {
- pos = m->last_internal_pos;
+ pos = s->last_internal_pos;
} else {
- /* The current file stream position differs from the last one, so
- caller must have called ftell/o(). Adjust accordingly. */
- if (m->readpos + pos_movement >= m->msg_buf &&
- m->readpos + pos_movement < m->end) {
+ /* 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) {
/* We can shift readpos and remain within the bounds of
msg_buf. */
- m->readpos += pos_movement;
- m->total_bytes_read += pos_movement;
- pos = m->last_internal_pos;
+ 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 (m->msg_buf, 1, MSG_INPUT_SIZE, iob);
- m->readpos = m->msg_buf + pos % MSG_INPUT_SIZE;
- m->end = m->msg_buf + num_read;
- m->total_bytes_read = pos;
+ 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);
+ if (s->last_internal_pos != 0) fseeko (iob, pos, SEEK_SET);
}
- m->bytes_read = 0;
+ s->bytes_read = 0;
}
static void
-leave_getfld (struct m_getfld_state *s) {
+leave_getfld (m_getfld_state_t s) {
/* Save the internal file position that we use for the input buffer. */
s->last_internal_pos = ftello (s->iob);
}
static size_t
-read_more (struct m_getfld_state *s) {
+read_more (m_getfld_state_t s) {
/* Retain at least edelimlen characters that have already been
read so that we can back up to them in m_Eom(). */
ssize_t retain = s->edelimlen;
}
static int
-Getc (struct m_getfld_state *s) {
+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. */
}
static int
-Peek (struct m_getfld_state *s) {
+Peek (m_getfld_state_t s) {
int next_char = Getc (s);
--s->readpos;
--s->bytes_read;
}
static int
-Ungetc (int c, struct m_getfld_state *s) {
+Ungetc (int c, m_getfld_state_t s) {
if (s->readpos == s->msg_buf) {
return EOF;
} else {
int
-m_getfld (int state, unsigned char name[NAMESZ], unsigned char *buf,
+m_getfld (m_getfld_state_t s, unsigned char name[NAMESZ], unsigned char *buf,
int *bufsz, FILE *iob)
{
- struct m_getfld_state *s = &m;
register unsigned char *cp;
register int max, n, c;
if ((c = Getc(s)) < 0) {
*bufsz = *buf = 0;
leave_getfld (s);
- return FILEEOF;
+ return s->state = FILEEOF;
}
if (eom (c, s)) {
if (! s->eom_action) {
}
*bufsz = *buf = 0;
leave_getfld (s);
- return FILEEOF;
+ return s->state = FILEEOF;
}
- switch (state) {
+ switch (s->state) {
case FLD:
if (c == '\n' || c == '-') {
/* we hit the header/body separator */
}
*bufsz = *buf = 0;
leave_getfld (s);
- return FILEEOF;
+ return s->state = FILEEOF;
}
- state = BODY;
+ s->state = BODY;
goto body;
}
/*
*bufsz = *cp = *buf = 0;
advise (NULL, "eof encountered in field \"%s\"", name);
leave_getfld (s);
- return FMTERR;
+ return s->state = FMTERR;
}
}
/* No, it can't. Oh well, guess we'll blow up. */
*bufsz = *cp = *buf = 0;
advise (NULL, "eol encountered in field \"%s\"", name);
- state = FMTERR;
+ s->state = FMTERR;
break;
}
memcpy (buf, name, n - 1);
name array in the for loop above. So subtract 1. */
*bufsz = --s->bytes_read; /* == n - 1 */
leave_getfld (s);
- return BODY;
+ return s->state = BODY;
} else if (max <= n) {
/* By design, the loop above discards the last character
it had read. It's in c, use it. */
*bufsz = *cp = *buf = 0;
advise (NULL, "field name \"%s\" exceeds %d bytes", name,
NAMESZ - 2);
- state = LENERR;
+ s->state = LENERR;
break;
}
if (c != EOF) c = Peek (s);
if (max < n) {
/* the dest buffer is full */
- state = FLDPLUS;
+ s->state = FLDPLUS;
finished = 1;
} else if (c != ' ' && c != '\t') {
/* The next character is not folded whitespace, so
prepare to move on to the next field. It's OK
if c is EOF, it will be handled on the next
call to m_getfld (). */
- state = FLD;
+ s->state = FLD;
finished = 1;
} else {
/* Folded header field, continues on the next line. */
}
default:
- adios (NULL, "m_getfld() called with bogus state of %d", state);
+ adios (NULL, "m_getfld() called with bogus state of %d", s->state);
}
*cp = 0;
leave_getfld (s);
- return state;
+ return s->state;
}
void
-m_unknown(FILE *iob)
+m_unknown(m_getfld_state_t s, FILE *iob)
{
- struct m_getfld_state *s = &m;
register int c;
char text[MAX_DELIMITER_SIZE];
register char *cp;
void
-m_eomsbr (int (*action)(int))
+m_eomsbr (m_getfld_state_t s, int (*action)(int))
{
- struct m_getfld_state *s = &m;
-
if ((s->eom_action = action)) {
s->msg_style = MS_MSH;
*s->msg_delim = 0;
*/
static int
-m_Eom (int c, struct m_getfld_state *s)
+m_Eom (m_getfld_state_t s, int c)
{
register int i;
char text[MAX_DELIMITER_SIZE];
char name[NAMESZ], field[BUFSIZ];
register struct node *np;
register struct procstr *ps;
+ m_getfld_state_t gstate;
if (npp == NULL && (npp = opp) == NULL) {
admonish (NULL, "bug: readconfig called but pump not primed");
return;
}
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, ib)) {
+ switch (state = m_getfld (gstate, name, field, &fieldsz, ib)) {
case FLD:
case FLDPLUS:
np = (struct node *) mh_xmalloc (sizeof(*np));
cp = getcpy (field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, ib);
+ state = m_getfld (gstate, name, field, &fieldsz, ib);
cp = add (field, cp);
}
np->n_field = trimcpy (cp);
}
break;
}
+ m_getfld_state_destroy (&gstate);
/*
* Special handling for the pager processes: lproc and moreproc.
char *cp, seqfile[PATH_MAX];
char name[NAMESZ], field[BUFSIZ];
FILE *fp;
+ m_getfld_state_t gstate;
/*
* If mh_seq == NULL (such as if nmh been compiled with
return;
/* Use m_getfld to scan sequence file */
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, fp)) {
+ switch (state = m_getfld (gstate, name, field, &fieldsz, fp)) {
case FLD:
case FLDPLUS:
if (state == FLDPLUS) {
cp = getcpy (field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, fp);
+ state = m_getfld (gstate, name, field, &fieldsz, fp);
cp = add (field, cp);
}
seq_init (mp, getcpy (name), trimcpy (cp));
}
break; /* break from for loop */
}
+ m_getfld_state_destroy (&gstate);
lkfclose (fp, seqfile);
}
register char *resent;
char name[NAMESZ], buffer[BUFSIZ];
register FILE *ifp, *ofp;
+ m_getfld_state_t gstate;
if (rename (drft, strcpy (backup, m_backup (drft))) == NOTOK)
adios (backup, "unable to rename %s to",drft);
lseek (hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */
cpydata (hdrfd, fileno (ofp), msgnam, drft);
- for (state = FLD, resent = NULL;;) {
+ m_getfld_state_init (&gstate);
+ for (resent = NULL;;) {
int buffersz = sizeof buffer;
- switch (state = m_getfld (state, name, buffer, &buffersz, ifp)) {
+ switch (state = m_getfld (gstate, name, buffer, &buffersz, ifp)) {
case FLD:
case FLDPLUS:
if (uprf (name, "distribute-"))
fprintf (ofp, "%s: %s", name, buffer);
while (state == FLDPLUS) {
buffersz = sizeof buffer;
- state = m_getfld (state, name, buffer, &buffersz, ifp);
+ state = m_getfld (gstate, name, buffer, &buffersz, ifp);
resent = add (buffer, resent);
fputs (buffer, ofp);
}
}
}
process: ;
+ m_getfld_state_destroy (&gstate);
fclose (ifp);
fflush (ofp);
char name[NAMESZ], buffer[BUFSIZ], tmpfil[BUFSIZ];
register FILE *ifp, *ofp;
char *cp = NULL;
+ m_getfld_state_t gstate;
if (hdrfd != NOTOK)
close (hdrfd), hdrfd = NOTOK;
adios (NULL, "no file descriptors -- you lose big");
unlink (tmpfil);
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int buffersz = sizeof buffer;
- switch (state = m_getfld (state, name, buffer, &buffersz, ifp)) {
+ switch (state = m_getfld (gstate, name, buffer, &buffersz, ifp)) {
case FLD:
case FLDPLUS:
if (uprf (name, "resent"))
fprintf (ofp, "%s: %s", name, buffer);
while (state == FLDPLUS) {
buffersz = sizeof buffer;
- state = m_getfld (state, name, buffer, &buffersz, ifp);
+ state = m_getfld (gstate, name, buffer, &buffersz, ifp);
fputs (buffer, ofp);
}
break;
fprintf (ofp, "\n%s", buffer);
while (state == BODY) {
buffersz = sizeof buffer;
- state = m_getfld (state, name, buffer, &buffersz, ifp);
+ state = m_getfld (gstate, name, buffer, &buffersz, ifp);
fputs (buffer, ofp);
}
case FILEEOF:
}
}
process: ;
+ m_getfld_state_destroy (&gstate);
fclose (ifp);
fclose (ofp);
}
register struct comp *cptr;
struct format *fmt;
char *cp = NULL;
+ m_getfld_state_t gstate;
/*
* Open the message we'll be scanning for components
* these routines?
*/
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int msg_count = sizeof msgbuf;
- state = m_getfld(state, name, msgbuf, &msg_count, tmp);
+ state = m_getfld (gstate, name, msgbuf, &msg_count, tmp);
switch (state) {
case FLD:
case FLDPLUS:
if (i != -1) {
while (state == FLDPLUS) {
msg_count = sizeof msgbuf;
- state = m_getfld(state, name, msgbuf, &msg_count, tmp);
+ state = m_getfld (gstate, name, msgbuf, &msg_count, tmp);
fmt_appendcomp(i, name, msgbuf);
}
}
while (state == FLDPLUS)
msg_count = sizeof msgbuf;
- state = m_getfld(state, name, msgbuf, &msg_count, tmp);
+ state = m_getfld (gstate, name, msgbuf, &msg_count, tmp);
break;
case LENERR:
adios(NULL, "m_getfld() returned %d", state);
}
}
+ m_getfld_state_destroy (&gstate);
/*
* Override any components just in case they were included in the
# define SASLminc(a) 0
#endif
+extern m_getfld_state_t gstate;
+
static struct swit switches[] = {
#define AUDSW 0
{ "audit audit-file", 0 },
fflush (stdout);
}
+ m_getfld_state_init (&gstate);
+
/*
* Get the mail from a POP server
*/
* Get the mail from file (usually mail spool)
*/
if (inc_type == INC_FILE && Maildir == NULL) {
- m_unknown (in); /* the MAGIC invocation... */
+ m_unknown (gstate, in); /* the MAGIC invocation... */
hghnum = msgnum = mp->hghmsg;
for (;;) {
/*
free (Maildir); /* From now on Maildir is just a flag - don't dref! */
}
+ m_getfld_state_destroy (&gstate);
+
if (incerr < 0) { /* error */
if (locked) {
GETGROUPPRIVS(); /* Be sure we can unlock mail file */
struct part **pp;
CT ct;
FILE *in;
+ m_getfld_state_t gstate;
directive_init(directives);
* draft into the linked list of header fields for
* the new MIME message.
*/
- for (compnum = 1, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (compnum = 1;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, in)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
compnum++;
if (!mh_strcasecmp (name, TYPE_FIELD)) {
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
}
goto finish_field;
}
/* if necessary, get rest of field */
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
vp = add (buf, vp); /* add to previous value */
}
}
break;
}
+ m_getfld_state_destroy (&gstate);
/*
* Now add the MIME-Version header field
int state;
char buf[BUFSIZ], name[NAMESZ];
FILE *fp;
+ m_getfld_state_t gstate;
if (!(fp = lkfopen (mapfile, "r")))
return NOTOK;
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int result;
char *cp, *dp;
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
strncpy (mapname, name, namelen);
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
cp = add (buf, cp);
}
}
}
break;
}
+ m_getfld_state_destroy (&gstate);
lkfclose (fp, mapfile);
return NOTOK;
static void mhladios (char *, char *, ...);
static void mhldone (int);
static void m_popen (char *);
-static void filterbody (struct mcomp *, char *, int, int, FILE *);
+static void filterbody (struct mcomp *, char *, int, int, FILE *,
+ m_getfld_state_t);
static void compile_formatfield(struct mcomp *);
static void compile_filterargs (void);
int state, bucket;
struct mcomp *c1, *c2, *c3;
char **ip, name[NAMESZ], buf[BUFSIZ];
+ m_getfld_state_t gstate;
compile_filterargs();
}
}
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
bucket = fmt_addcomptext(name, buf);
if (!mh_strcasecmp (name, *ip)) {
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
fmt_appendcomp(bucket, name, buf);
}
break;
c1 = add_queue (&msghd, &msgtl, name, buf, 0);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
c1->c_text = add (buf, c1->c_text);
fmt_appendcomp(bucket, name, buf);
}
if (dobody && !mh_strcasecmp (c1->c_name, "body")) {
if (c1->c_flags & FMTFILTER && state == BODY &&
formatproc != NULL) {
- filterbody(c1, buf, sizeof(buf), state, fp);
+ filterbody(c1, buf, sizeof(buf), state, fp, gstate);
} else {
holder.c_text = mh_xmalloc (sizeof(buf));
strncpy (holder.c_text, buf, sizeof(buf));
while (state == BODY) {
putcomp (c1, &holder, BODYCOMP);
bufsz = sizeof buf;
- state = m_getfld (state, name, holder.c_text,
+ state = m_getfld (gstate, name, holder.c_text,
&bufsz, fp);
}
free (holder.c_text);
adios (NULL, "getfld() returned %d", state);
}
}
+ m_getfld_state_destroy (&gstate);
}
*/
static void
-filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp)
+filterbody (struct mcomp *c1, char *buf, int bufsz, int state, FILE *fp,
+ m_getfld_state_t gstate)
{
struct mcomp holder;
char name[NAMESZ];
while (state == BODY) {
int bufsz2 = bufsz;
write(fdinput[1], buf, strlen(buf));
- state = m_getfld(state, name, buf, &bufsz2, fp);
+ state = m_getfld (gstate, name, buf, &bufsz2, fp);
}
/*
char *np, *vp;
CT ct;
HF hp;
+ m_getfld_state_t gstate;
/* allocate the content structure */
if (!(ct = (CT) calloc (1, sizeof(*ct))))
* Parse the header fields for this
* content into a linked list.
*/
- for (compnum = 1, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (compnum = 1;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, in)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
compnum++;
/* if necessary, get rest of field */
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
vp = add (buf, vp); /* add to previous value */
}
/* break out of the loop */
break;
}
+ m_getfld_state_destroy (&gstate);
/*
* Read the content headers. We will parse the
int broken_pipe; /* SIGPIPE detected */
int told_to_quit; /* SIGQUIT detected */
+extern m_getfld_state_t gstate;
+
/*
* prototypes
*/
#endif /* SIGTSTP */
}
+ m_getfld_state_init (&gstate);
if (folder)
fsetup (folder);
else
display_info (id > 0 ? scansw : 0);
msh (id > 0 ? scansw : 0);
+ m_getfld_state_destroy (&gstate);
m_reset ();
mp->msgattrs[0] = getcpy ("unseen");
mp->msgattrs[1] = NULL;
- m_unknown (fp); /* the MAGIC invocation */
+ m_unknown (gstate, fp); /* the MAGIC invocation */
if (fmsh) {
free (fmsh);
fmsh = NULL;
return yp;
}
- m_eomsbr ((int (*)()) 0); /* XXX */
+ m_eomsbr (gstate, (int (*)()) 0); /* XXX */
fseek (fp, Msgs[msgnum].m_start, SEEK_SET);
return fp;
}
return Msgs[msgnum].m_bboard_id;
zp = msh_ready (msgnum, 0);
- for (state = FLD;;) {
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, zp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, zp)) {
case FLD:
case FLDPLUS:
if (!mh_strcasecmp (name, BBoard_ID)) {
bp = getcpy (buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, zp);
+ state = m_getfld (gstate, name, buf, &bufsz, zp);
bp = add (buf, bp);
}
i = atoi (bp);
}
while (state == FLDPLUS)
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, zp);
+ state = m_getfld (gstate, name, buf, &bufsz, zp);
continue;
default:
static void copy_message (int, FILE *);
static void copy_digest (int, FILE *);
+extern m_getfld_state_t gstate;
+
void
forkcmd (char **args, char *pgm)
{
args[i++] = getcpy (m_name (msgnum));
args[i] = NULL;
mhlsbr (i, args, mhl_action);
- m_eomsbr ((int (*) ()) 0);
+ m_eomsbr (gstate, (int (*) ()) 0);
fclose (stdout);
_exit (0);
if (mp->numsel == 1 && headersw)
show (mp->lowsel);
mhlsbr (vecp, vec, mhl_action);
- m_eomsbr ((int (*)()) 0);
+ m_eomsbr (gstate, (int (*)()) 0);
while (msgp < vecp)
free (vec[msgp++]);
} else {
mhlfp = msh_ready (msgnum, 1);
if (!fmsh)
- m_eomsbr (eom_action);
+ m_eomsbr (gstate, eom_action);
return mhlfp;
}
fp = msh_ready (msgnum, 1);
- for (state = FLD;;) {
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
/*
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
cp = add (buf, cp);
}
bp = cp;
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
cp = add (buf, cp);
}
for (bp = cp; isspace (*bp); bp++)
*/
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
}
break;
register FILE *zp;
zp = msh_ready (msgnum, 0);
- for (state = FLD;;) {
+
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, zp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, zp)) {
case FLD:
case FLDPLUS:
if (!mh_strcasecmp (name, datesw)) {
bp = getcpy (buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, zp);
+ state = m_getfld (gstate, name, buf, &bufsz, zp);
bp = add (buf, bp);
}
if ((tw = dparsetime (bp)) == NULL)
bp = getcpy (buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, zp);
+ state = m_getfld (gstate, name, buf, &bufsz, zp);
bp = add (buf, bp);
}
msgp->m_scanl = sosmash(subjsw, bp);
} else {
while (state == FLDPLUS) { /* flush this one */
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, zp);
+ state = m_getfld (gstate, name, buf, &bufsz, zp);
}
}
continue;
char name[NAMESZ], field[BUFSIZ];
char *cp;
char *msgnums = NULL, *this_msgnums, *old_msgnums;
+ m_getfld_state_t gstate;
/* no sequences file -> no messages */
if (fp == NULL) {
}
/* copied from seq_read.c:seq_public */
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, fp)) {
+ switch (state = m_getfld (gstate, name, field, &fieldsz, fp)) {
case FLD:
case FLDPLUS:
if (state == FLDPLUS) {
cp = getcpy (field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, fp);
+ state = m_getfld (gstate, name, field, &fieldsz, fp);
cp = add (field, cp);
}
}
break; /* break from for loop */
}
+ m_getfld_state_destroy (&gstate);
fclose(fp);
register char *bp;
char buf[BUFSIZ], name[NAMESZ];
register struct tws *tw;
+ m_getfld_state_t gstate;
NMH_UNUSED (stop);
fseek (fp, start, SEEK_SET);
- for (state = FLD, bp = NULL;;) {
+ m_getfld_state_init (&gstate);
+ for (bp = NULL;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
if (bp != NULL)
bp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
bp = add (buf, bp);
}
if (!mh_strcasecmp (name, n->n_datef))
}
break;
}
+ m_getfld_state_destroy (&gstate);
if ((tw = dparsetime (bp)) == NULL)
advise (NULL, "unable to parse %s field in message %d, matching...",
char *cp, *msg = NULL, **argp, **arguments, *envelope;
char buf[BUFSIZ], name[NAMESZ];
FILE *in, *out;
+ m_getfld_state_t gstate;
#ifdef LOCALE
setlocale(LC_ALL, "");
hdrtab = msgstate == NORMAL ? NHeaders : RHeaders;
- for (compnum = 1, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (compnum = 1;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, in)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
compnum++;
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
cp = add (buf, cp);
}
putfmt (name, cp, out);
fprintf (out, "\n%s", buf);
while (state == BODY) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
fputs (buf, out);
}
break;
}
break;
}
+ m_getfld_state_destroy (&gstate);
if (pfd != NOTOK)
anno ();
char **arguments, **argp;
FILE *in, *out;
char *tfile = NULL;
+ m_getfld_state_t gstate;
#ifdef LOCALE
setlocale(LC_ALL, "");
/*
* Loop through the lines of the draft skeleton.
*/
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, in)) {
+ switch (state = m_getfld (gstate, name, field, &fieldsz, in)) {
case FLD:
case FLDPLUS:
/*
fprintf (out, "%s:%s", name, field);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, in);
+ state = m_getfld (gstate, name, field, &fieldsz, in);
printf ("%s", field);
fprintf (out, "%s", field);
}
printf ("%s", field);
} while (state == BODY &&
(fieldsz = sizeof field,
- state = m_getfld (state, name, field, &fieldsz, in)));
+ state = m_getfld (gstate, name, field, &fieldsz, in)));
if (prepend || !body)
break;
else
}
break;
}
+ m_getfld_state_destroy (&gstate);
if (body)
printf ("--------\n");
char *cp, *scanl, name[NAMESZ], tmpbuf[SBUFSIZ];
register struct comp *cptr;
FILE *out;
+ m_getfld_state_t gstate;
if (!(out = fopen (drft, "w")))
adios (drft, "unable to create");
if (cptr)
cptr->c_text = addrs;
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int msg_count = SBUFSIZ;
- switch (state = m_getfld (state, name, tmpbuf, &msg_count, inb)) {
+ switch (state = m_getfld (gstate, name, tmpbuf, &msg_count, inb)) {
case FLD:
case FLDPLUS:
i = fmt_addcomptext(name, tmpbuf);
char_read += msg_count;
while (state == FLDPLUS) {
msg_count = SBUFSIZ;
- state = m_getfld (state, name, tmpbuf, &msg_count, inb);
+ state = m_getfld (gstate, name, tmpbuf, &msg_count, inb);
fmt_appendcomp(i, name, tmpbuf);
char_read += msg_count;
}
while (state == FLDPLUS) {
msg_count = SBUFSIZ;
- state = m_getfld (state, name, tmpbuf, &msg_count, inb);
+ state = m_getfld (gstate, name, tmpbuf, &msg_count, inb);
}
break;
}
}
finished: ;
+ m_getfld_state_destroy (&gstate);
i = format_len + char_read + 256;
scanl = mh_xmalloc ((size_t) i + 2);
%<(mymbox{from})%<{to}To:%14(friendly{to})%>%>%<(zero)%17(friendly{from})%> \
%{subject}%<{body}<<%{body}>>%>"
+extern m_getfld_state_t gstate;
+
static struct swit switches[] = {
#define BIFFSW 0
{ "biff", 0 },
/* get new format string */
nfs = new_fs (form, format, SCANFMT);
+ m_getfld_state_init (&gstate);
scan (stdin, 0, 0, nfs, width, 0, 0, NULL, 0L, 0);
+ m_getfld_state_destroy (&gstate);
if (newline)
write (fd, "\n\r", 2);
write (fd, scanl, strlen (scanl));
char name[NAMESZ], *scanl;
unsigned char *cp;
static int dat[5]; /* aux. data for format routine */
+ m_getfld_state_t gstate;
FILE *out;
NMH_UNUSED (msg);
/*
* pick any interesting stuff out of msg "inb"
*/
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int msg_count = sizeof tmpbuf;
- state = m_getfld (state, name, tmpbuf, &msg_count, inb);
+ state = m_getfld (gstate, name, tmpbuf, &msg_count, inb);
switch (state) {
case FLD:
case FLDPLUS:
char_read += msg_count;
while (state == FLDPLUS) {
msg_count= sizeof tmpbuf;
- state = m_getfld(state, name, tmpbuf, &msg_count, inb);
+ state = m_getfld (gstate, name, tmpbuf, &msg_count, inb);
fmt_appendcomp(i, name, tmpbuf);
char_read += msg_count;
}
while (state == FLDPLUS) {
msg_count= sizeof tmpbuf;
- state = m_getfld (state, name, tmpbuf, &msg_count, inb);
+ state = m_getfld (gstate, name, tmpbuf, &msg_count, inb);
}
break;
adios (NULL, "m_getfld() returned %d", state);
}
}
+ m_getfld_state_destroy (&gstate);
/*
* format and output the header lines.
extern struct msgs *fmt_current_folder;
#endif
+extern m_getfld_state_t gstate;
+
/*
* prototypes
*/
printf ("FOLDER %s\t%s\n", file, dtimenow (1));
}
- m_unknown (in);
+ m_getfld_state_init (&gstate);
+ m_unknown (gstate, in);
for (msgnum = 1; ; ++msgnum) {
state = scan (in, msgnum, -1, nfs, width, 0, 0,
hdrflag ? file : NULL, 0L, 1);
if (state != SCNMSG && state != SCNENC)
break;
}
+ m_getfld_state_destroy (&gstate);
fclose (in);
done (0);
}
}
}
+ m_getfld_state_init (&gstate);
switch (state = scan (in, msgnum, 0, nfs, width,
msgnum == mp->curmsg, unseen,
folder, 0L, 1)) {
advise (NULL, "message %d: empty", msgnum);
break;
}
+ m_getfld_state_destroy (&gstate);
hdrflag = 0;
fclose (in);
if (ontty)
fflush (stdout);
}
}
+ m_getfld_state_destroy (&gstate);
#ifdef LBL
seq_save (mp); /* because formatsbr might have made changes */
#include <h/tws.h>
#include <h/utils.h>
+m_getfld_state_t gstate;
+
#define MAXSCANL 256 /* longest possible scan line */
/*
* and we're doing an "inc", open the output file.
*/
bufsz = rlwidth;
- if ((state = m_getfld (FLD, name, tmpbuf, &bufsz, inb)) == FILEEOF) {
+ m_getfld_state_reset (&gstate);
+ if ((state = m_getfld (gstate, name, tmpbuf, &bufsz, inb)) == FILEEOF) {
if (ferror(inb)) {
advise("read", "unable to"); /* "read error" */
return SCNFAT;
/* scan - main loop */
for (compnum = 1; ;
- bufsz = rlwidth, state = m_getfld (state, name, tmpbuf, &bufsz, inb)) {
+ bufsz = rlwidth, state = m_getfld (gstate, name, tmpbuf, &bufsz, inb)) {
switch (state) {
case FLD:
case FLDPLUS:
while (state == FLDPLUS) {
bufsz = rlwidth;
- state = m_getfld (state, name, tmpbuf, &bufsz, inb);
+ state = m_getfld (gstate, name, tmpbuf, &bufsz, inb);
if (outnum)
FPUTS (tmpbuf);
}
if ((i = strlen(tmpbuf)) < rlwidth) {
bufsz = rlwidth - i;
- state = m_getfld (state, name, tmpbuf + i, &bufsz, inb);
+ state = m_getfld (gstate, name, tmpbuf + i, &bufsz, inb);
}
if (! outnum) {
while (state == BODY) {
bufsz = rlwidth;
- state = m_getfld(state, name, tmpbuf, &bufsz, inb);
+ state = m_getfld (gstate, name, tmpbuf, &bufsz, inb);
FPUTS(tmpbuf);
}
goto finished;
char subject[BUFSIZ];
char name[NAMESZ], partnum[BUFSIZ];
FILE *in;
+ m_getfld_state_t gstate;
if ((in = fopen (drft, "r")) == NULL)
adios (drft, "unable to open for reading");
* Scan through the message and examine the various header fields,
* as well as locate the beginning of the message body.
*/
- for (compnum = 1, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (compnum = 1;;) {
int bufsz = sizeof buffer;
- switch (state = m_getfld (state, name, buffer, &bufsz, in)) {
+ switch (state = m_getfld (gstate, name, buffer, &bufsz, in)) {
case FLD:
case FLDPLUS:
compnum++;
if (!mh_strcasecmp (name, "Message-ID")) {
while (state == FLDPLUS) {
bufsz = sizeof buffer;
- state = m_getfld (state, name, buffer, &bufsz, in);
+ state = m_getfld (gstate, name, buffer, &bufsz, in);
}
} else if (uprf (name, XXX_FIELD_PRF)
|| !mh_strcasecmp (name, VRSN_FIELD)
dp = add (concat (name, ":", buffer, NULL), dp);
while (state == FLDPLUS) {
bufsz = sizeof buffer;
- state = m_getfld (state, name, buffer, &bufsz, in);
+ state = m_getfld (gstate, name, buffer, &bufsz, in);
dp = add (buffer, dp);
}
} else {
cp = add (concat (name, ":", buffer, NULL), cp);
while (state == FLDPLUS) {
bufsz = sizeof buffer;
- state = m_getfld (state, name, buffer, &bufsz, in);
+ state = m_getfld (gstate, name, buffer, &bufsz, in);
cp = add (buffer, cp);
}
}
break;
}
+ m_getfld_state_destroy (&gstate);
if (cp == NULL)
adios (NULL, "headers missing from draft");
char *cp;
char buf[BUFSIZ], name[NAMESZ];
FILE *fp;
+ m_getfld_state_t gstate;
if ((fp = fopen (msgnam, "r")) == NULL)
return 0;
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
/*
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
cp = add (buf, cp);
}
bp = cp;
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
cp = add (buf, cp);
}
for (bp = cp; isspace (*bp); bp++)
*/
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
}
break;
return 0;
}
}
+ m_getfld_state_destroy (&gstate);
}
char name[NAMESZ], field[BUFSIZ];
struct pair *p, *q;
FILE *in;
+ m_getfld_state_t gstate;
if (parsed++)
return 0;
* Scan the headers of the message and build
* a lookup table.
*/
- for (i = 0, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (i = 0;;) {
int fieldsz = sizeof field;
- switch (state = m_getfld (state, name, field, &fieldsz, in)) {
+ switch (state = m_getfld (gstate, name, field, &fieldsz, in)) {
case FLD:
case FLDPLUS:
lp = add (field, NULL);
while (state == FLDPLUS) {
fieldsz = sizeof field;
- state = m_getfld (state, name, field, &fieldsz, in);
+ state = m_getfld (gstate, name, field, &fieldsz, in);
lp = add (field, lp);
}
for (p = hdrs; p->p_name; p++) {
}
break;
}
+ m_getfld_state_destroy (&gstate);
fclose (in);
if ((p = lookup (vars, "reply-to"))) {
datum key, value;
DBM *db;
FILE *in;
+ m_getfld_state_t gstate;
if ((fd1 = dup (fd)) == -1)
return -1;
}
rewind (in);
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
switch (state) {
case FLD:
case FLDPLUS:
if (mh_strcasecmp (name, "Message-ID")) {
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
}
continue;
}
cp = add (buf, NULL);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, in);
+ state = m_getfld (gstate, name, buf, &bufsz, in);
cp = add (buf, cp);
}
key.dptr = trimcpy (cp);
break;
}
+ m_getfld_state_destroy (&gstate);
fclose (in);
return 0;
register struct tws *tw;
register char *datecomp = NULL, *subjcomp = NULL;
register FILE *in;
+ m_getfld_state_t gstate;
if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) {
admonish (msgnam, "unable to read message");
return (0);
}
- for (compnum = 1, state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (compnum = 1;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, nam, buf, &bufsz, in)) {
+ switch (state = m_getfld (gstate, nam, buf, &bufsz, in)) {
case FLD:
case FLDPLUS:
compnum++;
datecomp = add (buf, datecomp);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, nam, buf, &bufsz, in);
+ state = m_getfld (gstate, nam, buf, &bufsz, in);
datecomp = add (buf, datecomp);
}
if (!subjsort || subjcomp)
subjcomp = add (buf, subjcomp);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, nam, buf, &bufsz, in);
+ state = m_getfld (gstate, nam, buf, &bufsz, in);
subjcomp = add (buf, subjcomp);
}
if (datecomp)
/* just flush this guy */
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, nam, buf, &bufsz, in);
+ state = m_getfld (gstate, nam, buf, &bufsz, in);
}
}
continue;
}
break;
}
+ m_getfld_state_destroy (&gstate);
/*
* If no date component, then use the modification
int state;
char buf[BUFSIZ], name[NAMESZ];
FILE *fp;
+ m_getfld_state_t gstate;
if ((fp = fopen (msgnam, "r")) == NULL)
return 0;
- for (state = FLD;;) {
+ m_getfld_state_init (&gstate);
+ for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (state, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld (gstate, name, buf, &bufsz, fp)) {
case FLD:
case FLDPLUS:
/*
}
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
}
break;
}
bufsz = sizeof buf;
- state = m_getfld (state, name, buf, &bufsz, fp);
+ state = m_getfld (gstate, name, buf, &bufsz, fp);
} while (state == BODY);
/* and fall... */
return 0;
}
}
+ m_getfld_state_destroy (&gstate);
}