X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Ffolder_realloc.c;h=52c3647dfda7b891455c2e62b106af79eb96750a;hp=753da2ec0b8867de2154c8fbf3509aaae93218d3;hb=a4ff68e851c0931ced437f73a1acb0fedb28bec3;hpb=81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2 diff --git a/sbr/folder_realloc.c b/sbr/folder_realloc.c index 753da2e..52c3647 100644 --- a/sbr/folder_realloc.c +++ b/sbr/folder_realloc.c @@ -1,92 +1,79 @@ - /* - * folder_realloc.c -- realloc a folder/msgs structure - * - * $Id$ - * - * 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. - */ +** 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 +** complete copyright information. +*/ +#include #include #include /* - * Reallocate some of the space in the folder - * structure (currently just message status array). - * - * Return pointer to new folder structure. - * If error, return NULL. - */ +** Reallocate some of the space in the folder +** structure (currently just message status array). +** +** Return pointer to new folder structure. +** If error, return NULL. +*/ struct msgs * -folder_realloc (struct msgs *mp, int lo, int hi) +folder_realloc(struct msgs *mp, int lo, int hi) { - int msgnum; + int msgnum; - /* sanity checks */ - if (lo < 1) - adios (NULL, "BUG: called folder_realloc with lo (%d) < 1", lo); - if (hi < 1) - adios (NULL, "BUG: called folder_realloc with hi (%d) < 1", hi); - if (mp->nummsg > 0 && lo > mp->lowmsg) - adios (NULL, "BUG: called folder_realloc with lo (%d) > mp->lowmsg (%d)", - lo, mp->lowmsg); - if (mp->nummsg > 0 && hi < mp->hghmsg) - adios (NULL, "BUG: called folder_realloc with hi (%d) < mp->hghmsg (%d)", - hi, mp->hghmsg); + /* sanity checks */ + if (lo < 1) + adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with lo (%d) < 1", lo); + if (hi < 1) + adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with hi (%d) < 1", hi); + if (mp->nummsg > 0 && lo > mp->lowmsg) + adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with lo (%d) > mp->lowmsg (%d)", + lo, mp->lowmsg); + if (mp->nummsg > 0 && hi < mp->hghmsg) + adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with hi (%d) < mp->hghmsg (%d)", + hi, mp->hghmsg); - /* Check if we really need to reallocate anything */ - if (lo == mp->lowoff && hi == mp->hghoff) - return mp; + /* Check if we really need to reallocate anything */ + 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; + 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. + */ + mp->msgstats = mh_xrealloc(mp->msgstats, MSGSTATSIZE(mp, lo, hi)); + /* + ** Clear the newly allocated msg flag space. The lowoff and + ** hghoff are the old messagenumber range. So the calculation + ** of the first new element has to subtract lowoff. + */ + memset(mp->msgstats + mp->hghoff - lo + 1, 0, hi - mp->hghoff); + } 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 */ - tmpstats = mh_xmalloc (MSGSTATSIZE(mp, lo, hi)); + /* first allocate the new message status space */ + tmpstats = mh_xcalloc(MSGSTATSIZE(mp, lo, hi), 1); - /* 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]; + /* 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]; + } + } + mh_free0(&(mp->msgstats)); + mp->msgstats = tmpstats; } - free(mp->msgstats); - mp->msgstats = tmpstats; - } - mp->lowoff = lo; - mp->hghoff = hi; + mp->lowoff = lo; + mp->hghoff = hi; - /* - * Clear all the flags for entries outside - * the current message range for this folder. - */ - 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); - } - - return mp; + return mp; }