File: folder_pack.c

package info (click to toggle)
nmh 1.8-4
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 7,860 kB
  • sloc: ansic: 50,445; sh: 22,697; makefile: 1,138; lex: 740; perl: 509; yacc: 265
file content (101 lines) | stat: -rw-r--r-- 2,547 bytes parent folder | download | duplicates (3)
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;
}