+ int i, msgnum, msgsize = dat[2], num = dat[0], cur = dat[1];
+ int num_unseen_seq = 0;
+ ivector_t seqnum = ivector_create (0);
+ char *maildir, *cp;
+ struct msgs *mp;
+ FILE *in;
+
+ /*
+ * If 'files' is set, short-circuit everything else and just process
+ * everything now.
+ */
+
+ if (files) {
+ for (i = 0; i < msgs->size; i++) {
+ if ((in = fopen(cp = msgs->msgs[i], "r")) == NULL) {
+ admonish(cp, "unable to open file");
+ continue;
+ }
+ process_single_file(in, comps, dat, msgsize, fmt, buffer,
+ outwidth, cb);
+ }
+
+ return;
+ }
+
+ if (! folder)
+ folder = getfolder(1);
+
+ maildir = m_maildir(folder);
+
+ if (chdir(maildir) < 0)
+ adios(maildir, "unable to change directory to");
+
+ if (!(mp = folder_read(folder, 1)))
+ adios(NULL, "unable to read folder %s", folder);
+
+ if (mp->nummsg == 0)
+ adios(NULL, "no messages in %s", folder);
+
+ for (i = 0; i < msgs->size; i++)
+ if (!m_convert(mp, msgs->msgs[i]))
+ done(1);
+ seq_setprev(mp); /* set the Previous-Sequence */
+
+ context_replace(pfolder, folder); /* update current folder */
+ seq_save(mp); /* synchronize message sequences */
+ context_save(); /* save the context file */
+
+ /*
+ * We want to set the unseen flag if requested, so we have to check
+ * the unseen sequence as well.
+ */
+
+ if (dat[4] == -1) {
+ if ((cp = context_find(usequence)) && *cp) {
+ char **ap, *dp;
+
+ dp = mh_xstrdup(cp);
+ ap = brkstring(dp, " ", "\n");
+ for (i = 0; ap && *ap; i++, ap++)
+ ivector_push_back (seqnum, seq_getnum(mp, *ap));
+
+ num_unseen_seq = i;
+ free(dp);
+ }
+ }
+
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected(mp, msgnum)) {
+ if ((in = fopen(cp = m_name(msgnum), "r")) == NULL) {
+ admonish(cp, "unable to open message");
+ continue;
+ }
+
+ fmt_freecomptext();
+
+ if (num == -1)
+ dat[0] = msgnum;
+
+ if (cur == -1)
+ dat[1] = msgnum == mp->curmsg;
+
+ /*
+ * Check to see if this is in the unseen sequence
+ */
+
+ dat[4] = 0;
+ for (i = 0; i < num_unseen_seq; i++) {
+ if (in_sequence(mp, ivector_at (seqnum, i), msgnum)) {
+ dat[4] = 1;
+ break;
+ }
+ }
+
+ /*
+ * Read in the message and process the components
+ */
+
+ process_single_file(in, comps, dat, msgsize, fmt, buffer,
+ outwidth, cb);
+ }
+ }
+
+ ivector_free (seqnum);
+ folder_free(mp);
+}
+
+/*
+ * Process a single file in message mode
+ */
+
+static void
+process_single_file(FILE *in, struct msgs_array *comps, int *dat, int msgsize,
+ struct format *fmt, charstring_t buffer, int outwidth,
+ struct fmt_callbacks *cb)
+{
+ int i, state;
+ char name[NAMESZ], rbuf[NMH_BUFSIZ];
+ m_getfld_state_t gstate;
+ struct comp *c;
+ int bufsz;
+
+ /*
+ * Get our size if we didn't include one
+ */
+
+ if (msgsize == -1) {
+ struct stat st;
+
+ if (fstat(fileno(in), &st) < 0)
+ dat[2] = 0;
+ else
+ dat[2] = st.st_size;
+ }
+
+ /*
+ * Initialize everything else
+ */
+
+ if (dat[0] == -1)
+ dat[0] = 0;
+ if (dat[1] == -1)
+ dat[1] = 0;
+ if (dat[4] == -1)
+ dat[4] = 0;
+
+ /*
+ * Read in the message and process the components
+ */
+
+ gstate = m_getfld_state_init(in);
+ for (;;) {
+ bufsz = sizeof(rbuf);
+ state = m_getfld2(&gstate, name, rbuf, &bufsz);
+ switch (state) {
+ case FLD:
+ case FLDPLUS:
+ i = fmt_addcomptext(name, rbuf);
+ if (i != -1) {
+ while (state == FLDPLUS) {
+ bufsz = sizeof(rbuf);
+ state = m_getfld2(&gstate, name, rbuf, &bufsz);
+ fmt_appendcomp(i, name, rbuf);
+ }
+ }
+
+ while (state == FLDPLUS) {
+ bufsz = sizeof(rbuf);
+ state = m_getfld2(&gstate, name, rbuf, &bufsz);
+ }
+ break;
+
+ case BODY:
+ if (fmt_findcomp("body")) {
+ if ((i = strlen(rbuf)) < outwidth) {
+ bufsz = min (outwidth, (int) sizeof rbuf - i);
+ m_getfld2(&gstate, name, rbuf + i, &bufsz);
+ }
+
+ fmt_addcomptext("body", rbuf);
+ }
+ goto finished;
+
+ default:
+ goto finished;
+ }
+ }
+finished:
+ fclose(in);
+ m_getfld_state_destroy(&gstate);
+
+ /*
+ * Do this now to override any components in the original message
+ */
+ if (comps->size) {
+ for (i = 0; i < comps->size; i += 2) {
+ c = fmt_findcomp(comps->msgs[i]);
+ if (c) {
+ free(c->c_text);
+ c->c_text = getcpy(comps->msgs[i + 1]);
+ }
+ }
+ }
+ fmt_scan(fmt, buffer, outwidth, dat, cb);
+ fputs(charstring_buffer (buffer), stdout);
+ mlistfree();