Added argument to fmt_scan() to specify the buffer size.
[mmh] / uip / comp.c
index e40c968..f7a8f8f 100644 (file)
@@ -2,10 +2,14 @@
 /*
  * comp.c -- compose a message
  *
- * $Id$
+ * 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 <fcntl.h>
 
 static struct swit switches[] = {
@@ -34,7 +38,19 @@ static struct swit switches[] = {
 #define VERSIONSW             11
     { "version", 0 },
 #define        HELPSW                12
-    { "help", 4 },
+    { "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 }
 };
 
@@ -63,17 +79,20 @@ static struct swit aqrul[] = {
     { 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
@@ -100,10 +119,10 @@ main (int argc, char **argv)
                    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 == '-')
@@ -161,13 +180,55 @@ main (int argc, char **argv)
                    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 (folder)
                adios (NULL, "only one folder at a time!");
            else
-               folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
+               folder = pluspath (cp);
        } else {
            if (msg)
                adios (NULL, "only one message at a time!");
@@ -192,6 +253,8 @@ main (int argc, char **argv)
     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.
@@ -224,16 +287,43 @@ main (int argc, char **argv)
        if ((in = open (form = getcpy (m_name (mp->lowsel)), O_RDONLY)) == NOTOK)
            adios (form, "unable to open message");
     } else {
+       struct comp *cptr;
+
+       if (! form)
+           form = components;
+
+        cp = new_fs(form, NULL, NULL);
+       format_len = strlen(cp);
+       fmt_compile(cp, &fmt);
+
        /*
-        * Open a component or forms file
+        * Set up any components that were fed to us on the command line
         */
-       if (form) {
-           if ((in = open (etcpath (form), O_RDONLY)) == NOTOK)
-               adios (form, "unable to open form file");
-       } else {
-           if ((in = open (etcpath (components), O_RDONLY)) == NOTOK)
-               adios (components, "unable to open default components file");
-           form = components;
+
+       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;
        }
     }
 
@@ -292,8 +382,23 @@ try_it_again:
 
     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:
@@ -301,6 +406,7 @@ 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;
 }