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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
/* folder_pack.c -- pack (renumber) the messages in a folder
* -- into a contiguous range from 1 to n.
*
* 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 "m_name.h"
#include "seq_setcur.h"
#include "ext_hook.h"
#include "folder_realloc.h"
#include "folder_pack.h"
#include "error.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))) {
inform("unable to allocate folder storage");
return -1;
}
*mpp = mp;
}
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) - 1);
strncpy (oldmsg, m_name (msgnum), sizeof(oldmsg) - 1);
if (verbose)
printf ("message %s becomes %s\n", oldmsg, newmsg);
/*
* Invoke the external refile hook for each message being renamed.
* This is done before the file is renamed so that the old message
* file is around for the hook.
*/
(void)snprintf(oldmsg, sizeof (oldmsg), "%s/%d", mp->foldpath, msgnum);
(void)snprintf(newmsg, sizeof (newmsg), "%s/%d", mp->foldpath, hole);
ext_hook("ref-hook", 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;
}
|