*/
#include <h/mh.h>
+#include <h/utils.h>
static struct swit switches[] = {
#define INPLSW 0
main (int argc, char **argv)
{
int inplace = 0, quietsw = 0, verbosw = 0;
- int msgp = 0, hi, msgnum, numburst;
+ int hi, msgnum, numburst;
char *cp, *maildir, *folder = NULL, buf[BUFSIZ];
- char **argp, **arguments, *msgs[MAXARGS];
+ char **argp, **arguments;
+ struct msgs_array msgs = { 0, 0, NULL };
struct smsg *smsgs;
struct msgs *mp;
else
folder = pluspath (cp);
} else {
- msgs[msgp++] = cp;
+ app_msgarg(&msgs, cp);
}
}
if (!context_find ("path"))
free (path ("./", TFOLDER));
- if (!msgp)
- msgs[msgp++] = "cur";
+ if (!msgs.size)
+ app_msgarg(&msgs, "cur");
if (!folder)
folder = getfolder (1);
maildir = m_maildir (folder);
adios (NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++)
- if (!m_convert (mp, msgs[msgnum]))
+ for (msgnum = 0; msgnum < msgs.size; msgnum++)
+ if (!m_convert (mp, msgs.msgs[msgnum]))
done (1);
seq_setprev (mp); /* set the previous-sequence */
int
main (int argc, char **argv)
{
- int msgp = 0, anot = 0, inplace = 1, mime = 0;
+ int anot = 0, inplace = 1, mime = 0;
int issue = 0, volume = 0, dashstuff = 0;
int nedit = 0, nwhat = 0, i, in;
int out, isdf = 0, msgnum = 0;
char *file = NULL, *filter = NULL, *folder = NULL, *fwdmsg = NULL;
char *from = NULL, *to = NULL, *cc = NULL, *subject = NULL, *fcc = NULL;
char *form = NULL, buf[BUFSIZ], value[10];
- char **argp, **arguments, *msgs[MAXARGS];
+ char **argp, **arguments;
struct stat st;
+ struct msgs_array msgs = { 0, 0, NULL };
int buildsw = 0;
else
folder = pluspath (cp);
} else {
- msgs[msgp++] = cp;
+ app_msgarg(&msgs, cp);
}
}
if (!context_find ("path"))
free (path ("./", TFOLDER));
- if (file && (msgp || folder))
+ if (file && (msgs.size || folder))
adios (NULL, "can't mix files and folders/msgs");
try_it_again:
/*
* Forwarding a message.
*/
- if (!msgp)
- msgs[msgp++] = "cur";
+ if (!msgs.size)
+ app_msgarg(&msgs, "cur");
if (!folder)
folder = getfolder (1);
maildir = m_maildir (folder);
adios (NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++)
- if (!m_convert (mp, msgs[msgnum]))
+ for (msgnum = 0; msgnum < msgs.size; msgnum++)
+ if (!m_convert (mp, msgs.msgs[msgnum]))
done (1);
+
seq_setprev (mp); /* set the previous sequence */
/*
{
pid_t child_id;
int i, msgnum, pd[2];
- char *vec[MAXARGS];
char buf1[BUFSIZ];
char buf2[BUFSIZ];
-
+ struct msgs_array vec = { 0, 0, NULL };
+
if (pipe (pd) == NOTOK)
adios ("pipe", "unable to create");
- vec[0] = r1bindex (mhlproc, '/');
+ app_msgarg(&vec, r1bindex (mhlproc, '/'));
for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++)
sleep (5);
+
switch (child_id) {
case NOTOK:
adios ("fork", "unable to");
close (pd[1]);
i = 1;
- vec[i++] = "-forwall";
- vec[i++] = "-form";
- vec[i++] = filter;
+ app_msgarg(&vec, "-forwall");
+ app_msgarg(&vec, "-form");
+ app_msgarg(&vec, filter);
if (digest) {
- vec[i++] = "-digest";
- vec[i++] = digest;
- vec[i++] = "-issue";
+ app_msgarg(&vec, "-digest");
+ app_msgarg(&vec, digest);
+ app_msgarg(&vec, "-issue");
snprintf (buf1, sizeof(buf1), "%d", issue);
- vec[i++] = buf1;
- vec[i++] = "-volume";
+ app_msgarg(&vec, buf1);
+ app_msgarg(&vec, "-volume");
snprintf (buf2, sizeof(buf2), "%d", volume);
- vec[i++] = buf2;
+ app_msgarg(&vec, buf2);
}
/*
* unless the user has specified a specific flag.
*/
if (dashstuff > 0)
- vec[i++] = "-dashstuffing";
+ app_msgarg(&vec, "-dashstuffing");
else if (dashstuff < 0)
- vec[i++] = "-nodashstuffing";
-
- if (mp->numsel >= MAXARGS - i)
- adios (NULL, "more than %d messages for %s exec",
- MAXARGS - i, vec[0]);
+ app_msgarg(&vec, "-nodashstuffing");
- /*
- * Now add the message names to filter. We can only
- * handle about 995 messages (because vec is fixed size),
- * but that should be plenty.
- */
- for (msgnum = mp->lowsel;
- msgnum <= mp->hghsel && i < (int) sizeof(vec) - 1;
- msgnum++)
+ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
if (is_selected (mp, msgnum))
- vec[i++] = getcpy (m_name (msgnum));
- vec[i] = NULL;
+ app_msgarg(&vec, getcpy (m_name (msgnum)));
+ }
+
+ app_msgarg(&vec, NULL);
- execvp (mhlproc, vec);
+ execvp (mhlproc, vec.msgs);
fprintf (stderr, "unable to exec ");
perror (mhlproc);
_exit (-1);
default:
close (pd[1]);
- cpydata (pd[0], out, vec[0], file);
+ cpydata (pd[0], out, vec.msgs[0], file);
close (pd[0]);
pidXwait(child_id, mhlproc);
break;
int
main (int argc, char **argv)
{
- int draftsw = 0, headersw = 1, msgp = 0;
+ int draftsw = 0, headersw = 1;
int nshow = 0, checkmime = 1, mime;
- int vecp = 1, procp = 1, isdf = 0, mode = SHOW, msgnum;
+ int isdf = 0, mode = SHOW, msgnum;
char *cp, *maildir, *file = NULL, *folder = NULL, *proc;
char buf[BUFSIZ], **argp, **arguments;
- char *msgs[MAXARGS], *vec[MAXARGS];
struct msgs *mp = NULL;
+ struct msgs_array msgs = { 0, 0, NULL };
+ struct msgs_array vec = { 0, 0, NULL };
#ifdef LOCALE
setlocale(LC_ALL, "");
#endif
invo_name = r1bindex (argv[0], '/');
+ app_msgarg(&vec, NULL); /* placeholder, filled later with proc name */
+
/* read user profile/context */
context_read();
case UNKWNSW:
case NPROGSW:
case NFMTPROCSW:
- vec[vecp++] = --cp;
+ app_msgarg(&vec, --cp);
continue;
case HELPSW:
continue;
case FORMSW:
- vec[vecp++] = --cp;
+ app_msgarg(&vec, --cp);
if (!(cp = *argp++) || *cp == '-')
adios (NULL, "missing argument to %s", argp[-2]);
- vec[vecp++] = getcpy (etcpath(cp));
+ app_msgarg(&vec, getcpy (etcpath(cp)));
continue;
case PROGSW:
case LENSW:
case WIDTHSW:
case FMTPROCSW:
- vec[vecp++] = --cp;
+ app_msgarg(&vec, --cp);
if (!(cp = *argp++) || *cp == '-')
adios (NULL, "missing argument to %s", argp[-2]);
- vec[vecp++] = cp;
+ app_msgarg(&vec, cp);
continue;
case SHOWSW:
if (mode != SHOW)
goto usage;
else
- msgs[msgp++] = cp;
+ app_msgarg(&msgs, cp);
}
}
- procp = vecp;
if (!context_find ("path"))
free (path ("./", TFOLDER));
if (draftsw || file) {
- if (msgp)
+ if (msgs.size)
adios (NULL, "only one file at a time!");
- vec[vecp++] = draftsw
- ? getcpy (m_draft (folder, msgp ? msgs[0] : NULL, 1, &isdf))
- : file;
+ if (draftsw)
+ app_msgarg(&vec, getcpy (m_draft (folder, NULL, 1, &isdf)));
+ else
+ app_msgarg(&vec, file);
goto go_to_it;
}
#ifdef WHATNOW
- if (!msgp && !folder && mode == SHOW && (cp = getenv ("mhdraft")) && *cp) {
+ if (!msgs.size && !folder && mode == SHOW && (cp = getenv ("mhdraft")) && *cp) {
draftsw++;
- vec[vecp++] = cp;
+ app_msgarg(&vec, cp);
goto go_to_it;
}
#endif /* WHATNOW */
- if (!msgp) {
+ if (!msgs.size) {
switch (mode) {
case NEXT:
- msgs[msgp++] = "next";
+ app_msgarg(&msgs, "next");
break;
case PREV:
- msgs[msgp++] = "prev";
+ app_msgarg(&msgs, "prev");
break;
default:
- msgs[msgp++] = "cur";
+ app_msgarg(&msgs, "cur");
break;
}
}
adios (NULL, "no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++)
- if (!m_convert (mp, msgs[msgnum]))
+ for (msgnum = 0; msgnum < msgs.size; msgnum++)
+ if (!m_convert (mp, msgs.msgs[msgnum]))
done (1);
/*
seq_setprev (mp); /* set the Previous-Sequence */
seq_setunseen (mp, 1); /* unset the Unseen-Sequence */
- if (mp->numsel > MAXARGS - 2)
- adios (NULL, "more than %d messages for show exec", MAXARGS - 2);
-
for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
if (is_selected(mp, msgnum))
- vec[vecp++] = getcpy (m_name (msgnum));
+ app_msgarg(&vec, getcpy (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 && vecp == 2)
- printf ("(Message %s:%s)\n", folder, vec[1]);
+ if (headersw && vec.size == 2)
+ printf ("(Message %s:%s)\n", folder, vec.msgs[1]);
go_to_it: ;
fflush (stdout);
- vec[vecp] = NULL;
-
/*
* Decide which "proc" to use
*/
}
} else {
/* check the file or draft for MIME */
- if (is_nontext (vec[vecp - 1]))
+ if (is_nontext (vec.msgs[vec.size - 1]))
mime = 1;
}
}
if (folder && !draftsw && !file)
m_putenv ("mhfolder", folder);
- /*
- * For backward compatibility, if the "proc" is mhn,
- * then add "-show" option. Add "-file" if showing
- * file or draft.
- */
if (strcmp (r1bindex (proc, '/'), "mhn") == 0) {
+ /* Add "-file" if showing file or draft, */
if (draftsw || file) {
- vec[vecp] = vec[vecp - 1];
- vec[vecp - 1] = "-file";
- vecp++;
+ app_msgarg(&vec, vec.msgs[vec.size - 1]);
+ vec.msgs[vec.size - 2] = "-file";
}
- vec[vecp++] = "-show";
- vec[vecp] = NULL;
- }
-
- /* If the "proc" is "mhshow", add "-file" if showing file or draft.
- */
- if (strcmp (r1bindex (proc, '/'), "mhshow") == 0 && (draftsw || file) ) {
- vec[vecp] = vec[vecp - 1];
- vec[vecp - 1] = "-file";
- vec[++vecp] = NULL;
- }
-
- /*
- * If "proc" is mhl, then run it internally
- * rather than exec'ing it.
- */
- if (strcmp (r1bindex (proc, '/'), "mhl") == 0) {
- vec[0] = "mhl";
- mhl (vecp, vec);
+ /* 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 "mhl", then run it internally */
+ vec.msgs[0] = "mhl";
+ app_msgarg(&vec, NULL);
+ mhl (vec.size, vec.msgs);
done (0);
}
- /*
- * If you are not using a nmh command as your "proc", then
- * add the path to the message names. Currently, we are just
- * checking for mhn here, since we've already taken care of mhl.
- */
- if (!strcmp (r1bindex (proc, '/'), "mhl")
- && !draftsw
- && !file
- && chdir (maildir = concat (m_maildir (""), "/", NULL)) != NOTOK) {
- mp->foldpath = concat (mp->foldpath, "/", NULL);
- cp = ssequal (maildir, mp->foldpath)
- ? mp->foldpath + strlen (maildir)
- : mp->foldpath;
- for (msgnum = procp; msgnum < vecp; msgnum++)
- vec[msgnum] = concat (cp, vec[msgnum], NULL);
- }
-
- vec[0] = r1bindex (proc, '/');
- execvp (proc, vec);
+ vec.msgs[0] = r1bindex (proc, '/');
+ app_msgarg(&vec, NULL);
+ execvp (proc, vec.msgs);
adios (proc, "unable to exec");
return 0; /* dead code to satisfy the compiler */
}