]> diplodocus.org Git - nmh/blobdiff - sbr/folder_realloc.c
pending-release-notes: add mhshow's "-prefer", and mh-format's %(kibi/kilo)
[nmh] / sbr / folder_realloc.c
index 6a94a0077c1cde2402549dc1332a31d6385ff96a..0d1f4979c51a6173066d9df15cf2a961cbad8b35 100644 (file)
@@ -40,26 +40,47 @@ folder_realloc (struct msgs *mp, int lo, int hi)
        return mp;
 
     if (lo == mp->lowoff) {
        return mp;
 
     if (lo == mp->lowoff) {
+       bvector_t *v;
+       size_t old_size = mp->num_msgstats;
+       size_t new_size = hi - lo + 1;
+       size_t i;
+
        /*
         * 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.
         */
        /*
         * 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));
+
+       for (i = old_size, v = &mp->msgstats[old_size-1]; i > new_size;
+            --i, --v) {
+           bvector_free (*v);
+       }
+       mp->num_msgstats = MSGSTATNUM (lo, hi);
+       mp->msgstats =
+           mh_xrealloc (mp->msgstats, MSGSTATSIZE(mp));
+       for (i = old_size, v = &mp->msgstats[old_size]; i < new_size;
+            ++i, ++v) {
+           *v = bvector_create (0);
+       }
     } else {
        /*
         * We are changing the offset of the message status
         * array.  So we will need to shift everything.
         */
     } else {
        /*
         * We are changing the offset of the message status
         * array.  So we will need to shift everything.
         */
-       seqset_t *tmpstats;
+       bvector_t *tmpstats, *t;
+       size_t i;
 
        /* first allocate the new message status space */
 
        /* first allocate the new message status space */
-       tmpstats = mh_xmalloc (MSGSTATSIZE(mp, lo, hi));
+       mp->num_msgstats = MSGSTATNUM (lo, hi);
+       tmpstats = mh_xmalloc (MSGSTATSIZE(mp));
+       for (i = 0, t = tmpstats; i < mp->num_msgstats; ++i, ++t) {
+           *t = bvector_create (0);
+       }
 
        /* then copy messages status array with shift */
        if (mp->nummsg > 0) {
            for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++)
 
        /* 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];
+               bvector_copy (tmpstats[msgnum - lo], msgstat (mp, msgnum));
        }
        free(mp->msgstats);
        mp->msgstats = tmpstats;
        }
        free(mp->msgstats);
        mp->msgstats = tmpstats;