X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/6c42153ad9362cc676ea66563bf400d7511b3b68..a596b2e5a67b5a250c571d4544c7726554c1ed44:/sbr/folder_realloc.c diff --git a/sbr/folder_realloc.c b/sbr/folder_realloc.c index f3d99ba7..8ed95e2e 100644 --- a/sbr/folder_realloc.c +++ b/sbr/folder_realloc.c @@ -1,8 +1,4 @@ - -/* - * folder_realloc.c -- realloc a folder/msgs structure - * - * $Id$ +/* folder_realloc.c -- realloc a folder/msgs structure * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -10,6 +6,7 @@ */ #include +#include /* * Reallocate some of the space in the folder @@ -22,6 +19,8 @@ struct msgs * folder_realloc (struct msgs *mp, int lo, int hi) { + struct bvector *tmpstats, *t; + size_t i; int msgnum; /* sanity checks */ @@ -40,55 +39,22 @@ folder_realloc (struct msgs *mp, int lo, int hi) if (lo == mp->lowoff && hi == mp->hghoff) return mp; - if (lo == mp->lowoff) { - /* - * We are just extending (or shrinking) the end of message - * status array. So we don't have to move anything and can - * just realloc the message status array. - */ - if (!(mp->msgstats = realloc (mp->msgstats, MSGSTATSIZE(mp, lo, hi)))) { - advise (NULL, "unable to reallocate message storage"); - return NULL; - } - } else { - /* - * We are changing the offset of the message status - * array. So we will need to shift everything. - */ - seqset_t *tmpstats; - - /* first allocate the new message status space */ - if (!(tmpstats = malloc (MSGSTATSIZE(mp, lo, hi)))) { - advise (NULL, "unable to reallocate message storage"); - return NULL; - } - - /* then copy messages status array with shift */ - if (mp->nummsg > 0) { - for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) - tmpstats[msgnum - lo] = mp->msgstats[msgnum - mp->lowoff]; - } - free(mp->msgstats); - mp->msgstats = tmpstats; + /* first allocate the new message status space */ + mp->num_msgstats = MSGSTATNUM (lo, hi); + tmpstats = mh_xmalloc (MSGSTATSIZE(mp)); + for (i = 0, t = tmpstats; i < mp->num_msgstats; ++i, ++t) { + bvector_init(t); } - mp->lowoff = lo; - mp->hghoff = hi; - - /* - * Clear all the flags for entries outside - * the current message range for this folder. - */ + /* then copy messages status array with shift */ if (mp->nummsg > 0) { - for (msgnum = mp->lowoff; msgnum < mp->lowmsg; msgnum++) - clear_msg_flags (mp, msgnum); - for (msgnum = mp->hghmsg + 1; msgnum <= mp->hghoff; msgnum++) - clear_msg_flags (mp, msgnum); - } else { - /* no messages, so clear entire range */ - for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++) - clear_msg_flags (mp, msgnum); + for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) + bvector_copy (tmpstats + msgnum - lo, msgstat (mp, msgnum)); } + free(mp->msgstats); + mp->msgstats = tmpstats; + mp->lowoff = lo; + mp->hghoff = hi; return mp; }