]> diplodocus.org Git - nmh/blob - docs/historical/mh-jun-1982/progs/scan.c
Replaced use of snprintf() with memcpy()/memmove().
[nmh] / docs / historical / mh-jun-1982 / progs / scan.c
1 #ifdef COMMENT
2 Proprietary Rand Corporation, 1981.
3 Further distribution of this software
4 subject to the terms of the Rand
5 license agreement.
6 #endif
7
8 #include "../mh.h"
9 #include <stdio.h>
10 #include <strings.h>
11 #include "scansub.h"
12
13 long time();
14
15 int hdrflag;
16 int timeflag;
17 int numflag;
18 struct msgs *mp;
19
20 struct swit switches[] = {
21 "all", -3, /* 0 */
22 "ff", 0, /* 1 */
23 "noff", 0, /* 2 */
24 "header", 0, /* 3 */
25 "noheader", 0, /* 4 */
26 "help", 4, /* 5 */
27 "time", 0, /* 6 */
28 "notime", 0, /* 7 */
29 "numdate", 0, /* 8 */
30 "nonumdate", 0, /* 9 */
31 0, 0
32 };
33
34 extern char _sobuf[]; /* MLW standard out buffer */
35
36 /*ARGSUSED*/
37 main(argc, argv)
38 char *argv[];
39 {
40 char *folder, *maildir, *msgs[100];
41 register int msgnum;
42 register char *cp, **ap;
43 int msgp, ff;
44 FILE *in;
45 long now;
46 char *arguments[50], **argp;
47
48 invo_name = argv[0];
49 #ifndef _IOLBF
50 setbuf(stdout, _sobuf);
51 #endif _IOLBF
52 #ifdef NEWS
53 m_news();
54 #endif
55 ff = 0; msgp = 0; folder = 0;
56 cp = r1bindex(argv[0], '/');
57 if((cp = m_find(cp)) != NULL) {
58 ap = brkstring(cp = getcpy(cp), " ", "\n");
59 ap = copyip(ap, arguments);
60 } else
61 ap = arguments;
62 VOID copyip(argv+1, ap);
63 argp = arguments;
64 while(cp = *argp++) {
65 if(*cp == '-')
66 switch(smatch(++cp, switches)) {
67 case -2:ambigsw(cp, switches); /* ambiguous */
68 goto leave;
69 /* unknown */
70 case -1:fprintf(stderr, "scan: -%s unknown\n", cp);
71 goto leave;
72 /* -all */
73 case 0: fprintf(stderr, "\"-all\" changed to \"all\"\n");
74 goto leave;
75 case 1: ff = 1; continue; /* -ff */
76 case 2: ff = 0; continue; /* -noff */
77 case 3: hdrflag = 1; continue; /* -header */
78 case 4: hdrflag = 0; continue; /* -noheader */
79 case 6: timeflag = 1; continue; /* -time */
80 case 7: timeflag = 0; continue; /* -notime */
81 case 8: numflag = 1; continue; /* -numdate */
82 case 9: numflag = 0; continue; /* -nonumdate */
83 case 5: help("scan [+folder] [msgs] [switches]",
84 switches);
85 goto leave;
86 }
87 if(*cp == '+') {
88 if(folder) {
89 fprintf(stderr, "Only one folder at a time.\n");
90 goto leave;
91 } else
92 folder = path(cp+1, TFOLDER);
93 } else
94 msgs[msgp++] = cp;
95 }
96 if(!m_find("path")) free(path("./", TFOLDER));
97 if(!folder)
98 folder = m_getfolder();
99 maildir = m_maildir(folder);
100 if(chdir(maildir) < 0) {
101 fprintf(stderr, "Can't chdir to: ");
102 perror(maildir);
103 goto leave;
104 }
105 if(!(mp = m_gmsg(folder))) {
106 fprintf(stderr, "Can't read folder!?\n");
107 goto leave;
108 }
109 if(mp->hghmsg == 0) {
110 fprintf(stderr, "No messages in \"%s\".\n", folder);
111 goto leave;
112 }
113 if(!msgp)
114 msgs[msgp++] = "first-last";
115 for(msgnum = 0; msgnum < msgp; msgnum++)
116 if(!m_convert(msgs[msgnum]))
117 goto leave;
118 if(mp->numsel == 0) {
119 fprintf(stderr, "scan: matzo balls.\n"); /* never get here */
120 goto leave;
121 }
122 m_replace(pfolder,folder);
123 for(msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
124 if(mp->msgstats[msgnum]&SELECTED) {
125 if((in = fopen(cp = m_name(msgnum), "r")) == NULL)
126 fprintf(stderr, "--Can't open %s\n", cp);
127 else {
128 if(hdrflag) {
129 now = time((long *)0);
130 cp = cdate(&now);
131 cp[9] = ' '; cp[15] = 0;
132 printf("\
133 Folder %-32s%s\n\n", folder, cp);
134 }
135 VOID scan(in, msgnum, 0,
136 msgnum == mp->curmsg,
137 (timeflag ? DOTIME : 0)
138 | (numflag ? NUMDATE : 0), hdrflag);
139 hdrflag = 0;
140 VOID fclose(in);
141 if(stdout->_cnt < 80)
142 VOID fflush(stdout);
143 }
144 }
145 }
146 if(ff)
147 putchar('\014');
148 leave:
149 m_update();
150 done