]>
diplodocus.org Git - nmh/blob - sbr/folder_pack.c
1 /* folder_pack.c -- pack (renumber) the messages in a folder
2 * -- into a contiguous range from 1 to n.
4 * This code is Copyright (c) 2002, by the authors of nmh. See the
5 * COPYRIGHT file in the root directory of the nmh distribution for
6 * complete copyright information.
11 #include "seq_setcur.h"
13 #include "folder_realloc.h"
14 #include "folder_pack.h"
18 * Pack the message in a folder.
19 * Return -1 if error, else return 0.
23 folder_pack (struct msgs
**mpp
, int verbose
)
25 int hole
, msgnum
, newcurrent
= 0;
26 char newmsg
[BUFSIZ
], oldmsg
[BUFSIZ
];
32 * Just return if folder is empty.
38 * Make sure we have message status space allocated
39 * for all numbers from 1 to current high message.
42 if (!(mp
= folder_realloc(mp
, 1, mp
->hghmsg
))) {
43 inform("unable to allocate folder storage");
49 for (msgnum
= mp
->lowmsg
, hole
= 1; msgnum
<= mp
->hghmsg
; msgnum
++) {
50 if (does_exist (mp
, msgnum
)) {
52 strncpy (newmsg
, m_name (hole
), sizeof(newmsg
));
53 strncpy (oldmsg
, m_name (msgnum
), sizeof(oldmsg
));
55 printf ("message %s becomes %s\n", oldmsg
, newmsg
);
58 * Invoke the external refile hook for each message being renamed.
59 * This is done before the file is renamed so that the old message
60 * file is around for the hook.
63 (void)snprintf(oldmsg
, sizeof (oldmsg
), "%s/%d", mp
->foldpath
, msgnum
);
64 (void)snprintf(newmsg
, sizeof (newmsg
), "%s/%d", mp
->foldpath
, hole
);
65 ext_hook("ref-hook", oldmsg
, newmsg
);
67 /* move the message file */
68 if (rename (oldmsg
, newmsg
) == -1) {
69 advise (newmsg
, "unable to rename %s to", oldmsg
);
73 /* check if this is the current message */
74 if (msgnum
== mp
->curmsg
)
77 /* copy the attribute flags for this message */
78 copy_msg_flags (mp
, hole
, msgnum
);
80 if (msgnum
== mp
->lowsel
)
82 if (msgnum
== mp
->hghsel
)
85 /* mark that sequence information has been modified */
86 mp
->msgflags
|= SEQMOD
;
92 /* record the new number for the high/low message */
94 mp
->hghmsg
= hole
- 1;
96 /* update the "cur" sequence */
98 seq_setcur (mp
, newcurrent
);