* sortm.c -- sort messages in a folder by date/time
*
* $Id$
+ *
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
-#include <zotnet/tws/tws.h>
+#include <h/tws.h>
/*
* We allocate space for messages (msgs array)
if (verbose) { /* announce what we're doing */
if (subjsort)
- printf ("sorting by %s-major %s-minor\n",
+ printf ("sorting by %s-major %s-minor\n",
submajor ? subjsort : datesw,
submajor ? datesw : subjsort);
else
}
/* first sort by date, or by subject-major, date-minor */
- qsort ((char *) dlist, nmsgs, sizeof(*dlist),
+ qsort ((char *) dlist, nmsgs, sizeof(*dlist),
(qsort_comp) (submajor && subjsort ? txtsort : dsort));
/*
*/
while (*s && (*s)->s_subj[0] &&
strcmp((*s)->s_subj, s[-1]->s_subj) == 0 &&
- (datelimit == 0 ||
+ (datelimit == 0 ||
(*s)->s_clock - s[-1]->s_clock <= datelimit)) {
il[(*s)->s_msg] = 0;
*fp++ = *s++;
free (dlist);
dlist = flist;
}
+
+ /*
+ * At this point, dlist is a sorted array of pointers to smsg structures,
+ * each of which contains a message number.
+ */
+
rename_msgs (mp, dlist);
context_replace (pfolder, folder); /* update current folder */
return done (0);
}
-static int
+static int
read_hdrs (struct msgs *mp, char *datesw)
{
int msgnum;
/*
* try to make the subject "canonical": delete
* leading "re:", everything but letters & smash
- * letters to lower case.
+ * letters to lower case.
*/
register char *cp, *cp2, c;
cp = subjcomp;
cp2 = subjcomp;
- if (strcmp (subjsort, "subject") == 0)
+ if (strcmp (subjsort, "subject") == 0) {
while ((c = *cp)) {
if (! isspace(c)) {
if(uprf(cp, "re:"))
cp += 2;
- else {
- if (isalnum(c))
- *cp2++ = isupper(c) ? tolower(c) : c;
+ else
break;
- }
}
cp++;
}
+ }
+
while ((c = *cp++)) {
if (isalnum(c))
*cp2++ = isupper(c) ? tolower(c) : c;
-
}
+
*cp2 = '\0';
}
else
/*
* sort on dates.
*/
-static int
+static int
dsort (struct smsg **a, struct smsg **b)
{
if ((*a)->s_clock < (*b)->s_clock)
/*
* sort on subjects.
*/
-static int
+static int
subsort (struct smsg **a, struct smsg **b)
{
register int i;
return (dsort (a, b));
}
-static int
+static int
txtsort (struct smsg **a, struct smsg **b)
{
register int i;
{
int nxt, old, new;
char *newname, oldname[BUFSIZ];
+ char newbuf[MAXPATHLEN + 1];
for (;;) {
nxt = mlist[msg] - smsgs; /* mlist[msg] is a ptr into smsgs */
if (verbose)
printf ("message %d becomes message %d\n", old, new);
+ (void)snprintf(oldname, sizeof (oldname), "%s/%d", mp->foldpath, old);
+ (void)snprintf(newbuf, sizeof (newbuf), "%s/%d", mp->foldpath, new);
+ ext_hook("ref-hook", oldname, newbuf);
+
if (rename (oldname, newname) == NOTOK)
adios (newname, "unable to rename %s to", oldname);
if (mp->curmsg == old)
seq_setcur (mp, new);
- if (nxt == endmsg)
+ if (nxt == endmsg)
break;
msg = nxt;
int i, j, old, new;
seqset_t tmpset;
char f1[BUFSIZ], tmpfil[BUFSIZ];
+ char newbuf[MAXPATHLEN + 1];
struct smsg *sp;
strncpy (tmpfil, m_name (mp->hghmsg + 1), sizeof(tmpfil));
for (i = 0; i < nmsgs; i++) {
- if (! (sp = mlist[i]))
+ if (! (sp = mlist[i]))
continue; /* did this one */
j = sp - smsgs;
if (verbose)
printf ("renaming message chain from %d to %d\n", old, new);
+ /*
+ * Run the external hook to refile the old message as the
+ * temporary message number that is off of the end of the
+ * messages in the folder.
+ */
+
+ (void)snprintf(f1, sizeof (f1), "%s/%d", mp->foldpath, old);
+ (void)snprintf(newbuf, sizeof (newbuf), "%s/%d", mp->foldpath, mp->hghmsg + 1);
+ ext_hook("ref-hook", f1, newbuf);
+
if (rename (f1, tmpfil) == NOTOK)
adios (tmpfil, "unable to rename %s to ", f1);
+
get_msg_flags (mp, &tmpset, old);
rename_chain (mp, mlist, j, i);
+
+ /*
+ * Run the external hook to refile the temorary message number
+ * to the real place.
+ */
+
+ (void)snprintf(f1, sizeof (f1), "%s/%d", mp->foldpath, new);
+ ext_hook("ref-hook", newbuf, f1);
+
if (rename (tmpfil, m_name(new)) == NOTOK)
adios (m_name(new), "unable to rename %s to", tmpfil);