1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
/*
* folder_pack.c -- pack (renumber) the messages in a folder
* -- into a contiguous range from 1 to n.
*
* $Id: folder_pack.c,v 1.1.1.1 1999/04/30 18:08:34 doug Exp $
*/
#include <h/mh.h>
/*
* Pack the message in a folder.
* Return -1 if error, else return 0.
*/
int
folder_pack (struct msgs **mpp, int verbose)
{
int hole, msgnum, newcurrent = 0;
char newmsg[BUFSIZ], oldmsg[BUFSIZ];
struct msgs *mp;
mp = *mpp;
/*
* Just return if folder is empty.
*/
if (mp->nummsg == 0)
return 0;
/*
* Make sure we have message status space allocated
* for all numbers from 1 to current high message.
*/
if (mp->lowoff > 1) {
if ((mp = folder_realloc (mp, 1, mp->hghmsg)))
*mpp = mp;
else {
advise (NULL, "unable to allocate folder storage");
return -1;
}
}
for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) {
if (does_exist (mp, msgnum)) {
if (msgnum != hole) {
strncpy (newmsg, m_name (hole), sizeof(newmsg));
strncpy (oldmsg, m_name (msgnum), sizeof(oldmsg));
if (verbose)
printf ("message %s becomes %s\n", oldmsg, newmsg);
/* move the message file */
if (rename (oldmsg, newmsg) == -1) {
advise (newmsg, "unable to rename %s to", oldmsg);
return -1;
}
/* check if this is the current message */
if (msgnum == mp->curmsg)
newcurrent = hole;
/* copy the attribute flags for this message */
copy_msg_flags (mp, hole, msgnum);
if (msgnum == mp->lowsel)
mp->lowsel = hole;
if (msgnum == mp->hghsel)
mp->hghsel = hole;
/* mark that sequence information has been modified */
mp->msgflags |= SEQMOD;
}
hole++;
}
}
/* record the new number for the high/low message */
mp->lowmsg = 1;
mp->hghmsg = hole - 1;
/* update the "cur" sequence */
if (newcurrent != 0)
seq_setcur (mp, newcurrent);
return 0;
}
|