|
|
1.1 root 1: /* mark.c - mark messages */
2:
3: #include "../h/mh.h"
4: #include <stdio.h>
5:
6: /* */
7:
8: static struct swit switches[] = {
9: #define ADDSW 0
10: "add", 0,
11: #define DELSW 1
12: "delete", 0,
13: #define LSTSW 2
14: "list", 0,
15:
16: #define SEQSW 3
17: "sequence name", 0,
18:
19: #define PUBLSW 4
20: "public", 0,
21: #define NPUBLSW 5
22: "nopublic", 0,
23:
24: #define ZEROSW 6
25: "zero", 0,
26: #define NZEROSW 7
27: "nozero", 0,
28:
29: #define HELPSW 8
30: "help", 4,
31:
32: #define DEBUGSW 9
33: "debug", -5,
34:
35: NULL, NULL
36: };
37:
38: /* */
39:
40: /* ARGSUSED */
41:
42: main (argc, argv)
43: int argc;
44: char **argv;
45: {
46: int addsw = 0,
47: deletesw = 0,
48: debugsw = 0,
49: listsw = 0,
50: publicsw = -1,
51: zerosw = 0,
52: seqp = 0,
53: msgp = 0,
54: i,
55: msgnum;
56: char *cp,
57: *maildir,
58: *folder = NULL,
59: buf[100],
60: **ap,
61: **argp,
62: *arguments[MAXARGS],
63: *seqs[NATTRS + 1],
64: *msgs[MAXARGS];
65: struct msgs *mp;
66:
67: invo_name = r1bindex (argv[0], '/');
68: if ((cp = m_find (invo_name)) != NULL) {
69: ap = brkstring (cp = getcpy (cp), " ", "\n");
70: ap = copyip (ap, arguments);
71: }
72: else
73: ap = arguments;
74: (void) copyip (argv + 1, ap);
75: argp = arguments;
76:
77: /* */
78:
79: while (cp = *argp++) {
80: if (*cp == '-')
81: switch (smatch (++cp, switches)) {
82: case AMBIGSW:
83: ambigsw (cp, switches);
84: done (1);
85: case UNKWNSW:
86: adios (NULLCP, "-%s unknown\n", cp);
87: case HELPSW:
88: (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
89: invo_name);
90: help (buf, switches);
91: done (1);
92:
93: case ADDSW:
94: addsw++;
95: deletesw = listsw = 0;
96: continue;
97: case DELSW:
98: deletesw++;
99: addsw = listsw = 0;
100: continue;
101: case LSTSW:
102: listsw++;
103: addsw = deletesw = 0;
104: continue;
105:
106: case SEQSW:
107: if (!(cp = *argp++) || *cp == '-')
108: adios (NULLCP, "missing argument to %s", argp[-2]);
109: if (seqp < NATTRS)
110: seqs[seqp++] = cp;
111: else
112: adios (NULLCP, "only %d sequences allowed!", NATTRS);
113: continue;
114:
115: case PUBLSW:
116: publicsw = 1;
117: continue;
118: case NPUBLSW:
119: publicsw = 0;
120: continue;
121:
122: case DEBUGSW:
123: debugsw++;
124: continue;
125:
126: case ZEROSW:
127: zerosw++;
128: continue;
129: case NZEROSW:
130: zerosw = 0;
131: continue;
132: }
133: if (*cp == '+' || *cp == '@') {
134: if (folder)
135: adios (NULLCP, "only one folder at a time!");
136: else
137: folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
138: }
139: else
140: msgs[msgp++] = cp;
141: }
142:
143: /* */
144:
145: if (!addsw && !deletesw && !listsw)
146: if (seqp)
147: addsw++;
148: else
149: listsw++;
150:
151: if (!m_find ("path"))
152: free (path ("./", TFOLDER));
153: if (!msgp)
154: msgs[msgp++] = listsw ? "all" :"cur";
155: if (!folder)
156: folder = m_getfolder ();
157: maildir = m_maildir (folder);
158:
159: if (chdir (maildir) == NOTOK)
160: adios (maildir, "unable to change directory to");
161: if (!(mp = m_gmsg (folder)))
162: adios (NULLCP, "unable to read folder %s", folder);
163: if (mp -> hghmsg == 0)
164: adios (NULLCP, "no messages in %s", folder);
165:
166: for (msgnum = 0; msgnum < msgp; msgnum++)
167: if (!m_convert (mp, msgs[msgnum]))
168: done (1);
169:
170: if (publicsw == -1)
171: publicsw = mp -> msgflags & READONLY ? 0 : 1;
172: if (publicsw && (mp -> msgflags & READONLY))
173: adios (NULLCP, "folder %s is read-only, so -public not allowed",
174: folder);
175:
176: /* */
177:
178: if (debugsw) {
179: printf ("invo_name=%s mypath=%s defpath=%s\n",
180: invo_name, mypath, defpath);
181: printf ("ctxpath=%s context flags=%s\n",
182: ctxpath, sprintb (buf, (unsigned) ctxflags, DBITS));
183: printf ("foldpath=%s flags=%s\n",
184: mp -> foldpath,
185: sprintb (buf, (unsigned) mp -> msgflags, FBITS));
186: printf ("lowmsg=%d hghmsg=%d nummsg=%d curmsg=%d\n",
187: mp -> lowmsg, mp -> hghmsg, mp -> nummsg, mp -> curmsg);
188: printf ("lowsel=%d hghsel=%d numsel=%d\n",
189: mp -> lowsel, mp -> hghsel, mp -> numsel);
190: #ifndef MTR
191: printf ("lowoff=%d hghoff=%d\n",
192: mp -> lowoff, mp -> hghoff);
193: #else MTR
194: printf ("lowoff=%d hghoff=%d msgbase=0x%x msgstats=0x%x\n",
195: mp -> lowoff, mp -> hghoff, mp -> msgbase, mp -> msgstats);
196: #endif MTR
197: }
198:
199: if (seqp == 0 && (addsw || deletesw))
200: adios (NULLCP, "-%s requires at least one -sequence argument",
201: addsw ? "add" : "delete");
202: seqs[seqp] = NULL;
203:
204: if (addsw)
205: for (seqp = 0; seqs[seqp]; seqp++) {
206: if (zerosw && !m_seqnew (mp, seqs[seqp], publicsw))
207: done (1);
208: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
209: if (mp -> msgstats[msgnum] & SELECTED)
210: if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
211: done (1);
212: }
213:
214: if (deletesw)
215: for (seqp = 0; seqs[seqp]; seqp++) {
216: if (zerosw)
217: for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++)
218: if (mp -> msgstats[msgnum] & EXISTS)
219: if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
220: done (1);
221: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
222: if (mp -> msgstats[msgnum] & SELECTED)
223: if (!m_seqdel (mp, seqs[seqp], msgnum))
224: done (1);
225: }
226:
227: if (listsw) {
228: int bits = FFATTRSLOT;
229:
230: if (seqp == 0)
231: for (i = 0; mp -> msgattrs[i]; i++)
232: printf ("%s%s: %s\n", mp -> msgattrs[i],
233: mp -> attrstats & (1 << (bits + i))
234: ? " (private)" : "",
235: m_seq (mp, mp -> msgattrs[i]));
236: else
237: for (seqp = 0; seqs[seqp]; seqp++)
238: printf ("%s: %s\n", seqs[seqp], m_seq (mp, seqs[seqp]));
239:
240: if (debugsw)
241: for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
242: if (mp -> msgstats[msgnum] & SELECTED)
243: printf ("%*d: %s\n", DMAXFOLDER, msgnum,
244: sprintb (buf, (unsigned) mp -> msgstats[msgnum],
245: m_seqbits (mp)));
246: }
247:
248: m_replace (pfolder, folder);
249: m_sync (mp);
250: m_update ();
251:
252: done (0);
253: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.