|
|
1.1 root 1: /* scan.c - display a one-line "scan" listing */
2:
3: #include "../h/mh.h"
4: #include "../h/formatsbr.h"
5: #include "../h/scansbr.h"
6: #include "../zotnet/tws.h"
7: #include <errno.h>
8: #include <stdio.h>
9:
10: /* */
11:
12: static struct swit switches[] = {
13: #define CLRSW 0
14: "clear", 0,
15: #define NCLRSW 1
16: "noclear", 0,
17:
18: #define FORMSW 2
19: "form formatfile", 0,
20: #define FMTSW 3
21: "format string", 5,
22:
23: #define HEADSW 4
24: "header", 0,
25: #define NHEADSW 5
26: "noheader", 0,
27:
28: #define WIDSW 6
29: "width columns", 0,
30:
31: #ifdef BERK
32: #define REVSW 7
33: "reverse", 0,
34: #define NREVSW 8
35: "noreverse", 0,
36:
37: #define HELPSW 9
38: #else not BERK
39: #define HELPSW 7
40: #endif not BERK
41: "help", 4,
42:
43: NULL, NULL
44: };
45:
46: /* */
47:
48: extern int errno;
49:
50:
51: void clear_screen ();
52:
53: /* */
54:
55: /* ARGSUSED */
56:
57: main (argc, argv)
58: int argc;
59: char *argv[];
60: {
61: int clearflag = 0,
62: hdrflag = 0,
63: width = 0,
64: msgp = 0,
65: ontty,
66: state,
67: msgnum;
68: #ifdef BERK
69: register int revflag = 0,
70: firstlim,
71: lastlim,
72: incr;
73: #endif BERK
74: char *cp,
75: *maildir,
76: *folder = NULL,
77: *form = NULL,
78: *format = NULL,
79: buf[100],
80: **ap,
81: **argp,
82: *nfs,
83: *arguments[MAXARGS],
84: *msgs[MAXARGS];
85: struct msgs *mp;
86: FILE * in;
87:
88: invo_name = r1bindex (argv[0], '/');
89: if ((cp = m_find (invo_name)) != NULL) {
90: ap = brkstring (cp = getcpy (cp), " ", "\n");
91: ap = copyip (ap, arguments);
92: }
93: else
94: ap = arguments;
95: (void) copyip (argv + 1, ap);
96: argp = arguments;
97:
98: /* */
99:
100: while (cp = *argp++) {
101: if (*cp == '-')
102: switch (smatch (++cp, switches)) {
103: case AMBIGSW:
104: ambigsw (cp, switches);
105: done (1);
106: case UNKWNSW:
107: adios (NULLCP, "-%s unknown", cp);
108: case HELPSW:
109: (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
110: invo_name);
111: help (buf, switches);
112: done (1);
113:
114: case CLRSW:
115: clearflag++;
116: continue;
117: case NCLRSW:
118: clearflag = 0;
119: continue;
120:
121: case FORMSW:
122: if (!(form = *argp++) || *form == '-')
123: adios (NULLCP, "missing argument to %s", argp[-2]);
124: format = NULL;
125: continue;
126: case FMTSW:
127: if (!(format = *argp++) || *format == '-')
128: adios (NULLCP, "missing argument to %s", argp[-2]);
129: form = NULL;
130: continue;
131:
132: case HEADSW:
133: hdrflag++;
134: continue;
135: case NHEADSW:
136: hdrflag = 0;
137: continue;
138:
139: case WIDSW:
140: if (!(cp = *argp++) || *cp == '-')
141: adios (NULLCP, "missing argument to %s", argp[-2]);
142: width = atoi (cp);
143: continue;
144: #ifdef BERK
145: case REVSW:
146: revflag++;
147: continue;
148: case NREVSW:
149: revflag = 0;
150: continue;
151: #endif BERK
152: }
153: if (*cp == '+' || *cp == '@') {
154: if (folder)
155: adios (NULLCP, "only one folder at a time!");
156: else
157: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
158: }
159: else
160: msgs[msgp++] = cp;
161: }
162:
163: /* */
164:
165: if (!m_find ("path"))
166: free (path ("./", TFOLDER));
167: if (!msgp)
168: msgs[msgp++] = "all";
169: if (!folder)
170: folder = m_getfolder ();
171: maildir = m_maildir (folder);
172:
173: if (chdir (maildir) == NOTOK)
174: adios (maildir, "unable to change directory to");
175: if (!(mp = m_gmsg (folder)))
176: adios (NULLCP, "unable to read folder %s", folder);
177: if (mp -> hghmsg == 0)
178: adios (NULLCP, "no messages in %s", folder);
179:
180: for (msgnum = 0; msgnum < msgp; msgnum++)
181: if (!m_convert (mp, msgs[msgnum]))
182: done(1);
183: m_setseq (mp);
184:
185: m_replace (pfolder, folder);
186: m_sync (mp);
187: m_update ();
188:
189: nfs = new_fs (form, format, FORMAT);
190:
191: ontty = isatty (fileno (stdout));
192:
193: /* */
194:
195: #ifdef BERK
196: if (revflag) {
197: firstlim = mp -> hghsel;
198: lastlim = mp -> lowsel;
199: incr = -1;
200: }
201: else {
202: firstlim = mp -> lowsel;
203: lastlim = mp -> hghsel;
204: incr = 1;
205: }
206:
207: for (msgnum = firstlim;
208: (revflag ? msgnum >= lastlim : msgnum <= lastlim);
209: msgnum += incr)
210: #else not BERK
211: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
212: #endif not BERK
213: if (mp -> msgstats[msgnum] & SELECTED) {
214: if ((in = fopen (cp = m_name (msgnum), "r")) == NULL) {
215: if (errno != EACCES)
216: admonish (cp, "unable to open message");
217: else
218: printf ("%*d unreadable\n", DMAXFOLDER, msgnum);
219: free (cp);
220: continue;
221: }
222:
223: if (hdrflag)
224: printf ("Folder %-32s%s\n\n", folder, dtimenow ());
225: switch (state = scan (in, msgnum, 0, nfs, width,
226: msgnum == mp -> curmsg,
227: hdrflag, 0L, 1)) {
228: case SCNMSG:
229: case SCNERR:
230: break;
231:
232: default:
233: adios (NULLCP, "scan() botch (%d)", state);
234:
235: case SCNEOF:
236: printf ("%*d empty\n", DMAXFOLDER, msgnum);
237: break;
238: }
239: hdrflag = 0;
240: (void) fclose (in);
241: if (ontty)
242: (void) fflush (stdout);
243: }
244:
245: /* */
246:
247: if (clearflag)
248: clear_screen ();
249:
250: done (0);
251: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.