annotate uip/sortm.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents bce86c4163a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* sortm.c - sort messages in a folder by date/time */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 /* 21Apr90 do subject sorts too - from V. Jacobson */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
4 static char ident[] = "@(#)$Id: sortm.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #define getws _getws
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #undef getws
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #if defined(SYS5) && defined(AUX)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #define u_short ushort
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #define u_long ulong
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #define DATESW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 "datefield field", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #define TEXTSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 "textfield field", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #define NSUBJSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 "notextfield", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #define SUBJSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 "subject", -3, /* backward-compatibility */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #define LIMSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 "limit days", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #define NLIMSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 "nolimit", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #define VERBSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 "verbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #define NVERBSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 "noverbose", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define HELPSW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 struct smsg {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 int s_msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 time_t s_clock;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 char *s_subj;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 static struct smsg *smsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 int nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 char *subjsort = (char *)0; /* sort on subject if != 0 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 u_long datelimit = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 int submajor = 0; /* if true, sort on subject-major */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 int verbose;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 #ifdef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 static int getws (char *datesw, int msg, struct smsg *smsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 static int getws ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 static int dsort(), read_hdrs (), subsort(), txtsort();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 static void rename_chain(), rename_msgs();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 int msgp = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 *maildir,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 *datesw = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 *folder = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 buf[100],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 *arguments[MAXARGS],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 *msgs[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 struct smsg **dlist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 (void) sprintf(buf, "%s [+folder] [msgs] [switches]",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 case DATESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 if (datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 adios (NULLCP, "only one date field at a time");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 if (!(datesw = *argp++) || *datesw == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 case TEXTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 if (subjsort)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 adios (NULLCP, "only one text field at a time");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 if (!(subjsort = *argp++) || *subjsort == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 case SUBJSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 subjsort = "subject";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 case NSUBJSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 subjsort = (char *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 case LIMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 while (*cp == '0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 cp++; /* skip any leading zeros */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 if (!*cp) { /* hit end of string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 submajor++; /* sort subject-major */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 if (!isdigit(*cp) || !(datelimit = atoi(cp)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 adios (NULLCP, "impossible limit %s", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 datelimit *= 60*60*24;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 case NLIMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 submajor = 0; /* use date-major, but */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 datelimit = 0; /* use no limit */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 case VERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 verbose++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 case NVERBSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 verbose = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 if (*cp == '+' || *cp == '@') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 adios (NULLCP, "only one folder at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 msgs[msgp++] = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 if (!m_find ("path"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 free (path ("./", TFOLDER));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 if (!msgp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 msgs[msgp++] = "all";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 if (!datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 datesw = "date";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 if (!folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 folder = m_getfolder ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 maildir = m_maildir (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 if (chdir (maildir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 adios (maildir, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 if (!(mp = m_gmsg (folder)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 adios (NULLCP, "unable to read folder %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 if (mp->hghmsg == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 adios (NULLCP, "no messages in %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 for (msgnum = 0; msgnum < msgp; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 if (!m_convert (mp, msgs[msgnum]))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 m_setseq (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 if ((nmsgs = read_hdrs (mp, datesw)) <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 adios (NULLCP, "no messages to sort");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 * sort a list of pointers to our "messages to be sorted".
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 dlist = (struct smsg **) malloc ((nmsgs+1) * sizeof(*dlist));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 if (! dlist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 adios (NULLCP, "couldn't allocate sort memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 for (i = 0; i < nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 dlist[i] = &smsgs[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 dlist[nmsgs] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 if (verbose) /* announce what we're doing */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 if (subjsort)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 printf ("sorting by %s-major %s-minor\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 submajor ? subjsort : datesw,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 submajor ? datesw : subjsort);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 printf ("sorting by datefield %s\n", datesw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 /* first sort by date, or by subject-major, date-minor */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 qsort ((char *) dlist, nmsgs, sizeof(*dlist),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 submajor && subjsort ? txtsort : dsort);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 * if we're sorting on subject, we need another list
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 * in subject order, then a merge pass to collate the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 * two sorts.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 if (!submajor && subjsort) { /* already date sorted */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 struct smsg **slist,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 **flist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 register struct smsg ***il,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 **fp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 **dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 slist = (struct smsg **) malloc ((nmsgs+1) * sizeof(*slist));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 if (! slist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 adios (NULLCP, "couldn't allocate sort memory");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 bcopy ((char *)dlist, (char *)slist, (nmsgs+1)*sizeof(*slist));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 qsort ((char *)slist, nmsgs, sizeof(*slist), subsort);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 * make an inversion list so we can quickly find
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 * the collection of messages with the same subj
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 * given a message number.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 il = (struct smsg ***) calloc (mp->hghsel+1, sizeof(*il));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 if (! il)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 adios (NULLCP, "couldn't allocate msg list");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 for (i = 0; i < nmsgs; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 il[slist[i]->s_msg] = &slist[i];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 * make up the final list, chronological but with
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 * all the same subjects grouped together.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 flist = (struct smsg **) malloc ((nmsgs+1) * sizeof(*flist));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 if (! flist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 adios (NULLCP, "couldn't allocate msg list");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 fp = flist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 for (dp = dlist; *dp;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 register struct smsg **s = il[(*dp++)->s_msg];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 /* see if we already did this guy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 if (! s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 *fp++ = *s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 * take the next message(s) if there is one,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 * its subject isn't null and its subject
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 * is the same as this one and it's not too
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 * far away in time.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 while (*s && (*s)->s_subj[0] &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 strcmp((*s)->s_subj, s[-1]->s_subj) == 0 &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 (datelimit == 0 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 (*s)->s_clock - s[-1]->s_clock <= datelimit)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 il[(*s)->s_msg] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 *fp++ = *s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 *fp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 (void) free (slist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 (void) free (dlist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 dlist = flist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 rename_msgs (mp, dlist);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 m_replace (pfolder, folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 m_sync (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 m_update ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 read_hdrs (mp, datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 register struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 register char *datesw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 struct tws tb;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 register struct smsg *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 twscopy (&tb, dtwstime ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 smsgs = (struct smsg *)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 calloc ((unsigned) (mp->hghsel - mp->lowsel + 2),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 sizeof *smsgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 if (smsgs == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 adios (NULLCP, "unable to allocate sort storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 s = smsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 if (mp->msgstats[msgnum] & SELECTED) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 if (getws (datesw, msgnum, s)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 s->s_msg = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 s++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 s->s_msg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 return(s - smsgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 static
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 getws (datesw, msg, smsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 register char *datesw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 int msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 register struct smsg *smsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 register int state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 int compnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 char *msgnam,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 buf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 nam[NAMESZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 register struct tws *tw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 register char *datecomp = NULLCP,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 *subjcomp = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 register FILE *in;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 admonish (msgnam, "unable to read message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 for (compnum = 1, state = FLD;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 switch (state = m_getfld (state, nam, buf, sizeof buf, in)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 compnum++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 if (uleq (nam, datesw)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 datecomp = add (buf, datecomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 state = m_getfld (state, nam, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 datecomp = add (buf, datecomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (!subjsort || subjcomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 else if (subjsort && uleq (nam, subjsort)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 subjcomp = add (buf, subjcomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 state = m_getfld (state, nam, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 subjcomp = add (buf, subjcomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 if (datecomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 /* just flush this guy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 while (state == FLDPLUS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 state = m_getfld (state, nam, buf, sizeof buf, in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 case BODY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 case BODYEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 case FILEEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 case LENERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 case FMTERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 if (state == LENERR || state == FMTERR)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 admonish (NULLCP, "format error in message %d (header #%d)",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 msg, compnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 if (datecomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 free (datecomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 if (subjcomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 free (subjcomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 return (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 adios (NULLCP, "internal error -- you lose");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 if (!datecomp || (tw = dparsetime (datecomp)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 admonish (NULLCP, "can't parse %s field in message %d",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 datesw, msg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 /* use the modify time of the file as its date */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 (void) fstat (fileno (in), &st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 smsg->s_clock = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 smsg->s_clock = twclock (tw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 if (subjsort) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 if (subjcomp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 * try to make the subject "canonical": delete
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 * leading "re:", everything but letters & smash
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 * letters to lower case.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 *cp2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 cp = subjcomp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 cp2 = subjcomp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 if (strcmp (subjsort, "subject") == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 while (c = *cp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 if (! isspace(c)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 if(uprf(cp, "re:"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 cp += 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 if (isalnum(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 *cp2++ = isupper(c) ? tolower(c) : c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 while (c = *cp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 if (isalnum(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 *cp2++ = isupper(c) ? tolower(c) : c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 *cp2 = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 subjcomp = "";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 smsg->s_subj = subjcomp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 (void) fclose (in);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 if (datecomp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 free (datecomp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 * sort on dates.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 dsort (a, b)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 register struct smsg **a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 **b;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 if ((*a)->s_clock < (*b)->s_clock)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 return (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 else if ((*a)->s_clock > (*b)->s_clock)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 else if ((*a)->s_msg < (*b)->s_msg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 return (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 * sort on subjects.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 subsort (a, b)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 register struct smsg **a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 **b;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 if (i = strcmp ((*a)->s_subj, (*b)->s_subj))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 return (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 return (dsort (a, b));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 static int
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 txtsort (a, b)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 register struct smsg **a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 **b;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 if (i = strcmp ((*a)->s_subj, (*b)->s_subj))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 return (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 else if ((*a)->s_msg < (*b)->s_msg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 return (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 return (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 static void rename_chain (mp, mlist, msg, endmsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 register struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 struct smsg **mlist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 int msg,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 endmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 int nxt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 old,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 new;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 char *newname,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 oldname[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 nxt = mlist[msg] - smsgs; /* mlist[msg] is a ptr into smsgs */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 mlist[msg] = (struct smsg *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 old = smsgs[nxt].s_msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 new = smsgs[msg].s_msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 (void) strcpy (oldname, m_name (old));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 newname = m_name (new);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 printf ("message %d becomes message %d\n", old, new);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 if (rename (oldname, newname) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 adios (newname, "unable to rename %s to", oldname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 mp->msgstats[new] = mp->msgstats[old];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 if (mp->curmsg == old)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 m_setcur (mp, new);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 if (nxt == endmsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 msg = nxt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 /* if (nxt != endmsg); */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 /* rename_chain (mp, mlist, nxt, endmsg); */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 static void
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 rename_msgs (mp, mlist)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 register struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 register struct smsg **mlist;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 j,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 old,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 new;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 int stats;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 char f1[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 register struct smsg *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 (void) strcpy (tmpfil, m_name (mp->hghmsg + 1));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 for (i = 0; i < nmsgs; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565 if (! (sp = mlist[i]))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 continue; /* did this one */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 j = sp - smsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 if (j == i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 continue; /* this one doesn't move */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 * the guy that was msg j is about to become msg i.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 * rename 'j' to make a hole, then recursively rename
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 * guys to fill up the hole.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 old = smsgs[j].s_msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 new = smsgs[i].s_msg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 (void) strcpy (f1, m_name (old));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 if (verbose)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582 printf ("renaming message chain from %d to %d\n", old, new);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if (rename (f1, tmpfil) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 adios (tmpfil, "unable to rename %s to ", f1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 stats = mp->msgstats[old];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 rename_chain (mp, mlist, j, i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 if (rename (tmpfil, m_name(new)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 adios (m_name(new), "unable to rename %s to", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 mp->msgstats[new] = stats;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 mp->msgflags |= SEQMOD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 }