]> diplodocus.org Git - nmh/blobdiff - uip/repl.c
Escape literal leading full stop in man/new.man.
[nmh] / uip / repl.c
index 840b762069beed0a145b2948b053e3875f9dfd07..15aa0a3a58e81d1bef131f9cc39850c26c42526a 100644 (file)
@@ -8,21 +8,22 @@
  */
 
 #include <h/mh.h>
+#include <h/mime.h>
 #include <h/utils.h>
 
-
 #define REPL_SWITCHES \
     X("group", 0, GROUPSW) \
     X("nogroup", 0, NGROUPSW) \
     X("annotate", 0, ANNOSW) \
     X("noannotate", 0, NANNOSW) \
     X("cc all|to|cc|me", 0, CCSW) \
-    X("nocc type", 0, NCCSW) \
+    X("nocc all|to|cc|me", 0, NCCSW) \
     X("draftfolder +folder", 0, DFOLDSW) \
     X("draftmessage msg", 0, DMSGSW) \
     X("nodraftfolder", 0, NDFLDSW) \
     X("editor editor", 0, EDITRSW) \
     X("noedit", 0, NEDITSW) \
+    X("convertargs type argstring", 0, CONVERTARGSW) \
     X("fcc folder", 0, FCCSW) \
     X("filter filterfile", 0, FILTSW) \
     X("form formfile", 0, FORMSW) \
@@ -96,19 +97,20 @@ short cccc = -1;
 short ccme = -1;
 short querysw = 0;
 
-short outputlinelen = OUTPUTLINELEN;
-short groupreply = 0;          /* Is this a group reply?        */
+static short outputlinelen = OUTPUTLINELEN;
+static short groupreply = 0;           /* Is this a group reply?        */
 
-int mime = 0;                  /* include original as MIME part */
-char *form   = NULL;           /* form (components) file        */
-char *filter = NULL;           /* message filter file           */
-char *fcc    = NULL;           /* folders to add to Fcc: header */
+static int mime = 0;                   /* include original as MIME part */
+static char *form   = NULL;            /* form (components) file        */
+static char *filter = NULL;            /* message filter file           */
+static char *fcc    = NULL;            /* folders to add to Fcc: header */
 
 
 /*
  * prototypes
  */
-void docc (char *, int);
+static void docc (char *, int);
+static void add_convert_header (const char *, char *, char *, char *);
 
 
 int
@@ -123,19 +125,16 @@ main (int argc, char **argv)
     char *folder = NULL, *msg = NULL, *dfolder = NULL;
     char *dmsg = NULL, *ed = NULL, drft[BUFSIZ], buf[BUFSIZ];
     char **argp, **arguments;
+    svector_t convert_types = svector_create (10);
+    svector_t convert_args = svector_create (10);
+    size_t n;
     struct msgs *mp = NULL;
     struct stat st;
     FILE *in;
 
     int buildsw = 0;
 
-#ifdef LOCALE
-    setlocale(LC_ALL, "");
-#endif
-    invo_name = r1bindex (argv[0], '/');
-
-    /* read user profile/context */
-    context_read();
+    if (nmh_init(argv[0], 1)) { return 1; }
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
@@ -192,13 +191,42 @@ main (int argc, char **argv)
                    nedit++;
                    continue;
                    
+               case CONVERTARGSW: {
+                    char *type;
+                    size_t i;
+
+                   if (!(type = *argp++)) {
+                       adios (NULL, "missing type argument to %s", argp[-2]);
+                    }
+                   if (!(cp = *argp++)) {
+                       adios (NULL, "missing argstring argument to %s",
+                              argp[-3]);
+                    }
+
+                    for (i = 0; i < svector_size (convert_types); ++i) {
+                        if (! strcmp (svector_at (convert_types, i), type)) {
+                            /* Already saw this type, so just update
+                               its args. */
+                            svector_strs (convert_args)[i] = cp;
+                            break;
+                        }
+                    }
+
+                    if (i == svector_size (convert_types)) {
+                        svector_push_back (convert_types, type);
+                        svector_push_back (convert_args, cp);
+                    }
+                   continue;
+                }
+
                case WHATSW: 
                    if (!(whatnowproc = *argp++) || *whatnowproc == '-')
                        adios (NULL, "missing argument to %s", argp[-2]);
                    nwhat = 0;
                    continue;
                case BILDSW: 
-                   buildsw++;  /* fall... */
+                   buildsw++;
+                   /* FALLTHRU */
                case NWHATSW: 
                    nwhat++;
                    continue;
@@ -212,8 +240,7 @@ main (int argc, char **argv)
                    if (fcc)
                        fcc = add (", ", fcc);
                    fcc = add (cp, fcc);
-                   if (dp)
-                       free (dp);
+                    mh_xfree(dp);
                    continue;
 
                case FILESW: 
@@ -327,7 +354,7 @@ main (int argc, char **argv)
     if (ccme == -1)
        ccme = groupreply;
 
-    cwd = getcpy (pwd ());
+    cwd = mh_xstrdup(pwd ());
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
@@ -343,7 +370,8 @@ try_it_again:
     if (!buildsw && stat (drft, &st) != NOTOK) {
        printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size);
        for (i = LISTDSW; i != YESW;) {
-           if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl)))
+           if (!(argp = read_switch_multiword ("\nDisposition? ",
+                                               isdf ? aqrnl : aqrl)))
                done (1);
            switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) {
                case NOSW: 
@@ -407,7 +435,7 @@ try_it_again:
        context_save ();                        /* save the context file   */
     }
 
-    msg = file ? file : getcpy (m_name (mp->lowsel));
+    msg = file ? file : mh_xstrdup(m_name (mp->lowsel));
 
     if ((in = fopen (msg, "r")) == NULL)
        adios (msg, "unable to open");
@@ -424,10 +452,27 @@ try_it_again:
             fcc, fmtproc);
     fclose (in);
 
+    {
+        char *filename = file ? file : concat (mp->foldpath, "/", msg, NULL);
+
+        for (n = 0; n < svector_size (convert_types); ++n) {
+            add_convert_header (svector_at (convert_types, n),
+                                svector_at (convert_args, n),
+                                filename, drft);
+        }
+        if (! file) {
+            free (filename);
+        }
+    }
+
     if (nwhat)
        done (0);
     what_now (ed, nedit, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL,
            inplace, cwd, atfile);
+
+    svector_free (convert_args);
+    svector_free (convert_types);
+
     done (1);
     return 1;
 }
@@ -459,3 +504,25 @@ docc (char *cp, int ccflag)
            break;
     }
 }
+
+/*
+ * Add pseudoheaders that will pass the convert arguments to
+ * mhbuild.  They have the form:
+ *   MHBUILD_FILE_PSEUDOHEADER-text/calendar: /home/user/Mail/inbox/7
+ *   MHBUILD_ARGS_PSEUDOHEADER-text/calendar: reply -accept
+ * The ARGS pseudoheader is optional, but we always add it when
+ * -convertargs is used.
+ */
+void
+add_convert_header (const char *convert_type, char *convert_arg,
+                    char *filename, char *drft) {
+    char *field_name;
+
+    field_name = concat (MHBUILD_FILE_PSEUDOHEADER, convert_type, NULL);
+    annotate (drft, field_name, filename, 1, 0, -2, 1);
+    free (field_name);
+
+    field_name = concat (MHBUILD_ARGS_PSEUDOHEADER, convert_type, NULL);
+    annotate (drft, field_name, convert_arg, 1, 0, -2, 1);
+    free (field_name);
+}