X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6bc64765f773ce75454ec1592a86779e3547fe46..ef1ba39e8dae81091b6c3e73e72825ef6edea3c6:/uip/repl.c diff --git a/uip/repl.c b/uip/repl.c index 7b0ab4a0..f97210c2 100644 --- a/uip/repl.c +++ b/uip/repl.c @@ -8,21 +8,22 @@ */ #include +#include #include - #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) \ @@ -108,7 +109,8 @@ 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,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; + 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; @@ -186,6 +191,34 @@ 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]); @@ -206,8 +239,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: @@ -321,7 +353,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)); @@ -337,7 +369,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: @@ -401,7 +434,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"); @@ -418,10 +451,25 @@ try_it_again: fcc, fmtproc); fclose (in); + { + char *filename = 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); + } + 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; } @@ -453,3 +501,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); +}