Reformated comments and long lines
[mmh] / uip / whatnowproc.c
1 /*
2 ** whatnowproc.c -- exec the "whatnowproc"
3 **
4 ** This code is Copyright (c) 2002, by the authors of nmh.  See the
5 ** COPYRIGHT file in the root directory of the nmh distribution for
6 ** complete copyright information.
7 */
8
9 #include <h/mh.h>
10
11
12 /*
13 ** This routine is used by comp, repl, forw, and dist to exec
14 ** the "whatnowproc".  It first sets up all the environment
15 ** variables that the "whatnowproc" will need to check, and
16 ** then execs the command.  As an optimization, if the
17 ** "whatnowproc" is the nmh command "whatnow" (typical case),
18 ** it will call this routine directly without exec'ing it.
19 */
20
21 /* from whatnowsbr.c */
22 int WhatNow (int, char **);
23
24
25 int
26 what_now (char *ed, int nedit, int use, char *file, char *altmsg, int dist,
27         struct msgs *mp, char *text, int inplace, char *cwd)
28 {
29         int found, k, msgnum, vecp;
30         int len, buflen;
31         register char *bp;
32         char buffer[BUFSIZ], *vec[MAXARGS];
33
34         vecp = 0;
35         vec[vecp++] = r1bindex (whatnowproc, '/');
36         vec[vecp] = NULL;
37
38         m_putenv ("mhdraft", file);
39         if (mp)
40                 m_putenv ("mhfolder", mp->foldpath);
41         else
42                 unputenv ("mhfolder");
43         if (altmsg) {
44                 if (mp == NULL || *altmsg == '/' || cwd == NULL)
45                         m_putenv ("mhaltmsg", altmsg);
46                 else {
47                         snprintf (buffer, sizeof(buffer), "%s/%s",
48                                         mp->foldpath, altmsg);
49                         m_putenv ("mhaltmsg", buffer);
50                 }
51         } else {
52                 unputenv ("mhaltmsg");
53         }
54         if ((bp = getenv ("mhaltmsg")))/* XXX */
55                 m_putenv ("editalt", bp);
56         snprintf (buffer, sizeof(buffer), "%d", dist);
57         m_putenv ("mhdist", buffer);
58         if (nedit) {
59                 unputenv ("mheditor");
60         } else {
61                 m_putenv ("mheditor", ed ? ed : (ed = context_find ("editor"))
62                         ? ed : defaulteditor);
63         }
64         snprintf (buffer, sizeof(buffer), "%d", use);
65         m_putenv ("mhuse", buffer);
66
67         unputenv ("mhmessages");
68         unputenv ("mhannotate");
69         unputenv ("mhinplace");
70
71         if (text && mp && !is_readonly(mp)) {
72                 found = 0;
73                 bp = buffer;
74                 buflen = sizeof(buffer);
75                 for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) {
76                         if (is_selected(mp, msgnum)) {
77                                 snprintf (bp, buflen, "%s%s",
78                                                 found ? " " : "",
79                                                 m_name (msgnum));
80                                 len = strlen (bp);
81                                 bp += len;
82                                 buflen -= len;
83                                 for (k = msgnum + 1; k <= mp->hghmsg && is_selected(mp, k); k++)
84                                         continue;
85                                 if (--k > msgnum) {
86                                         snprintf (bp, buflen, "-%s",
87                                                         m_name (k));
88                                         len = strlen (bp);
89                                         bp += len;
90                                         buflen -= len;
91                                 }
92                                 msgnum = k + 1;
93                                 found++;
94                         }
95                 }
96                 if (found) {
97                         m_putenv ("mhmessages", buffer);
98                         m_putenv ("mhannotate", text);
99                         snprintf (buffer, sizeof(buffer), "%d", inplace);
100                         m_putenv ("mhinplace", buffer);
101                 }
102         }
103
104         context_save ();  /* save the context file */
105         fflush (stdout);
106
107         if (cwd)
108                 chdir (cwd);
109
110         /*
111         ** If the "whatnowproc" is the nmh command "whatnow",
112         ** we run it internally, rather than exec'ing it.
113         */
114         if (strcmp (vec[0], "whatnow") == 0) {
115                 WhatNow (vecp, vec);
116                 done (0);
117         }
118
119         execvp (whatnowproc, vec);
120         fprintf (stderr, "unable to exec ");
121         perror (whatnowproc);
122
123         return 0;
124 }