Rearranged whitespace (and comments) in all the code!
[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", mp->foldpath, altmsg);
48                         m_putenv ("mhaltmsg", buffer);
49                 }
50         } else {
51                 unputenv ("mhaltmsg");
52         }
53         if ((bp = getenv ("mhaltmsg")))/* XXX */
54                 m_putenv ("editalt", bp);
55         snprintf (buffer, sizeof(buffer), "%d", dist);
56         m_putenv ("mhdist", buffer);
57         if (nedit) {
58                 unputenv ("mheditor");
59         } else {
60                 m_putenv ("mheditor", ed ? ed : (ed = context_find ("editor"))
61                         ? ed : defaulteditor);
62         }
63         snprintf (buffer, sizeof(buffer), "%d", use);
64         m_putenv ("mhuse", buffer);
65
66         unputenv ("mhmessages");
67         unputenv ("mhannotate");
68         unputenv ("mhinplace");
69
70         if (text && mp && !is_readonly(mp)) {
71                 found = 0;
72                 bp = buffer;
73                 buflen = sizeof(buffer);
74                 for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) {
75                         if (is_selected(mp, msgnum)) {
76                                 snprintf (bp, buflen, "%s%s", found ? " " : "", m_name (msgnum));
77                                 len = strlen (bp);
78                                 bp += len;
79                                 buflen -= len;
80                                 for (k = msgnum + 1; k <= mp->hghmsg && is_selected(mp, k); k++)
81                                         continue;
82                                 if (--k > msgnum) {
83                                         snprintf (bp, buflen, "-%s", m_name (k));
84                                         len = strlen (bp);
85                                         bp += len;
86                                         buflen -= len;
87                                 }
88                                 msgnum = k + 1;
89                                 found++;
90                         }
91                 }
92                 if (found) {
93                         m_putenv ("mhmessages", buffer);
94                         m_putenv ("mhannotate", text);
95                         snprintf (buffer, sizeof(buffer), "%d", inplace);
96                         m_putenv ("mhinplace", buffer);
97                 }
98         }
99
100         context_save ();  /* save the context file */
101         fflush (stdout);
102
103         if (cwd)
104                 chdir (cwd);
105
106         /*
107          * If the "whatnowproc" is the nmh command "whatnow",
108          * we run it internally, rather than exec'ing it.
109          */
110         if (strcmp (vec[0], "whatnow") == 0) {
111                 WhatNow (vecp, vec);
112                 done (0);
113         }
114
115         execvp (whatnowproc, vec);
116         fprintf (stderr, "unable to exec ");
117         perror (whatnowproc);
118
119         return 0;
120 }