]> diplodocus.org Git - nmh/blobdiff - sbr/vector.c
Restored local variable to m_Eom(), to not truncate EOF.
[nmh] / sbr / vector.c
index e37606519826edff0a40f556d2c36935e74748bd..6afe62aa29e2aecc1ad446c59ed175b81201476a 100644 (file)
 /* The number of elements bits needs to cover bit n, measured in bytes. */
 #define BVEC_BYTES(n) (((n) / BVEC_BITS_BITS + 1) * BVEC_SIZEOF_BITS)
 
-struct bvector {
-    unsigned long *bits;
-    size_t maxsize;
-    unsigned long tiny[2];   /* Default fixed-size storage for bits. */
-};
-
 /* bvector_resize ensures the storage used for bits can cover bit
  * newsize.  It always increases the size of the storage used for bits,
  * even if newsize would have been covered by the existing storage.
@@ -67,31 +61,44 @@ bvector_create (void) {
     assert (sizeof *vec->bits <= sizeof 1ul);
 
     NEW(vec);
-    vec->bits = vec->tiny;
-    vec->maxsize = BVEC_INIT_SIZE;
-    memset(vec->tiny, 0, sizeof vec->tiny);
+    bvector_init(vec);
 
     return vec;
 }
 
+void bvector_init(struct bvector *bv)
+{
+    bv->bits = bv->tiny;
+    bv->maxsize = BVEC_INIT_SIZE;
+    memset(bv->tiny, 0, sizeof bv->tiny);
+}
+
 void
 bvector_copy (bvector_t dest, bvector_t src) {
     size_t bytes = BVEC_BYTES(src->maxsize);
 
     if (dest->bits != dest->tiny)
         free(dest->bits);
-    dest->bits = mh_xmalloc (bytes);
+    if (bytes <= sizeof dest->tiny)
+        dest->bits = dest->tiny;
+    else
+        dest->bits = mh_xmalloc (bytes);
     memcpy (dest->bits, src->bits, bytes);
     dest->maxsize = src->maxsize;
 }
 
 void
 bvector_free (bvector_t vec) {
-    if (vec->bits != vec->tiny)
-        free(vec->bits);
+    bvector_fini(vec);
     free (vec);
 }
 
+void bvector_fini(struct bvector *bv)
+{
+    if (bv->bits != bv->tiny)
+        free(bv->bits);
+}
+
 void
 bvector_clear (bvector_t vec, size_t n) {
     if (n < vec->maxsize)