]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/uip/RCS/pick.c,v
sbr/mts.c: Delete mmdlm2; use same-valued mmdlm1 instead.
[nmh] / docs / historical / mh-6.8.5 / uip / RCS / pick.c,v
1 head 1.4;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 1.4
9 date 92.12.15.00.20.22; author jromine; state Exp;
10 branches;
11 next 1.3;
12
13 1.3
14 date 92.11.04.00.54.26; author jromine; state Exp;
15 branches;
16 next 1.2;
17
18 1.2
19 date 92.01.31.22.20.06; author jromine; state Exp;
20 branches;
21 next 1.1;
22
23 1.1
24 date 92.01.31.22.19.55; author jromine; state Exp;
25 branches;
26 next ;
27
28
29 desc
30 @@
31
32
33 1.4
34 log
35 @endif sugar
36 @
37 text
38 @/* pick.c - select messages by content */
39 #ifndef lint
40 static char ident[] = "@@(#)$Id: pick.c,v 1.3 1992/11/04 00:54:26 jromine Exp jromine $";
41 #endif /* lint */
42
43 #include "../h/mh.h"
44 #include "../zotnet/tws.h"
45 #include <stdio.h>
46 #ifdef LOCALE
47 #include <locale.h>
48 #endif
49
50 /* \f */
51
52 static struct swit switches[] = {
53 #define ANDSW 0
54 "and", 0,
55 #define ORSW 1
56 "or", 0,
57 #define NOTSW 2
58 "not", 0,
59 #define LBRSW 3
60 "lbrace", 0,
61 #define RBRSW 4
62 "rbrace", 0,
63
64 #define CCSW 5
65 "cc pattern", 0,
66 #define DATESW 6
67 "date pattern", 0,
68 #define FROMSW 7
69 "from pattern", 0,
70 #define SRCHSW 8
71 "search pattern", 0,
72 #define SUBJSW 9
73 "subject pattern", 0,
74 #define TOSW 10
75 "to pattern", 0,
76 #define OTHRSW 11
77 "-othercomponent pattern", 0,
78 #define AFTRSW 12
79 "after date", 0,
80 #define BEFRSW 13
81 "before date", 0,
82 #define DATFDSW 14
83 "datefield field", 5,
84
85 #define SEQSW 15
86 "sequence name", 0,
87 #define PUBLSW 16
88 "public", 0,
89 #define NPUBLSW 17
90 "nopublic", 0,
91 #define ZEROSW 18
92 "zero", 0,
93 #define NZEROSW 19
94 "nozero", 0,
95
96 #define LISTSW 20
97 "list", 0,
98 #define NLISTSW 21
99 "nolist", 0,
100
101 #define HELPSW 22
102 "help", 4,
103
104 NULL, 0
105 };
106
107 /* \f */
108
109 static int listsw = 0;
110
111 /* \f */
112
113 /* ARGSUSED */
114
115 main (argc, argv)
116 char *argv[];
117 {
118 int publicsw = -1,
119 zerosw = 1,
120 msgp = 0,
121 seqp = 0,
122 vecp = 0,
123 lo,
124 hi,
125 msgnum;
126 char *maildir,
127 *folder = NULL,
128 buf[100],
129 *cp,
130 **ap,
131 **argp,
132 *arguments[MAXARGS],
133 *msgs[MAXARGS],
134 *seqs[NATTRS + 1],
135 *vec[MAXARGS];
136 struct msgs *mp;
137 register FILE *fp;
138
139 #ifdef LOCALE
140 setlocale(LC_ALL, "");
141 #endif
142 invo_name = r1bindex (argv[0], '/');
143 if ((cp = m_find (invo_name)) != NULL) {
144 ap = brkstring (cp = getcpy (cp), " ", "\n");
145 ap = copyip (ap, arguments);
146 }
147 else
148 ap = arguments;
149 (void) copyip (argv + 1, ap);
150 argp = arguments;
151
152 /* \f */
153
154 while (cp = *argp++) {
155 if (*cp == '-') {
156 if (*++cp == '-') {
157 vec[vecp++] = --cp;
158 goto pattern;
159 }
160 switch (smatch (cp, switches)) {
161 case AMBIGSW:
162 ambigsw (cp, switches);
163 done (1);
164 case UNKWNSW:
165 adios (NULLCP, "-%s unknown", cp);
166 case HELPSW:
167 (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
168 invo_name);
169 help (buf, switches);
170 listsw = 0; /* HACK */
171 done (1);
172
173 case CCSW:
174 case DATESW:
175 case FROMSW:
176 case SUBJSW:
177 case TOSW:
178 case DATFDSW:
179 case AFTRSW:
180 case BEFRSW:
181 case SRCHSW:
182 vec[vecp++] = --cp;
183 pattern: ;
184 if (!(cp = *argp++))/* allow -xyz arguments */
185 adios (NULLCP, "missing argument to %s", argp[-2]);
186 vec[vecp++] = cp;
187 continue;
188 case OTHRSW:
189 adios (NULLCP, "internal error!");
190
191 case ANDSW:
192 case ORSW:
193 case NOTSW:
194 case LBRSW:
195 case RBRSW:
196 vec[vecp++] = --cp;
197 continue;
198
199 case SEQSW:
200 if (!(cp = *argp++) || *cp == '-')
201 adios (NULLCP, "missing argument to %s", argp[-2]);
202 if (seqp < NATTRS)
203 seqs[seqp++] = cp;
204 else
205 adios (NULLCP, "only %d sequences allowed!", NATTRS);
206 listsw = 0;
207 continue;
208 case PUBLSW:
209 publicsw = 1;
210 continue;
211 case NPUBLSW:
212 publicsw = 0;
213 continue;
214 case ZEROSW:
215 zerosw++;
216 continue;
217 case NZEROSW:
218 zerosw = 0;
219 continue;
220
221 case LISTSW:
222 listsw++;
223 continue;
224 case NLISTSW:
225 listsw = 0;
226 continue;
227 }
228 }
229 if (*cp == '+' || *cp == '@@')
230 if (folder)
231 adios (NULLCP, "only one folder at a time!");
232 else
233 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
234 else
235 msgs[msgp++] = cp;
236 }
237 vec[vecp] = NULL;
238
239 /* \f */
240
241 if (!m_find ("path"))
242 free (path ("./", TFOLDER));
243 if (!msgp)
244 msgs[msgp++] = "all";
245 if (!folder)
246 folder = m_getfolder ();
247 maildir = m_maildir (folder);
248
249 if (chdir (maildir) == NOTOK)
250 adios (maildir, "unable to change directory to");
251 if (!(mp = m_gmsg (folder)))
252 adios (NULLCP, "unable to read folder %s", folder);
253 if (mp -> hghmsg == 0)
254 adios (NULLCP, "no messages in %s", folder);
255
256 for (msgnum = 0; msgnum < msgp; msgnum++)
257 if (!m_convert (mp, msgs[msgnum]))
258 done (1);
259 m_setseq (mp);
260
261 if (seqp == 0)
262 listsw++;
263 if (publicsw == -1)
264 publicsw = mp -> msgflags & READONLY ? 0 : 1;
265 if (publicsw && (mp -> msgflags & READONLY))
266 adios (NULLCP, "folder %s is read-only, so -public not allowed",
267 folder);
268
269 /* \f */
270
271 if (!pcompile (vec, NULLCP))
272 done (1);
273
274 lo = mp -> lowsel;
275 hi = mp -> hghsel;
276
277 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
278 if (mp -> msgstats[msgnum] & SELECTED) {
279 if ((fp = fopen (cp = m_name (msgnum), "r")) == NULL)
280 admonish (cp, "unable to read message");
281 if (fp && pmatches (fp, msgnum, 0L, 0L)) {
282 if (msgnum < lo)
283 lo = msgnum;
284 if (msgnum > hi)
285 hi = msgnum;
286 }
287 else {
288 mp -> msgstats[msgnum] &= ~SELECTED;
289 mp -> numsel--;
290 }
291 if (fp)
292 (void) fclose (fp);
293 }
294
295 mp -> lowsel = lo;
296 mp -> hghsel = hi;
297
298 if (mp -> numsel <= 0)
299 adios (NULLCP, "no messages match specification");
300
301 /* \f */
302
303 seqs[seqp] = NULL;
304 for (seqp = 0; seqs[seqp]; seqp++) {
305 if (zerosw && !m_seqnew (mp, seqs[seqp], publicsw))
306 done (1);
307 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
308 if (mp -> msgstats[msgnum] & SELECTED)
309 if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
310 done (1);
311 }
312
313 if (listsw) {
314 for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
315 if (mp -> msgstats[msgnum] & SELECTED)
316 printf ("%s\n", m_name (msgnum));
317 }
318 else
319 printf ("%d hit%s\n", mp -> numsel,
320 mp -> numsel == 1 ? "" : "s");
321
322 m_replace (pfolder, folder);
323 m_sync (mp);
324 m_update ();
325
326 done (0);
327 }
328
329 /* \f */
330
331 void done (status)
332 int status;
333 {
334 if (listsw && status && !isatty (fileno (stdout)))
335 printf ("0\n");
336 exit (status);
337 }
338 @
339
340
341 1.3
342 log
343 @LOCALE
344 @
345 text
346 @d3 2
347 a4 2
348 static char ident[] = "@@(#)$Id: pick.c,v 1.2 1992/01/31 22:20:06 jromine Exp jromine $";
349 #endif lint
350 @
351
352
353 1.2
354 log
355 @kerberos
356 @
357 text
358 @d3 1
359 a3 1
360 static char ident[] = "@@(#)$Id$";
361 d9 3
362 d102 3
363 @
364
365
366 1.1
367 log
368 @Initial revision
369 @
370 text
371 @d2 3
372 d64 1
373 a64 1
374 NULL, NULL
375 @