-
-/*
- * show.c -- show/list messages
+/* show.c -- show/list messages
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
#include <h/mh.h>
#include <h/mime.h>
#include <h/utils.h>
+#include "sbr/m_maildir.h"
#define SHOW_SWITCHES \
X("checkmime", 0, CHECKMIMESW) \
X("nofmtproc", 0, NFMTPROCSW) \
X("version", 0, VERSIONSW) \
X("help", 0, HELPSW) \
+ /* \
+ * switches for mhlproc \
+ */ \
+ X("concat", 0, CONCATSW) \
+ X("noconcat", 0, NCONCATSW) \
+ /* \
+ * switches for mhshow \
+ */ \
+ X("part number", 0, PARTSW) \
+ X("type content", 0, TYPESW) \
+ X("prefer content", 0, PREFERSW) \
+ X("markform file", 0, MARKFORMSW) \
+ X("rcache policy", 0, RCACHESW) \
+ X("wcache policy", 0, WCACHESW) \
#define X(sw, minchars, id) id,
DEFINE_SWITCH_ENUM(SHOW);
main (int argc, char **argv)
{
int draftsw = 0, headersw = 1;
- int nshow = 0, checkmime = 1, mime;
+ int nshow = 0, checkmime = 1, mime = 0;
int isdf = 0, mode = SHOW, msgnum;
char *cp, *maildir, *file = NULL, *folder = NULL, *proc, *program;
char buf[BUFSIZ], **argp, **arguments;
struct msgs *mp = NULL;
struct msgs_array msgs = { 0, 0, NULL };
- struct msgs_array vec = { 0, 0, NULL };
+ struct msgs_array vec = { 0, 0, NULL }, non_mhl_vec = { 0, 0, NULL };
if (nmh_init(argv[0], 1)) { return 1; }
while ((cp = *argp++)) {
if (*cp == '-') {
switch (smatch (++cp, switches)) {
- case AMBIGSW:
+ case AMBIGSW:
ambigsw (cp, switches);
done (1);
- case UNKWNSW:
+
+ case HEADSW:
+ headersw = 1;
+ goto non_mhl_switches;
+ case NHEADSW:
+ headersw = 0;
+ /* FALLTHRU */
+ case CONCATSW:
+ case NCONCATSW:
+non_mhl_switches:
+ /* mhl can't handle these, so keep them separate. */
+ app_msgarg(&non_mhl_vec, --cp);
+ continue;
+
+ case UNKWNSW:
case NPROGSW:
case NFMTPROCSW:
app_msgarg(&vec, --cp);
continue;
- case HELPSW:
+ case HELPSW:
snprintf (buf, sizeof(buf),
"%s [+folder] %s[switches] [switches for showproc]",
invo_name, mode == SHOW ? "[msgs] ": "");
print_version(invo_name);
done (0);
- case DRFTSW:
+ case DRFTSW:
if (file)
adios (NULL, "only one file at a time!");
draftsw++;
adios (NULL,
"usage: %s [+folder] [switches] [switches for showproc]",
invo_name);
- case FILESW:
+ case FILESW:
if (mode != SHOW)
goto usage;
if (draftsw || file)
file = path (cp, TFILE);
continue;
- case HEADSW:
- headersw++;
- continue;
- case NHEADSW:
- headersw = 0;
- continue;
-
case FORMSW:
app_msgarg(&vec, --cp);
if (!(cp = *argp++) || *cp == '-')
case LENSW:
case WIDTHSW:
case FMTPROCSW:
+ case PARTSW:
+ case TYPESW:
+ case PREFERSW:
+ case MARKFORMSW:
+ case RCACHESW:
+ case WCACHESW:
app_msgarg(&vec, --cp);
if (!(cp = *argp++) || *cp == '-')
adios (NULL, "missing argument to %s", argp[-2]);
app_msgarg(&vec, cp);
continue;
- case SHOWSW:
+ case SHOWSW:
if (!(showproc = *argp++) || *showproc == '-')
adios (NULL, "missing argument to %s", argp[-2]);
nshow = 0;
continue;
- case NSHOWSW:
+ case NSHOWSW:
nshow++;
continue;
if (*cp == '+' || *cp == '@') {
if (folder)
adios (NULL, "only one folder at a time!");
- else
- folder = pluspath (cp);
+ folder = pluspath (cp);
} else {
if (mode != SHOW)
goto usage;
- else
- app_msgarg(&msgs, cp);
+ app_msgarg(&msgs, cp);
}
}
app_msgarg(&vec, getcpy (m_draft (folder, NULL, 1, &isdf)));
else
app_msgarg(&vec, file);
+ headersw = 0;
goto go_to_it;
}
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
if (is_selected(mp, msgnum))
- app_msgarg(&vec, getcpy (m_name (msgnum)));
+ app_msgarg(&vec, mh_xstrdup(m_name (msgnum)));
seq_setcur (mp, mp->hghsel); /* update current message */
seq_save (mp); /* synchronize sequences */
context_replace (pfolder, folder); /* update current folder */
context_save (); /* save the context file */
- if (headersw && vec.size == 1)
- printf ("(Message %s:%s)\n", folder, vec.msgs[0]);
-
go_to_it: ;
- fflush (stdout);
/*
* Decide which "proc" to use
*/
- mime = 0;
if (nshow) {
proc = catproc;
} else {
/* check if any messages are non-text MIME messages */
- if (checkmime) {
+ if (! mime && checkmime) {
if (!draftsw && !file) {
/* loop through selected messages and check for MIME */
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
}
if (folder && !draftsw && !file)
- m_putenv ("mhfolder", folder);
+ setenv("mhfolder", folder, 1);
+
+ if (strcmp (r1bindex (proc, '/'), "cat") == 0) {
+
+ if (headersw && vec.size == 1)
+ printf ("(Message %s:%s)\n", folder, vec.msgs[0]);
- if (strcmp (r1bindex (proc, '/'), "mhn") == 0) {
- /* Add "-file" if showing file or draft, */
- if (draftsw || file) {
- app_msgarg(&vec, vec.msgs[vec.size - 1]);
- vec.msgs[vec.size - 2] = "-file";
- }
- /* and add -show for backward compatibility */
- app_msgarg(&vec, "-show");
- } else if (strcmp (r1bindex (proc, '/'), "mhshow") == 0) {
- /* If "mhshow", add "-file" if showing file or draft. */
- if (draftsw || file) {
- app_msgarg(&vec, vec.msgs[vec.size - 1]);
- vec.msgs[vec.size - 2] = "-file";
- }
} else if (strcmp (r1bindex (proc, '/'), "mhl") == 0) {
+
+ if (headersw && vec.size == 1)
+ printf ("(Message %s:%s)\n", folder, vec.msgs[0]);
+
/* If "mhl", then run it internally */
argsplit_insert(&vec, "mhl", &program);
app_msgarg(&vec, NULL);
mhl (vec.size, vec.msgs);
done (0);
+
+ } else {
+ int i;
+ char **mp;
+
+ for (i = 0, mp = non_mhl_vec.msgs; i < non_mhl_vec.size; ++i, ++mp) {
+ if (draftsw || file) {
+ /* Insert the switch before the filename. */
+ app_msgarg(&vec, vec.msgs[vec.size - 1]);
+ vec.msgs[vec.size - 2] = *mp;
+ } else {
+ app_msgarg(&vec, *mp);
+ }
+ }
+
+ if (strcmp (r1bindex (proc, '/'), "mhn") == 0) {
+ /* Add "-file" if showing file or draft, */
+ if (draftsw || file) {
+ app_msgarg(&vec, vec.msgs[vec.size - 1]);
+ vec.msgs[vec.size - 2] = "-file";
+ }
+ /* and add -show for backward compatibility */
+ app_msgarg(&vec, "-show");
+ } else if (strcmp (r1bindex (proc, '/'), "mhshow") == 0) {
+ /* If "mhshow", add "-file" if showing file or draft. */
+ if (draftsw || file) {
+ app_msgarg(&vec, vec.msgs[vec.size - 1]);
+ vec.msgs[vec.size - 2] = "-file";
+ }
+ } else {
+ if (headersw && vec.size == 1)
+ printf ("(Message %s:%s)\n", folder, vec.msgs[0]);
+ }
}
+ fflush (stdout);
+
argsplit_insert(&vec, proc, &program);
app_msgarg(&vec, NULL);
execvp (program, vec.msgs);
{
int result, state;
char *bp, *dp, *cp;
- char buf[BUFSIZ], name[NAMESZ];
+ char buf[NMH_BUFSIZ], name[NAMESZ];
FILE *fp;
- m_getfld_state_t gstate = 0;
+ m_getfld_state_t gstate;
if ((fp = fopen (msgnam, "r")) == NULL)
return 0;
-
+ gstate = m_getfld_state_init(fp);
for (;;) {
int bufsz = sizeof buf;
- switch (state = m_getfld (&gstate, name, buf, &bufsz, fp)) {
+ switch (state = m_getfld2(&gstate, name, buf, &bufsz)) {
case FLD:
case FLDPLUS:
/*
int passno;
char c;
- cp = add (buf, NULL);
+ cp = mh_xstrdup(buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, fp);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
cp = add (buf, cp);
}
bp = cp;
continue;
case '(':
i++;
- /* and fall... */
+ continue;
default:
continue;
case ')':
if (*dp) {
if ((result = !uprf (dp, "charset")))
goto out;
- dp += sizeof("charset") - 1;
+ dp += LEN("charset");
while (isspace ((unsigned char) *dp))
dp++;
if (*dp++ != '=')
* Check Content-Transfer-Encoding field
*/
if (!strcasecmp (name, ENCODING_FIELD)) {
- cp = add (buf, NULL);
+ cp = mh_xstrdup(buf);
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, fp);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
cp = add (buf, cp);
}
for (bp = cp; isspace ((unsigned char) *bp); bp++)
*/
while (state == FLDPLUS) {
bufsz = sizeof buf;
- state = m_getfld (&gstate, name, buf, &bufsz, fp);
+ state = m_getfld2(&gstate, name, buf, &bufsz);
}
break;