Added all of the MH sources, including RCS files, in
[mmh] / 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 @