]> diplodocus.org Git - nmh/blobdiff - uip/repl.c
Editing of man/repl.com.
[nmh] / uip / repl.c
index 7b0ab4a03d55dff683ba1707d75bb3040173407d..15aa0a3a58e81d1bef131f9cc39850c26c42526a 100644 (file)
@@ -8,21 +8,22 @@
  */
 
 #include <h/mh.h>
  */
 
 #include <h/mh.h>
+#include <h/mime.h>
 #include <h/utils.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) \
 #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("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) \
     X("fcc folder", 0, FCCSW) \
     X("filter filterfile", 0, FILTSW) \
     X("form formfile", 0, FORMSW) \
@@ -108,7 +109,8 @@ static char *fcc    = NULL;         /* folders to add to Fcc: header */
 /*
  * prototypes
  */
 /*
  * prototypes
  */
-void docc (char *, int);
+static void docc (char *, int);
+static void add_convert_header (const char *, char *, char *, char *);
 
 
 int
 
 
 int
@@ -123,6 +125,9 @@ main (int argc, char **argv)
     char *folder = NULL, *msg = NULL, *dfolder = NULL;
     char *dmsg = NULL, *ed = NULL, drft[BUFSIZ], buf[BUFSIZ];
     char **argp, **arguments;
     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;
     struct msgs *mp = NULL;
     struct stat st;
     FILE *in;
@@ -186,13 +191,42 @@ main (int argc, char **argv)
                    nedit++;
                    continue;
                    
                    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: 
                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;
                case NWHATSW: 
                    nwhat++;
                    continue;
@@ -206,8 +240,7 @@ main (int argc, char **argv)
                    if (fcc)
                        fcc = add (", ", fcc);
                    fcc = add (cp, fcc);
                    if (fcc)
                        fcc = add (", ", fcc);
                    fcc = add (cp, fcc);
-                   if (dp)
-                       free (dp);
+                    mh_xfree(dp);
                    continue;
 
                case FILESW: 
                    continue;
 
                case FILESW: 
@@ -321,7 +354,7 @@ main (int argc, char **argv)
     if (ccme == -1)
        ccme = groupreply;
 
     if (ccme == -1)
        ccme = groupreply;
 
-    cwd = getcpy (pwd ());
+    cwd = mh_xstrdup(pwd ());
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
@@ -337,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 (!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: 
                done (1);
            switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) {
                case NOSW: 
@@ -401,7 +435,7 @@ try_it_again:
        context_save ();                        /* save the context file   */
     }
 
        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");
 
     if ((in = fopen (msg, "r")) == NULL)
        adios (msg, "unable to open");
@@ -418,10 +452,27 @@ try_it_again:
             fcc, fmtproc);
     fclose (in);
 
             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);
     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;
 }
     done (1);
     return 1;
 }
@@ -453,3 +504,25 @@ docc (char *cp, int ccflag)
            break;
     }
 }
            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);
+}