-
-/*
- * comp.c -- compose a message
+/* comp.c -- compose a message
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
-#include <h/mh.h>
-#include <h/utils.h>
-#include <h/fmt_scan.h>
+#include "h/mh.h"
+#include "sbr/path.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/error.h"
+#include "h/utils.h"
+#include "h/fmt_scan.h"
+#include "h/done.h"
+#include "sbr/m_maildir.h"
#include <fcntl.h>
#define COMP_SWITCHES \
X("nouse", 0, NUSESW) \
X("whatnowproc program", 0, WHATSW) \
X("nowhatnowproc", 0, NWHATSW) \
+ X("build", 5, BILDSW) \
X("version", 0, VERSIONSW) \
X("help", 0, HELPSW) \
X("to address", 0, TOSW) \
X("cc address", 0, CCSW) \
X("from address", 0, FROMSW) \
X("fcc mailbox", 0, FCCSW) \
- X("width colums", 0, WIDTHSW) \
+ X("width columns", 0, WIDTHSW) \
X("subject text", 0, SUBJECTSW) \
#define X(sw, minchars, id) id,
int
main (int argc, char **argv)
{
- int use = NOUSE, nedit = 0, nwhat = 0;
+ int use = NOUSE;
+ bool nedit = false;
+ bool nwhat = false;
+ bool build = false;
int i, in = NOTOK, isdf = 0, out, dat[5], format_len = 0;
int outputlinelen = OUTPUTLINELEN;
char *cp, *cwd, *maildir, *dfolder = NULL;
struct format *fmt;
struct stat st;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], true, true)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
ambigsw (cp, switches);
done (1);
case UNKWNSW:
- adios (NULL, "-%s unknown", cp);
+ die("-%s unknown", cp);
case HELPSW:
snprintf (buf, sizeof(buf), "%s [+folder] [msg] [switches]",
case EDITRSW:
if (!(ed = *argp++) || *ed == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- nedit = 0;
+ die("missing argument to %s", argp[-2]);
+ nedit = false;
continue;
case NEDITSW:
- nedit++;
+ nedit = true;
continue;
case WHATSW:
if (!(whatnowproc = *argp++) || *whatnowproc == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
- nwhat = 0;
+ die("missing argument to %s", argp[-2]);
+ nwhat = false;
continue;
+
+ case BILDSW:
+ build = true;
+ /* FALLTHRU */
case NWHATSW:
- nwhat++;
+ nwhat = true;
continue;
case FORMSW:
if (!(form = *argp++) || *form == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case USESW:
case FILESW: /* compatibility */
if (file)
- adios (NULL, "only one file at a time!");
+ die("only one file at a time!");
if (!(file = *argp++) || *file == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
isdf = NOTOK;
continue;
case DFOLDSW:
if (dfolder)
- adios (NULL, "only one draft folder at a time!");
+ die("only one draft folder at a time!");
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
*cp != '@' ? TFOLDER : TSUBCWF);
continue;
case DMSGSW:
if (file)
- adios (NULL, "only one draft message at a time!");
+ die("only one draft message at a time!");
if (!(file = *argp++) || *file == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case NDFLDSW:
dfolder = NULL;
case TOSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("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]);
+ die("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]);
+ die("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]);
+ die("missing argument to %s", argp[-2]);
dp = NULL;
if (*cp == '@')
cp = dp = path(cp + 1, TSUBCWF);
fcc = addlist(fcc, cp);
- if (dp)
- free(dp);
+ free(dp);
continue;
case WIDTHSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if ((outputlinelen = atoi(cp)) < 10)
- adios (NULL, "impossible width %d", outputlinelen);
+ die("impossible width %d", outputlinelen);
continue;
case SUBJECTSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
subject = cp;
continue;
}
}
if (*cp == '+' || *cp == '@') {
if (folder)
- adios (NULL, "only one folder at a time!");
- else
- folder = pluspath (cp);
+ die("only one folder at a time!");
+ folder = pluspath (cp);
} else {
if (msg)
- adios (NULL, "only one message at a time!");
- else
- msg = cp;
+ die("only one message at a time!");
+ msg = cp;
}
}
- cwd = getcpy (pwd ());
+ cwd = mh_xstrdup(pwd ());
if (!context_find ("path"))
free (path ("./", TFOLDER));
msg = NULL;
}
if (form && (folder || msg))
- adios (NULL, "can't mix forms and folders/msgs");
+ die("can't mix forms and folders/msgs");
cp = NULL;
adios (maildir, "unable to change directory to");
/* read folder and create message structure */
- if (!(mp = folder_read (folder)))
- adios (NULL, "unable to read folder %s", folder);
+ if (!(mp = folder_read (folder, 1)))
+ die("unable to read folder %s", folder);
/* check for empty folder */
if (mp->nummsg == 0)
- adios (NULL, "no messages in %s", folder);
+ die("no messages in %s", folder);
/* parse the message range/sequence/name and set SELECTED */
if (!m_convert (mp, msg))
done (1);
seq_setprev (mp); /* set the previous-sequence */
+ seq_save (mp);
if (mp->numsel > 1)
- adios (NULL, "only one message at a time!");
+ die("only one message at a time!");
- if ((in = open (form = getcpy (m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
+ if ((in = open (form = mh_xstrdup(m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
adios (form, "unable to open message");
} else {
struct comp *cptr;
}
try_it_again:
- strncpy (drft, m_draft (dfolder, file, use, &isdf), sizeof(drft));
+ strncpy (drft, build ? m_maildir ("draft")
+ : m_draft (dfolder, file, use, &isdf), sizeof(drft));
/*
* Check if we have an existing draft
*/
- if ((out = open (drft, O_RDONLY)) != NOTOK) {
+ if (!build && (out = open (drft, O_RDONLY)) != NOTOK) {
i = fdcompare (in, out);
close (out);
adios (drft, "unable to stat");
printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size);
for (i = LISTDSW; i != YESW;) {
- if (!(argp = getans ("\nDisposition? ", isdf ? aqrunl : aqrul)))
+ if (!(argp = read_switch_multiword ("\nDisposition? ",
+ isdf ? aqrunl : aqrul)))
done (1);
switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) {
case NOSW:
i = YESW;
break;
default:
- advise (NULL, "say what?");
+ inform("say what?");
break;
}
}
if ((out = creat (drft, m_gmprot ())) == NOTOK)
adios (drft, "unable to create");
if (cp) {
- char *scanl;
+ charstring_t scanl;
i = format_len + 1024;
- scanl = mh_xmalloc((size_t) i + 2);
+ scanl = charstring_create (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, NULL);
- write(out, scanl, strlen(scanl));
- free(scanl);
+ fmt_scan(fmt, scanl, i, dat, NULL);
+ if (write(out, charstring_buffer (scanl),
+ charstring_bytes (scanl)) < 0) {
+ advise (drft, "write");
+ }
+ charstring_free(scanl);
} else {
cpydata (in, out, form, drft);
close (in);
if (nwhat)
done (0);
- what_now (ed, nedit, use, drft, NULL, 0, NULLMP, NULL, 0, cwd, 0);
+ what_now (ed, nedit, use, drft, NULL, 0, NULL, NULL, 0, cwd, 0);
done (1);
return 1;
}