|
|
1.1 root 1: /* comp.c - compose a message */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5: #include <sys/types.h>
6: #include <sys/stat.h>
7:
8: /* */
9:
10: static struct swit switches[] = {
11: #define DFOLDSW 0
12: "draftfolder +folder", 0,
13: #define DMSGSW 1
14: "draftmessage msg", 0,
15: #define NDFLDSW 2
16: "nodraftfolder", 0,
17:
18: #define EDITRSW 3
19: "editor editor", 0,
20: #define NEDITSW 4
21: "noedit", 0,
22:
23: #define FILESW 5
24: "file file", 0,
25: #define FORMSW 6
26: "form formfile", 0,
27:
28: #define USESW 7
29: "use", 0,
30: #define NUSESW 8
31: "nouse", 0,
32:
33: #define WHATSW 9
34: "whatnowproc program", 0,
35: #define NWHATSW 10
36: "nowhatnowproc", 0,
37:
38: #define HELPSW 11
39: "help", 4,
40:
41:
42: NULL, NULL
43: };
44:
45: /* */
46:
47: static struct swit aqrunl[] = {
48: #define NOSW 0
49: "quit", 0,
50: #define YESW 1
51: "replace", 0,
52: #define USELSW 2
53: "use", 0,
54: #define LISTDSW 3
55: "list", 0,
56: #define REFILSW 4
57: "refile +folder", 0,
58: #define NEWSW 5
59: "new", 0,
60:
61: NULL, NULL
62: };
63:
64:
65: static struct swit aqrul[] = {
66: "quit", 0,
67: "replace", 0,
68: "use", 0,
69: "list", 0,
70: "refile", 0,
71:
72: NULL, NULL
73: };
74:
75: /* */
76:
77: /* ARGSUSED */
78:
79: main (argc, argv)
80: int argc;
81: char *argv[];
82: {
83: int use = NOUSE,
84: nedit = 0,
85: nwhat = 0,
86: i,
87: in,
88: isdf = 0,
89: out;
90: char *cp,
91: *cwd,
92: *maildir,
93: *dfolder = NULL,
94: *ed = NULL,
95: *file = NULL,
96: *form = NULL,
97: *folder = NULL,
98: *msg = NULL,
99: buf[BUFSIZ],
100: drft[BUFSIZ],
101: **ap,
102: **argp,
103: *arguments[MAXARGS];
104: struct msgs *mp = NULL;
105: struct stat st;
106:
107: invo_name = r1bindex (argv[0], '/');
108: if ((cp = m_find (invo_name)) != NULL) {
109: ap = brkstring (cp = getcpy (cp), " ", "\n");
110: ap = copyip (ap, arguments);
111: }
112: else
113: ap = arguments;
114: (void) copyip (argv + 1, ap);
115: argp = arguments;
116:
117: /* */
118:
119: while (cp = *argp++) {
120: if (*cp == '-')
121: switch (smatch (++cp, switches)) {
122: case AMBIGSW:
123: ambigsw (cp, switches);
124: done (1);
125: case UNKWNSW:
126: adios (NULLCP, "-%s unknown", cp);
127: case HELPSW:
128: (void) sprintf (buf, "%s [+folder] [msg] [switches]",
129: invo_name);
130: help (buf, switches);
131: done (1);
132:
133: case EDITRSW:
134: if (!(ed = *argp++) || *ed == '-')
135: adios (NULLCP, "missing argument to %s", argp[-2]);
136: nedit = 0;
137: continue;
138: case NEDITSW:
139: nedit++;
140: continue;
141:
142: case WHATSW:
143: if (!(whatnowproc = *argp++) || *whatnowproc == '-')
144: adios (NULLCP, "missing argument to %s", argp[-2]);
145: nwhat = 0;
146: continue;
147: case NWHATSW:
148: nwhat++;
149: continue;
150:
151: case FORMSW:
152: if (!(form = *argp++) || *form == '-')
153: adios (NULLCP, "missing argument to %s", argp[-2]);
154: continue;
155:
156: case USESW:
157: use++;
158: continue;
159: case NUSESW:
160: use = NOUSE;
161: continue;
162:
163: case FILESW: /* compatibility */
164: if (file)
165: adios (NULLCP, "only one file at a time!");
166: if (!(file = *argp++) || *file == '-')
167: adios (NULLCP, "missing argument to %s", argp[-2]);
168: continue;
169:
170: case DFOLDSW:
171: if (dfolder)
172: adios (NULLCP, "only one draft folder at a time!");
173: if (!(cp = *argp++) || *cp == '-')
174: adios (NULLCP, "missing argument to %s", argp[-2]);
175: dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp,
176: *cp != '@' ? TFOLDER : TSUBCWF);
177: continue;
178: case DMSGSW:
179: if (file)
180: adios (NULLCP, "only one draft message at a time!");
181: if (!(file = *argp++) || *file == '-')
182: adios (NULLCP, "missing argument to %s", argp[-2]);
183: continue;
184: case NDFLDSW:
185: dfolder = NULL;
186: isdf = NOTOK;
187: continue;
188: }
189: if (*cp == '+' || *cp == '@') {
190: if (folder)
191: adios (NULLCP, "only one folder at a time!");
192: else
193: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
194: }
195: else
196: if (msg)
197: adios (NULLCP, "only one message at a time!");
198: else
199: msg = cp;
200: }
201:
202: /* */
203:
204: cwd = getcpy (pwd ());
205:
206: if (!m_find ("path"))
207: free (path ("./", TFOLDER));
208:
209: if ((dfolder || m_find ("Draft-Folder")) && !folder && msg && !file)
210: file = msg, msg = NULL;
211: if (form && (folder || msg))
212: adios (NULLCP, "can't mix forms and folders/msgs");
213:
214: if (folder || msg) {
215: if (!msg)
216: msg = "cur";
217: if (!folder)
218: folder = m_getfolder ();
219: maildir = m_maildir (folder);
220:
221: if (chdir (maildir) == NOTOK)
222: adios (maildir, "unable to change directory to");
223: if (!(mp = m_gmsg (folder)))
224: adios (NULLCP, "unable to read folder %s", folder);
225: if (mp -> hghmsg == 0)
226: adios (NULLCP, "no messages in %s", folder);
227:
228: if (!m_convert (mp, msg))
229: done (1);
230: m_setseq (mp);
231:
232: if (mp -> numsel > 1)
233: adios (NULLCP, "only one message at a time!");
234:
235: if ((in = open (form = getcpy (m_name (mp -> lowsel)), 0)) == NOTOK)
236: adios (form, "unable to open message");
237: }
238: else
239: if (form) {
240: if ((in = open (libpath (form), 0)) == NOTOK)
241: adios (form, "unable to open form file");
242: }
243: else {
244: if ((in = open (libpath (components), 0)) == NOTOK)
245: adios (components, "unable to open default components file");
246: form = components;
247: }
248:
249: /* */
250:
251: try_it_again: ;
252: (void) strcpy (drft, m_draft (dfolder, file, use, &isdf));
253: if ((out = open (drft, 0)) != NOTOK) {
254: i = fdcompare (in, out);
255: (void) close (out);
256: if (use || i)
257: goto edit_it;
258:
259: if (stat (drft, &st) == NOTOK)
260: adios (drft, "unable to stat");
261: printf ("Draft \"%s\" exists (%ld bytes).", drft, st.st_size);
262: for (i = LISTDSW; i != YESW;) {
263: if (!(argp = getans ("\nDisposition? ", isdf ? aqrunl : aqrul)))
264: done (1);
265: switch (i = smatch (*argp, isdf ? aqrunl : aqrul)) {
266: case NOSW:
267: done (0);
268: case NEWSW:
269: file = NULL;
270: use = NOUSE;
271: goto try_it_again;
272: case YESW:
273: break;
274: case USELSW:
275: use++;
276: goto edit_it;
277: case LISTDSW:
278: (void) showfile (++argp, drft);
279: break;
280: case REFILSW:
281: if (refile (++argp, drft) == 0)
282: i = YESW;
283: break;
284: default:
285: advise (NULLCP, "say what?");
286: break;
287: }
288: }
289: }
290: else
291: if (use)
292: adios (drft, "unable to open");
293:
294: if ((out = creat (drft, m_gmprot ())) == NOTOK)
295: adios (drft, "unable to create");
296: cpydata (in, out, form, drft);
297: (void) close (in);
298: (void) close (out);
299:
300: edit_it: ;
301: m_update ();
302:
303: if (nwhat)
304: done (0);
305: (void) m_whatnow (ed, nedit, use, drft, NULLCP, 0, NULLMP, NULLCP, 0, cwd);
306: done (1);
307: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.