marvit%hplpm@HPLABS.HP.COM (Peter Marvit) (05/19/89)
Wow! I got ten (!) requests within three hours of my original message. Therefore, here is the context diffs. Some of them are minor (changed variable names, et al), and I've tried to omit purely stylistic ones. Look at the diffs carefully before applying, as you should always do. Note that I've not rewritten the man page to reflect the new capabilities. If someone wants to do that, I'd be grateful (plus it shows that the changes are understood). First, here is what I've recorded in my CHANGELOG file: uip/sortm.c Started with the new Van Jacobson version with the -subject sort. Simplified code a bit. Added -[no]pack for backwards compatibility with old sortm. -pack is default but will not work with partial folders. Subject sort was recoded to actually be subject major, date minor rather than the date major, subject minor. Eventually I may do a generalized field sort, but not yet. Also fixed a tiny bug which may have been HP-UX compiler specific but really looks like some bad programming (return of a function without returning a value). Following are the context diffs. Happy Hacking! -Peter "MH 'R ME" Marvit marvit@hplabs.hp.com ------------------------------ CUT HERE ------------------------------- *** sortm.c.ORIG Tue Jul 5 15:03:02 1988 --- sortm.c Mon Apr 24 22:48:17 1989 *************** *** 1,3 /* sortm.c - sort messages in a folder by date/time */ #include "../h/mh.h" --- 1,24 ----- + /* + * revision 1.4 + * date: 88/07/14 16:08:48; author marvit; + * Simplified code a bit. Added -[no]pack for backwards compatibility with old + * sortm. -pack is default but will not work with partial folders. Subject + * sort recoded to actually be subject major, date minor. + * + * revision 1.3 + * date: 87/05/20 21:30:02; author: van; state: Exp; lines added/del: 122/82 + * corrected sorting of subsets of folder. Just permute original + * numbers. Don't pack or renumber. + * + * revision 1.2 + * date: 87/05/19 05:33:38; author: van; state: Exp; lines added/del: 360/256 + * added subject sorting (-subj flag) + * + * revision 1.1 + * date: 87/05/18 22:58:33; author: van; state: Exp; + * Initial revision + */ + /* sortm.c - sort messages in a folder by date/time */ #include "../h/mh.h" *************** *** 3,8 #include "../h/mh.h" #include "../zotnet/tws.h" #include <stdio.h> /* */ --- 24,32 ----- #include "../h/mh.h" #include "../zotnet/tws.h" #include <stdio.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <ctype.h> static struct swit switches[] = { #define DATESW 0 *************** *** 4,11 #include "../zotnet/tws.h" #include <stdio.h> - /* */ - static struct swit switches[] = { #define DATESW 0 "datefield field", 0, --- 28,33 ----- #include <sys/stat.h> #include <ctype.h> static struct swit switches[] = { #define DATESW 0 "datefield field", 0, *************** *** 15,21 #define NVERBSW 2 "noverbose", 0, ! #define HELPSW 3 "help", 4, NULL, NULL --- 37,51 ----- #define NVERBSW 2 "noverbose", 0, ! #define SUBJSW 3 ! "subject", 0, ! ! #define PACKSW 4 ! "pack", 0, ! #define NOPACKSW 5 ! "nopack", 0, ! ! #define HELPSW 6 "help", 4, NULL, NULL *************** *** 21,27 NULL, NULL }; - /* */ struct smsg { int s_msg; --- 51,56 ----- NULL, NULL }; struct smsg { int s_msg; *************** *** 25,31 struct smsg { int s_msg; ! struct tws s_tws; }; static struct smsg *smsgs; --- 54,61 ----- struct smsg { int s_msg; ! unsigned long s_clock; ! char *s_subj; }; static struct smsg *smsgs; *************** *** 29,34 }; static struct smsg *smsgs; int msgsort (); --- 59,65 ----- }; static struct smsg *smsgs; + int nmsgs; int subjsort; /* sort on subject if != 0 */ int verbose; *************** *** 30,35 static struct smsg *smsgs; int msgsort (); --- 61,72 ----- static struct smsg *smsgs; int nmsgs; + int subjsort; /* sort on subject if != 0 */ + int verbose; + int packsw = 1; /* smush folder, eliminating holes */ + int dsort (); + int subsort (); + struct msgs *tfold (); /* for packing folder */ /* ARGSUSED */ main (argc, argv) *************** *** 31,45 static struct smsg *smsgs; - int msgsort (); - - struct tws *getws (); - - - long time (); - - /* */ - /* ARGSUSED */ main (argc, argv) --- 68,73 ----- int subsort (); struct msgs *tfold (); /* for packing folder */ /* ARGSUSED */ main (argc, argv) int argc; *************** *** 41,47 /* */ /* ARGSUSED */ - main (argc, argv) int argc; char **argv; --- 69,74 ----- struct msgs *tfold (); /* for packing folder */ /* ARGSUSED */ main (argc, argv) int argc; char **argv; *************** *** 43,50 /* ARGSUSED */ main (argc, argv) ! int argc; ! char **argv; { int verbosw = 0, msgp = 0, --- 70,77 ----- /* ARGSUSED */ main (argc, argv) ! int argc; ! char **argv; { int msgp = 0; int i; *************** *** 46,64 int argc; char **argv; { ! int verbosw = 0, ! msgp = 0, ! i, ! msgnum; ! char *cp, ! *maildir, ! *datesw = NULL, ! *folder = NULL, ! buf[100], ! **ap, ! **argp, ! *arguments[MAXARGS], ! *msgs[MAXARGS]; struct msgs *mp; invo_name = r1bindex (argv[0], '/'); --- 73,90 ----- int argc; char **argv; { ! int msgp = 0; ! int i; ! int msgnum; ! char *cp; ! char *maildir; ! char *datesw = NULL; ! char *folder = NULL; ! char buf[100]; ! char **ap; ! char **argp; ! char *arguments[MAXARGS]; ! char *msgs[MAXARGS]; struct msgs *mp; struct smsg **dlist; *************** *** 60,65 *arguments[MAXARGS], *msgs[MAXARGS]; struct msgs *mp; invo_name = r1bindex (argv[0], '/'); if ((cp = m_find (invo_name)) != NULL) { --- 86,92 ----- char *arguments[MAXARGS]; char *msgs[MAXARGS]; struct msgs *mp; + struct smsg **dlist; invo_name = r1bindex (argv[0], '/'); if ((cp = m_find (invo_name)) != NULL) { *************** *** 65,72 if ((cp = m_find (invo_name)) != NULL) { ap = brkstring (cp = getcpy (cp), " ", "\n"); ap = copyip (ap, arguments); ! } ! else ap = arguments; (void) copyip (argv + 1, ap); argp = arguments; --- 92,98 ----- if ((cp = m_find (invo_name)) != NULL) { ap = brkstring (cp = getcpy (cp), " ", "\n"); ap = copyip (ap, arguments); ! } else ap = arguments; (void) copyip (argv + 1, ap); argp = arguments; *************** *** 71,78 (void) copyip (argv + 1, ap); argp = arguments; - /* */ - while (cp = *argp++) { if (*cp == '-') switch (smatch (++cp, switches)) { --- 97,102 ----- (void) copyip (argv + 1, ap); argp = arguments; while (cp = *argp++) { if (*cp == '-') switch (smatch (++cp, switches)) { *************** *** 82,88 case UNKWNSW: adios (NULLCP, "-%s unknown", cp); case HELPSW: ! (void) sprintf (buf, "%s [+folder] [msgs] [switches]", invo_name); help (buf, switches); done (1); --- 106,113 ----- case UNKWNSW: adios (NULLCP, "-%s unknown", cp); case HELPSW: ! (void) sprintf(buf, ! "%s [+folder] [msgs] [switches]", invo_name); help (buf, switches); done (1); *************** *** 89,95 case DATESW: if (datesw) ! adios (NULLCP, "only one date field at a time!"); if (!(datesw = *argp++) || *datesw == '-') adios (NULLCP, "missing argument to %s", argp[-2]); continue; --- 114,121 ----- case DATESW: if (datesw) ! adios (NULLCP, ! "only one date field at a time"); if (!(datesw = *argp++) || *datesw == '-') adios (NULLCP, "missing argument to %s", argp[-2]); continue; *************** *** 94,99 adios (NULLCP, "missing argument to %s", argp[-2]); continue; case VERBSW: verbosw++; continue; --- 120,129 ----- adios (NULLCP, "missing argument to %s", argp[-2]); continue; + case SUBJSW: + subjsort = 1; + continue; + case VERBSW: verbose++; continue; *************** *** 95,101 continue; case VERBSW: ! verbosw++; continue; case NVERBSW: verbosw = 0; --- 125,131 ----- continue; case VERBSW: ! verbose++; continue; case NVERBSW: verbose = 0; *************** *** 98,104 verbosw++; continue; case NVERBSW: ! verbosw = 0; continue; } if (*cp == '+' || *cp == '@') { --- 128,134 ----- verbose++; continue; case NVERBSW: ! verbose = 0; continue; case PACKSW: packsw++; *************** *** 100,105 case NVERBSW: verbosw = 0; continue; } if (*cp == '+' || *cp == '@') { if (folder) --- 130,142 ----- case NVERBSW: verbose = 0; continue; + case PACKSW: + packsw++; + continue; + case NOPACKSW: + packsw = 0; + continue; + } if (*cp == '+' || *cp == '@') { if (folder) *************** *** 106,113 adios (NULLCP, "only one folder at a time!"); else folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); ! } ! else msgs[msgp++] = cp; } --- 143,149 ----- adios (NULLCP, "only one folder at a time!"); else folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); ! } else msgs[msgp++] = cp; } *************** *** 111,117 msgs[msgp++] = cp; } - /* */ if (!m_find ("path")) free (path ("./", TFOLDER)); --- 147,152 ----- msgs[msgp++] = cp; } if (msgp && packsw) adios (NULLCP, "use -nopack if you specify selected messages!"); *************** *** 113,118 /* */ if (!m_find ("path")) free (path ("./", TFOLDER)); if (!msgp) --- 148,155 ----- } + if (msgp && packsw) + adios (NULLCP, "use -nopack if you specify selected messages!"); if (!m_find ("path")) free (path ("./", TFOLDER)); if (!msgp) *************** *** 118,124 if (!msgp) msgs[msgp++] = "all"; if (!datesw) ! datesw = "Date"; if (!folder) folder = m_getfolder (); maildir = m_maildir (folder); --- 155,161 ----- if (!msgp) msgs[msgp++] = "all"; if (!datesw) ! datesw = "date"; if (!folder) folder = m_getfolder (); maildir = m_maildir (folder); *************** *** 127,133 adios (maildir, "unable to change directory to"); if (!(mp = m_gmsg (folder))) adios (NULLCP, "unable to read folder %s", folder); ! if (mp -> hghmsg == 0) adios (NULLCP, "no messages in %s", folder); for (msgnum = 0; msgnum < msgp; msgnum++) --- 164,170 ----- adios (maildir, "unable to change directory to"); if (!(mp = m_gmsg (folder))) adios (NULLCP, "unable to read folder %s", folder); ! if (mp->hghmsg == 0) adios (NULLCP, "no messages in %s", folder); for (msgnum = 0; msgnum < msgp; msgnum++) *************** *** 135,141 done (1); m_setseq (mp); ! if ((i = read_dates (mp, datesw)) <= 0) adios (NULLCP, "no messages to sort"); qsort ((char *) smsgs, i, sizeof *smsgs, msgsort); file_dates (mp, verbosw); --- 172,178 ----- done (1); m_setseq (mp); ! if ((nmsgs = read_hdrs (mp, datesw)) <= 0) adios (NULLCP, "no messages to sort"); /* *************** *** 137,144 if ((i = read_dates (mp, datesw)) <= 0) adios (NULLCP, "no messages to sort"); - qsort ((char *) smsgs, i, sizeof *smsgs, msgsort); - file_dates (mp, verbosw); m_replace (pfolder, folder); m_sync (mp); --- 174,179 ----- if ((nmsgs = read_hdrs (mp, datesw)) <= 0) adios (NULLCP, "no messages to sort"); /* * sort a list of pointers to our "messages to be sorted". *************** *** 140,145 qsort ((char *) smsgs, i, sizeof *smsgs, msgsort); file_dates (mp, verbosw); m_replace (pfolder, folder); m_sync (mp); m_update (); --- 175,202 ----- if ((nmsgs = read_hdrs (mp, datesw)) <= 0) adios (NULLCP, "no messages to sort"); + /* + * sort a list of pointers to our "messages to be sorted". + */ + dlist = (struct smsg **) malloc ((nmsgs+1) * sizeof(*dlist)); + if (! dlist) + adios (NULLCP, "couldn't allocate sort memory"); + for (i = 0; i < nmsgs; i++) + dlist[i] = &smsgs[i]; + dlist[nmsgs] = 0; + + if (!subjsort) + qsort ((char *) dlist, nmsgs, sizeof(*dlist), dsort); + + if (subjsort) { + qsort ((char *)dlist, nmsgs, sizeof(*dlist), subsort); + + } + rename_msgs (mp, dlist); + + if (packsw) + mp = tfold(mp); /* Stolen from folder.c */ + m_replace (pfolder, folder); m_sync (mp); m_update (); *************** *** 147,153 done (0); } - /* */ static int read_dates (mp, datesw) register struct msgs *mp; --- 204,209 ----- done (0); } static int read_hdrs (mp, datesw) *************** *** 149,157 /* */ ! static int read_dates (mp, datesw) ! register struct msgs *mp; ! register char *datesw; { int msgnum; struct tws tb; --- 205,214 ----- } ! static int ! read_hdrs (mp, datesw) ! register struct msgs *mp; ! register char *datesw; { int msgnum; struct tws tb; *************** *** 156,162 int msgnum; struct tws tb; register struct smsg *s; - register struct tws *tw; twscopy (&tb, dtwstime ()); --- 213,218 ----- int msgnum; struct tws tb; register struct smsg *s; twscopy (&tb, dtwstime ()); *************** *** 161,167 twscopy (&tb, dtwstime ()); smsgs = (struct smsg *) ! calloc ((unsigned) (mp -> hghsel - mp -> lowsel + 2), sizeof *smsgs); if (smsgs == NULL) adios (NULLCP, "unable to allocate sort storage"); --- 217,223 ----- twscopy (&tb, dtwstime ()); smsgs = (struct smsg *) ! calloc ((unsigned) (mp->hghsel - mp->lowsel + 2), sizeof *smsgs); if (smsgs == NULL) adios (NULLCP, "unable to allocate sort storage"); *************** *** 167,185 adios (NULLCP, "unable to allocate sort storage"); s = smsgs; ! for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++) { ! tw = NULL; ! if (mp -> msgstats[msgnum] & SELECTED) { ! if ((tw = getws (datesw, msgnum)) == NULL) ! tw = msgnum != mp -> lowsel ? &((s - 1) -> s_tws) : &tb; ! } ! else ! if (mp -> msgstats[msgnum] & EXISTS) ! tw = &tb; ! ! if (tw) { ! s -> s_msg = msgnum; ! twscopy (&s -> s_tws, tw); s++; } } --- 223,232 ----- adios (NULLCP, "unable to allocate sort storage"); s = smsgs; ! for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { ! if (mp->msgstats[msgnum] & SELECTED) { ! if (getws (datesw, msgnum, s)) { ! s->s_msg = msgnum; s++; } } *************** *** 183,188 s++; } } s -> s_msg = 0; return (s - smsgs); --- 230,238 ----- s++; } } + } + s->s_msg = 0; + nmsgs = s - smsgs; return nmsgs; } *************** *** 184,191 } } ! s -> s_msg = 0; ! return (s - smsgs); } /* */ --- 234,240 ----- s->s_msg = 0; nmsgs = s - smsgs; ! return nmsgs; } *************** *** 188,194 return (s - smsgs); } - /* */ static struct tws *getws (datesw, msg) register char *datesw; --- 237,242 ----- return nmsgs; } static getws (datesw, msg, smsg) *************** *** 190,198 /* */ ! static struct tws *getws (datesw, msg) ! register char *datesw; ! int msg; { int compnum, state; --- 238,248 ----- } ! static ! getws (datesw, msg, smsg) ! register char *datesw; ! int msg; ! register struct smsg *smsg; { int compnum; register int state; *************** *** 194,205 register char *datesw; int msg; { ! int compnum, ! state; ! register char *hp, ! *msgnam; ! char buf[BUFSIZ], ! nam[NAMESZ]; register struct tws *tw; register FILE *in; --- 244,253 ----- int msg; register struct smsg *smsg; { ! int compnum; ! register int state; ! char *msgnam; ! char buf[BUFSIZ], nam[NAMESZ]; register struct tws *tw; register char *datecomp = NULLCP; register char *subjcomp = NULLCP; *************** *** 201,206 char buf[BUFSIZ], nam[NAMESZ]; register struct tws *tw; register FILE *in; if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) { --- 249,256 ----- char *msgnam; char buf[BUFSIZ], nam[NAMESZ]; register struct tws *tw; + register char *datecomp = NULLCP; + register char *subjcomp = NULLCP; register FILE *in; if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) { *************** *** 205,211 if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) { admonish (msgnam, "unable to read message"); ! return NULL; } /* */ --- 255,261 ----- if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) { admonish (msgnam, "unable to read message"); ! return (0); } for (compnum = 1, state = FLD;;) { switch (state = m_getfld (state, nam, buf, sizeof buf, in)) { *************** *** 207,216 admonish (msgnam, "unable to read message"); return NULL; } ! ! /* */ ! ! for (compnum = 1, state = FLD, hp = NULL;;) { switch (state = m_getfld (state, nam, buf, sizeof buf, in)) { case FLD: case FLDEOF: --- 257,263 ----- admonish (msgnam, "unable to read message"); return (0); } ! for (compnum = 1, state = FLD;;) { switch (state = m_getfld (state, nam, buf, sizeof buf, in)) { case FLD: case FLDEOF: *************** *** 216,224 case FLDEOF: case FLDPLUS: compnum++; ! if (hp != NULL) ! free (hp), hp = NULL; ! hp = add (buf, NULLCP); while (state == FLDPLUS) { state = m_getfld (state, nam, buf, sizeof buf, in); hp = add (buf, hp); --- 263,270 ----- case FLDEOF: case FLDPLUS: compnum++; ! if (uleq (nam, datesw)) { ! datecomp = add (buf, datecomp); while (state == FLDPLUS) { state = m_getfld (state, nam, buf, sizeof buf, in); datecomp = add (buf, datecomp); *************** *** 221,227 hp = add (buf, NULLCP); while (state == FLDPLUS) { state = m_getfld (state, nam, buf, sizeof buf, in); ! hp = add (buf, hp); } if (uleq (nam, datesw)) break; --- 267,273 ----- datecomp = add (buf, datecomp); while (state == FLDPLUS) { state = m_getfld (state, nam, buf, sizeof buf, in); ! datecomp = add (buf, datecomp); } if (!subjsort || subjcomp) break; *************** *** 223,229 state = m_getfld (state, nam, buf, sizeof buf, in); hp = add (buf, hp); } ! if (uleq (nam, datesw)) break; if (state != FLDEOF) continue; --- 269,275 ----- state = m_getfld (state, nam, buf, sizeof buf, in); datecomp = add (buf, datecomp); } ! if (!subjsort || subjcomp) break; } else if (subjsort && uleq (nam, "subject")) { subjcomp = add (buf, subjcomp); *************** *** 225,231 } if (uleq (nam, datesw)) break; ! if (state != FLDEOF) continue; case BODY: --- 271,289 ----- } if (!subjsort || subjcomp) break; ! } else if (subjsort && uleq (nam, "subject")) { ! subjcomp = add (buf, subjcomp); ! while (state == FLDPLUS) { ! state = m_getfld (state, nam, buf, sizeof buf, in); ! subjcomp = add (buf, subjcomp); ! } ! if (datecomp) ! break; ! } else { ! /* just flush this guy */ ! while (state == FLDPLUS) ! state = m_getfld (state, nam, buf, sizeof buf, in); ! } continue; case BODY: *************** *** 231,237 case BODY: case BODYEOF: case FILEEOF: ! admonish (NULLCP, "no %s field in message %d", datesw, msg); case LENERR: case FMTERR: --- 289,295 ----- case BODY: case BODYEOF: case FILEEOF: ! break; case LENERR: case FMTERR: *************** *** 237,243 case FMTERR: if (state == LENERR || state == FMTERR) admonish (NULLCP, ! "format error in message %d(header #%d)", msg, compnum); if (hp != NULL) free (hp); --- 295,301 ----- case FMTERR: if (state == LENERR || state == FMTERR) admonish (NULLCP, ! "format error in message %d (header #%d)", msg, compnum); if (datecomp) free (datecomp); *************** *** 239,246 admonish (NULLCP, "format error in message %d(header #%d)", msg, compnum); ! if (hp != NULL) ! free (hp); (void) fclose (in); return NULL; --- 297,306 ----- admonish (NULLCP, "format error in message %d (header #%d)", msg, compnum); ! if (datecomp) ! free (datecomp); ! if (subjcomp) ! free (subjcomp); (void) fclose (in); return (0); *************** *** 242,248 if (hp != NULL) free (hp); (void) fclose (in); ! return NULL; default: adios (NULLCP, "internal error -- you lose"); --- 302,308 ----- if (subjcomp) free (subjcomp); (void) fclose (in); ! return (0); default: adios (NULLCP, "internal error -- you lose"); *************** *** 250,257 break; } ! if ((tw = dparsetime (hp)) == NULL) ! admonish (NULLCP, "unable to parse %s field in message %d", datesw, msg); if (hp != NULL) --- 310,319 ----- break; } ! if (!datecomp || (tw = dparsetime (datecomp)) == NULL) { ! struct stat st; ! ! admonish (NULLCP, "can't parse %s field in message %d", datesw, msg); /* use the modify time of the file as its date */ *************** *** 254,261 admonish (NULLCP, "unable to parse %s field in message %d", datesw, msg); ! if (hp != NULL) ! free (hp); (void) fclose (in); return tw; } --- 316,355 ----- admonish (NULLCP, "can't parse %s field in message %d", datesw, msg); ! /* use the modify time of the file as its date */ ! (void) fstat (fileno (in), &st); ! smsg->s_clock = st.st_mtime; ! } else { ! smsg->s_clock = twclock (tw); ! } ! ! if (subjsort) { ! register char *cp; ! register char *cp2; ! register char c; ! ! if (!subjcomp) ! subjcomp = ""; ! ! /* ! * try to make the subject "canonical": delete leading "re:", ! * punctuation, white space & smash everything to lower case. ! */ ! cp = subjcomp; ! cp2 = subjcomp; ! while (c = *cp++) ! if (isupper (c)) ! *cp2++ = tolower (c); ! else if (isalnum (c) || c == ':') ! *cp2++ = c; ! ! *cp2 = '\0'; ! while (subjcomp[0] == 'r' && subjcomp[1] == 'e' ! && subjcomp[2] == ':') ! subjcomp += 3; ! ! smsg->s_subj = subjcomp; ! } (void) fclose (in); if (datecomp) free (datecomp); *************** *** 257,263 if (hp != NULL) free (hp); (void) fclose (in); ! return tw; } /* */ --- 351,360 ----- smsg->s_subj = subjcomp; } (void) fclose (in); ! if (datecomp) ! free (datecomp); ! ! return (1); } /* *************** *** 260,266 return tw; } ! /* */ static int msgsort (a, b) register struct smsg *a, --- 357,378 ----- return (1); } ! /* ! * sort on dates. ! */ ! static int ! dsort (a, b) ! register struct smsg **a, **b; ! { ! if ((*a)->s_clock < (*b)->s_clock) ! return (-1); ! else if ((*a)->s_clock > (*b)->s_clock) ! return (1); ! else if ((*a)->s_msg < (*b)->s_msg) ! return (-1); ! else ! return (1); ! } /* *************** *** 262,270 /* */ ! static int msgsort (a, b) ! register struct smsg *a, ! *b; { return twsort (&a -> s_tws, &b -> s_tws); } --- 374,386 ----- return (1); } ! ! /* ! * sort on subjects. ! */ ! static int ! subsort (a, b) ! register struct smsg **a, **b; { register int i; if (i = strcmp ((*a)->s_subj, (*b)->s_subj)) *************** *** 266,272 register struct smsg *a, *b; { ! return twsort (&a -> s_tws, &b -> s_tws); } /* */ --- 382,396 ----- subsort (a, b) register struct smsg **a, **b; { ! register int i; ! if (i = strcmp ((*a)->s_subj, (*b)->s_subj)) ! return (i); ! ! if ((*a)->s_clock < (*b)->s_clock) ! return (-1); ! else if ((*a)->s_clock > (*b)->s_clock) ! return (1); ! else return (0); } *************** *** 269,275 return twsort (&a -> s_tws, &b -> s_tws); } - /* */ static file_dates (mp, verbosw) register struct msgs *mp; --- 393,398 ----- else return (0); } static rename_msgs (mp, mlist) *************** *** 271,279 /* */ ! static file_dates (mp, verbosw) ! register struct msgs *mp; ! int verbosw; { register int i, j, --- 394,403 ----- } ! static ! rename_msgs (mp, mlist) ! register struct msgs *mp; ! register struct smsg **mlist; { register int i, j, old, new; register struct smsg *sp; *************** *** 275,283 register struct msgs *mp; int verbosw; { ! register int i, ! j, ! k; short stats; char f1[BUFSIZ], f2[BUFSIZ], --- 399,406 ----- register struct msgs *mp; register struct smsg **mlist; { ! register int i, j, old, new; ! register struct smsg *sp; short stats; char f1[BUFSIZ], f2[BUFSIZ], tmpfil[BUFSIZ]; *************** *** 279,287 j, k; short stats; ! char f1[BUFSIZ], ! f2[BUFSIZ], ! tmpfil[BUFSIZ]; (void) strcpy (tmpfil, m_scratch ("", invo_name)); --- 402,408 ----- register int i, j, old, new; register struct smsg *sp; short stats; ! char f1[BUFSIZ], f2[BUFSIZ], tmpfil[BUFSIZ]; (void) strcpy (tmpfil, m_scratch ("", invo_name)); *************** *** 285,297 (void) strcpy (tmpfil, m_scratch ("", invo_name)); ! for (i = 0; j = smsgs[i++].s_msg;) ! if (i != j) { ! (void) strcpy (f1, m_name (i)); ! (void) strcpy (f2, m_name (j)); ! if (mp -> msgstats[i] & EXISTS) { ! if (verbosw) ! printf ("swap messages %s and %s\n", f2, f1); if (rename (f1, tmpfil) == NOTOK) { admonish (tmpfil, "unable to rename %s to ", f1); --- 406,414 ----- (void) strcpy (tmpfil, m_scratch ("", invo_name)); ! for (i = 0; i < nmsgs; i++) { ! if (! (sp = mlist[i])) ! continue; /* did this one */ j = sp - smsgs; if (j == i) *************** *** 293,302 if (verbosw) printf ("swap messages %s and %s\n", f2, f1); ! if (rename (f1, tmpfil) == NOTOK) { ! admonish (tmpfil, "unable to rename %s to ", f1); ! continue; ! } if (rename (f2, f1) == NOTOK) { admonish (f1, "unable to rename %s to", f2); --- 410,418 ----- if (! (sp = mlist[i])) continue; /* did this one */ ! j = sp - smsgs; ! if (j == i) ! continue; /* this one doesn't move */ /* * the guy that was msg j is about to become msg i. *************** *** 298,307 continue; } ! if (rename (f2, f1) == NOTOK) { ! admonish (f1, "unable to rename %s to", f2); ! continue; ! } if (rename (tmpfil, f2) == NOTOK) { admonish (f2, "unable to rename %s to", tmpfil); --- 414,427 ----- if (j == i) continue; /* this one doesn't move */ ! /* ! * the guy that was msg j is about to become msg i. ! * rename 'j' to make a hole, then recursively rename ! * guys to fill up the hole. ! */ ! old = smsgs[j].s_msg; ! new = smsgs[i].s_msg; ! (void) strcpy (f1, m_name (old)); if (verbose) printf ("renaming chain from %d to %d\n", old, new); *************** *** 303,312 continue; } ! if (rename (tmpfil, f2) == NOTOK) { ! admonish (f2, "unable to rename %s to", tmpfil); ! continue; ! } for (k = i; smsgs[k].s_msg; k++) if (smsgs[k].s_msg == i) { --- 423,430 ----- new = smsgs[i].s_msg; (void) strcpy (f1, m_name (old)); ! if (verbose) ! printf ("renaming chain from %d to %d\n", old, new); if (rename (f1, tmpfil) == NOTOK) adios (tmpfil, "unable to rename %s to ", f1); *************** *** 308,322 continue; } ! for (k = i; smsgs[k].s_msg; k++) ! if (smsgs[k].s_msg == i) { ! smsgs[k].s_msg = j; ! break; ! } ! } ! else { ! if (verbosw) ! printf ("message %s becomes message %s\n", f2, f1); if (rename (f2, f1) == NOTOK) { admonish (f1, "unable to rename %s to ", f2); --- 426,434 ----- if (verbose) printf ("renaming chain from %d to %d\n", old, new); ! if (rename (f1, tmpfil) == NOTOK) ! adios (tmpfil, "unable to rename %s to ", f1); ! stats = mp->msgstats[old]; rename_chain (mp, mlist, j, i); if (rename (tmpfil, m_name(new)) == NOTOK) *************** *** 318,326 if (verbosw) printf ("message %s becomes message %s\n", f2, f1); ! if (rename (f2, f1) == NOTOK) { ! admonish (f1, "unable to rename %s to ", f2); ! continue; } } --- 430,441 ----- adios (tmpfil, "unable to rename %s to ", f1); stats = mp->msgstats[old]; ! rename_chain (mp, mlist, j, i); ! if (rename (tmpfil, m_name(new)) == NOTOK) ! adios (m_name(new), "unable to rename %s to", tmpfil); ! ! mp->msgstats[new] = stats; ! mp->msgflags |= SEQMOD; } } *************** *** 322,328 admonish (f1, "unable to rename %s to ", f2); continue; } ! } smsgs[i - 1].s_msg = i; stats = mp -> msgstats[i]; --- 437,443 ----- mp->msgstats[new] = stats; mp->msgflags |= SEQMOD; } ! } rename_chain (mp, mlist, msg, endmsg) register struct msgs *mp; *************** *** 324,335 } } ! smsgs[i - 1].s_msg = i; ! stats = mp -> msgstats[i]; ! mp -> msgstats[i] = mp -> msgstats[j]; ! mp -> msgstats[j] = stats; ! if (mp -> curmsg == j) ! m_setcur (mp, i); mp -> msgflags |= SEQMOD; } } --- 439,501 ----- } } ! rename_chain (mp, mlist, msg, endmsg) ! register struct msgs *mp; ! struct smsg **mlist; ! int msg, endmsg; ! { ! int nxt, old, new; ! char *newname; ! char oldname[BUFSIZ]; ! ! nxt = mlist[msg] - smsgs; ! mlist[msg] = 0; ! old = smsgs[nxt].s_msg; ! new = smsgs[msg].s_msg; ! (void) strcpy (oldname, m_name (old)); ! newname = m_name (new); ! if (verbose) ! printf (" %s becomes %s\n", oldname, newname); ! ! if (rename (oldname, newname) == NOTOK) ! adios (newname, "unable to rename %s to", oldname); ! ! mp->msgstats[new] = mp->msgstats[old]; ! if (mp->curmsg == old) ! m_setcur (mp, new); ! ! if (nxt != endmsg) ! rename_chain (mp, mlist, nxt, endmsg); ! } ! ! /* This folder packing routine was shamelessly lifted from folder.c so sortm ! wouldn't change behavior from the "old" way. ! */ ! ! struct msgs *tfold (mp) ! register struct msgs *mp; ! { ! register int hole, ! msgnum; ! char newmsg[BUFSIZ], ! oldmsg[BUFSIZ]; ! ! if (mp -> lowmsg > 1 && (mp = m_remsg (mp, 1, mp -> hghmsg)) == NULL) ! adios (NULLCP, "unable to allocate folder storage"); ! ! if (verbose) ! printf ("....packing folder\n"); ! ! for (msgnum = mp -> lowmsg, hole = 1; msgnum <= mp -> hghmsg; msgnum++) ! if (mp -> msgstats[msgnum] & EXISTS) { ! if (msgnum != hole) { ! (void) strcpy (newmsg, m_name (hole)); ! (void) strcpy (oldmsg, m_name (msgnum)); ! if (rename (oldmsg, newmsg) == NOTOK) ! adios (newmsg, "unable to rename %s to", oldmsg); ! if (msgnum == mp -> curmsg) ! m_setcur (mp, mp -> curmsg = hole); ! mp -> msgstats[hole] = mp -> msgstats[msgnum]; mp -> msgflags |= SEQMOD; if (msgnum == mp -> lowsel) mp -> lowsel = hole; *************** *** 331,335 if (mp -> curmsg == j) m_setcur (mp, i); mp -> msgflags |= SEQMOD; } } --- 497,506 ----- m_setcur (mp, mp -> curmsg = hole); mp -> msgstats[hole] = mp -> msgstats[msgnum]; mp -> msgflags |= SEQMOD; + if (msgnum == mp -> lowsel) + mp -> lowsel = hole; + if (msgnum == mp -> hghsel) + mp -> hghsel = hole; } hole++; } *************** *** 332,335 m_setcur (mp, i); mp -> msgflags |= SEQMOD; } } --- 502,514 ----- if (msgnum == mp -> hghsel) mp -> hghsel = hole; } + hole++; + } + if (mp -> nummsg > 0) { + mp -> lowmsg = 1; + mp -> hghmsg = hole - 1; + } + + return mp; } *************** *** 333,335 mp -> msgflags |= SEQMOD; } } --- 511,514 ----- return mp; } +