|
|
1.1 root 1: #
2: #include "rcv.h"
3: #include <sys/stat.h>
4:
5: /*
6: * Mail -- a mail program
7: *
8: * User commands.
9: */
10:
11: /*
12: * Print the current active headings.
13: */
14:
15: static int screen;
16:
17: headers(argv)
18: char **argv;
19: {
20: register int mesg, flag;
21: register struct message *mp;
22: char c, *str;
23:
24: str = argv[0];
25: if (argcount(argv) == 0)
26: c = 0;
27: else
28: c = str[0];
29: if (c) {
30: if (numeric(str))
31: screen = atoi(str) / SCREEN;
32: else
33: switch (c) {
34: case '0':
35: /*
36: * Go back to top.
37: */
38: screen = 0;
39: break;
40:
41: case '+':
42: /*
43: * scroll down.
44: */
45: screen++;
46: break;
47:
48: case '-':
49: /*
50: * scroll up.
51: */
52: screen--;
53: break;
54: }
55: if (screen < 0)
56: screen = 0;
57: }
58: mp = &message[screen * SCREEN];
59: if (mp > &message[msgCount])
60: mp = &message[msgCount - SCREEN];
61: if (mp < &message[0])
62: mp = &message[0];
63: flag = 0;
64: mesg = mp - &message[0];
65: dot = mp;
66: for (; mp < &message[msgCount]; mp++) {
67: mesg++;
68: if (mp->m_flag & MDELETED)
69: continue;
70: if (flag++ >= SCREEN)
71: break;
72: printhead(mesg);
73: sreset();
74: }
75: if (flag == 0) {
76: printf("No more mail.\n");
77: return(1);
78: }
79: return(0);
80: }
81:
82: /*
83: * Print out the headlines for each message
84: * in the passed message list.
85: */
86:
87: from(msgvec)
88: int *msgvec;
89: {
90: register int *ip;
91:
92: for (ip = msgvec; *ip != NULL; ip++) {
93: printhead(*ip);
94: sreset();
95: }
96: if (--ip >= msgvec)
97: dot = &message[*ip - 1];
98: return(0);
99: }
100:
101: /*
102: * Print out the header of a specific message.
103: * This is a slight improvement to the standard one.
104: */
105:
106: printhead(mesg)
107: {
108: struct message *mp;
109: FILE *ibuf;
110: char headline[LINESIZE], wcount[10], *subjline, dispc;
111: char pbuf[BUFSIZ];
112: int s;
113: struct headline hl;
114: register char *cp;
115:
116: mp = &message[mesg-1];
117: ibuf = setinput(mp);
118: readline(ibuf, headline);
119: subjline = hfield("subject", mp);
120: if (subjline == NOSTR)
121: subjline = hfield("subj", mp);
122:
123: /*
124: * Bletch!
125: */
126:
127: if (subjline != NOSTR && strlen(subjline) > 28)
128: subjline[29] = '\0';
129: if (mp->m_flag & MSAVED)
130: dispc = '*';
131: else if (mp->m_flag & MPRESERVED)
132: dispc = 'P';
133: else
134: dispc = ' ';
135: parse(headline, &hl, pbuf);
136: sprintf(wcount, " %d/%d", mp->m_lines, mp->m_size);
137: s = strlen(wcount);
138: cp = wcount + s;
139: while (s < 7)
140: s++, *cp++ = ' ';
141: *cp = '\0';
142: if (subjline != NOSTR)
143: printf("%c%3d %-8s %16.16s %s \"%s\"\n", dispc, mesg,
144: nameof(mp), hl.l_date, wcount, subjline);
145: else
146: printf("%c%3d %-8s %16.16s %s\n", dispc, mesg,
147: nameof(mp), hl.l_date, wcount);
148: }
149:
150: /*
151: * Print out the value of dot.
152: */
153:
154: pdot()
155: {
156: printf("%d\n", dot - &message[0] + 1);
157: return(0);
158: }
159:
160: /*
161: * Print out all the possible commands.
162: */
163:
164: pcmdlist()
165: {
166: register struct cmd *cp;
167: register int cc;
168: extern struct cmd cmdtab[];
169:
170: printf("Commands are:\n");
171: for (cc = 0, cp = cmdtab; cp->c_name != NULL; cp++) {
172: cc += strlen(cp->c_name) + 2;
173: if (cc > 72) {
174: printf("\n");
175: cc = strlen(cp->c_name) + 2;
176: }
177: if ((cp+1)->c_name != NOSTR)
178: printf("%s, ", cp->c_name);
179: else
180: printf("%s\n", cp->c_name);
181: }
182: return(0);
183: }
184:
185: /*
186: * Go to the previous message and type it.
187: * If at the top, just bitch.
188: */
189:
190: previous(argv)
191: char **argv;
192: {
193: register struct message *mp;
194: register int c;
195: int list[2];
196:
197: c = 1;
198: if (argcount(argv) != 0)
199: c = atoi(argv[0]);
200: while (c--) {
201: mp = dot;
202: do {
203: mp--;
204: if (mp < &message[0]) {
205: printf("Nonzero address required\n");
206: return(0);
207: }
208: } while (mp->m_flag & (MDELETED|MSAVED));
209: dot = mp;
210: }
211: list[0] = dot - &message[0] + 1;
212: list[1] = NULL;
213: return(type(list));
214: }
215:
216: /*
217: * Type out the messages requested.
218: */
219:
220: type(msgvec)
221: int *msgvec;
222: {
223: register *ip;
224: register struct message *mp;
225: register int mesg;
226: int c;
227: FILE *ibuf;
228:
229: for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
230: mesg = *ip;
231: touch(mesg);
232: mp = &message[mesg-1];
233: dot = mp;
234: print(mp);
235: }
236: return(0);
237: }
238:
239: /*
240: * Print the indicated message on standard output.
241: */
242:
243: print(mp)
244: register struct message *mp;
245: {
246:
247: if (value("quiet") == NOSTR)
248: printf("Message %2d:\n", mp - &message[0] + 1);
249: touch(mp - &message[0] + 1);
250: send(mp, stdout);
251: }
252:
253: /*
254: * Print the top so many lines of each desired message.
255: * The number of lines is taken from the variable "toplines"
256: * and defaults to 5.
257: */
258:
259: top(msgvec)
260: int *msgvec;
261: {
262: register int *ip;
263: register struct message *mp;
264: register int mesg;
265: int c, topl, lines, lineb;
266: char *valtop, linebuf[LINESIZE];
267: FILE *ibuf;
268:
269: topl = 5;
270: valtop = value("toplines");
271: if (valtop != NOSTR) {
272: topl = atoi(valtop);
273: if (topl < 0 || topl > 10000)
274: topl = 5;
275: }
276: lineb = 1;
277: for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
278: mesg = *ip;
279: touch(mesg);
280: mp = &message[mesg-1];
281: dot = mp;
282: if (value("quiet") == NOSTR)
283: printf("Message %2d:\n", mesg);
284: ibuf = setinput(mp);
285: c = mp->m_lines;
286: if (!lineb)
287: printf("\n");
288: for (lines = 0; lines < c && lines <= topl; lines++) {
289: if (readline(ibuf, linebuf) <= 0)
290: break;
291: puts(linebuf);
292: lineb = blankline(linebuf);
293: }
294: }
295: return(0);
296: }
297:
298: /*
299: * Touch all the given messages so that they will
300: * get mboxed.
301: */
302:
303: stouch(msgvec)
304: int msgvec[];
305: {
306: register int *ip;
307:
308: for (ip = msgvec; *ip != 0; ip++) {
309: touch(*ip);
310: dot = &message[*ip-1];
311: dot->m_flag &= ~MPRESERVE;
312: }
313: return(0);
314: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.