#include <h/mh.h>
#include <h/utils.h>
+#include <h/fmt_scan.h>
#include <fcntl.h>
static struct swit switches[] = {
{ "version", 0 },
#define HELPSW 12
{ "help", 0 },
+#define TOSW 13
+ { "to address", 0 },
+#define CCSW 14
+ { "cc address", 0 },
+#define FROMSW 15
+ { "from address", 0 },
+#define FCCSW 16
+ { "fcc mailbox", 0 },
+#define WIDTHSW 17
+ { "width colums", 0 },
+#define SUBJECTSW 18
+ { "subject text", 0 },
{ NULL, 0 }
};
{ NULL, 0 }
};
-
int
main (int argc, char **argv)
{
int use = NOUSE, nedit = 0, nwhat = 0;
- int i, in, isdf = 0, out;
+ int i, in = NOTOK, isdf = 0, out, dat[5], format_len = 0;
+ int outputlinelen = OUTPUTLINELEN;
char *cp, *cwd, *maildir, *dfolder = NULL;
char *ed = NULL, *file = NULL, *form = NULL;
char *folder = NULL, *msg = NULL, buf[BUFSIZ];
+ char *to = NULL, *from = NULL, *cc = NULL, *fcc = NULL, *dp;
+ char *subject = NULL;
char drft[BUFSIZ], **argp, **arguments;
struct msgs *mp = NULL;
+ struct format *fmt;
struct stat st;
#ifdef LOCALE
snprintf (buf, sizeof(buf), "%s [+folder] [msg] [switches]",
invo_name);
print_help (buf, switches, 1);
- done (1);
+ done (0);
case VERSIONSW:
print_version(invo_name);
- done (1);
+ done (0);
case EDITRSW:
if (!(ed = *argp++) || *ed == '-')
dfolder = NULL;
isdf = NOTOK;
continue;
+
+ case TOSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ to = addlist(to, cp);
+ continue;
+
+ case CCSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ cc = addlist(cc, cp);
+ continue;
+
+ case FROMSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ from = addlist(from, cp);
+ continue;
+
+ case FCCSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ dp = NULL;
+ if (*cp == '@')
+ cp = dp = path(cp + 1, TSUBCWF);
+ fcc = addlist(fcc, cp);
+ if (dp)
+ free(dp);
+ continue;
+
+ case WIDTHSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ if ((outputlinelen = atoi(cp)) < 10)
+ adios (NULL, "impossible width %d", outputlinelen);
+ continue;
+
+ case SUBJECTSW:
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ subject = cp;
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
if (form && (folder || msg))
adios (NULL, "can't mix forms and folders/msgs");
+ cp = NULL;
+
if (folder || msg) {
/*
* Use a message as the "form" for the new message.
if ((in = open (form = getcpy (m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
adios (form, "unable to open message");
- } else
- in = open_form(&form, components);
+ } else {
+ struct comp *cptr;
+
+ if (! form)
+ form = components;
+
+ cp = new_fs(form, NULL, NULL);
+ format_len = strlen(cp);
+ fmt_compile(cp, &fmt);
+
+ /*
+ * Set up any components that were fed to us on the command line
+ */
+
+ if (from) {
+ FINDCOMP(cptr, "from");
+ if (cptr)
+ cptr->c_text = from;
+ }
+ if (to) {
+ FINDCOMP(cptr, "to");
+ if (cptr)
+ cptr->c_text = to;
+ }
+ if (cc) {
+ FINDCOMP(cptr, "cc");
+ if (cptr)
+ cptr->c_text = cc;
+ }
+ if (fcc) {
+ FINDCOMP(cptr, "fcc");
+ if (cptr)
+ cptr->c_text = fcc;
+ }
+ if (subject) {
+ FINDCOMP(cptr, "subject");
+ if (cptr)
+ cptr->c_text = subject;
+ }
+ }
try_it_again:
strncpy (drft, m_draft (dfolder, file, use, &isdf), sizeof(drft));
if ((out = creat (drft, m_gmprot ())) == NOTOK)
adios (drft, "unable to create");
- cpydata (in, out, form, drft);
- close (in);
+ if (cp) {
+ char *scanl;
+
+ i = format_len + 1024;
+ scanl = mh_xmalloc((size_t) i + 2);
+ dat[0] = 0;
+ dat[1] = 0;
+ dat[2] = 0;
+ dat[3] = outputlinelen;
+ dat[4] = 0;
+ fmt_scan(fmt, scanl, i + 1, i, dat);
+ write(out, scanl, strlen(scanl));
+ free(scanl);
+ } else {
+ cpydata (in, out, form, drft);
+ close (in);
+ }
close (out);
edit_it:
if (nwhat)
done (0);
- what_now (ed, nedit, use, drft, NULL, 0, NULLMP, NULL, 0, cwd);
+ what_now (ed, nedit, use, drft, NULL, 0, NULLMP, NULL, 0, cwd, 0);
done (1);
return 1;
}