]> diplodocus.org Git - nmh/blobdiff - sbr/vector.c
Correct first-line comments where filename is wrong.
[nmh] / sbr / vector.c
index ca8c894ea398bce0d3f988f72daf4f5f774a3e0c..8765fc60b0168edadfd4b8e71a94d3d624e88e8a 100644 (file)
@@ -1,5 +1,4 @@
-/*
- * vector.c -- dynamically sized vectors
+/* vector.c -- dynamically sized vectors
  *
  * This code is Copyright (c) 2013, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  *
  * This code is Copyright (c) 2013, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
@@ -46,8 +45,11 @@ static void bvector_resize (bvector_t, size_t);
 
 bvector_t
 bvector_create (size_t init_size) {
 
 bvector_t
 bvector_create (size_t init_size) {
-    bvector_t vec = mh_xmalloc (sizeof *vec);
-    size_t bytes = BVEC_BYTES (vec, init_size  ?  init_size  :  VEC_INIT_SIZE);
+    bvector_t vec;
+    size_t bytes;
+
+    NEW(vec);
+    bytes = BVEC_BYTES (vec, init_size  ?  init_size  :  VEC_INIT_SIZE);
 
     vec->bits = mh_xmalloc (bytes);
     memset (vec->bits, 0, bytes);
 
     vec->bits = mh_xmalloc (bytes);
     memset (vec->bits, 0, bytes);
@@ -77,7 +79,8 @@ bvector_clear (bvector_t vec, size_t n) {
     size_t word = BVEC_WORD (vec,n);
     size_t offset = BVEC_OFFSET (vec, n);
 
     size_t word = BVEC_WORD (vec,n);
     size_t offset = BVEC_OFFSET (vec, n);
 
-    if (n >= vec->maxsize) bvector_resize (vec, n);
+    if (n >= vec->maxsize)
+        bvector_resize (vec, n);
 
     assert (sizeof *vec->bits <= sizeof 1ul);
     vec->bits[word] &= ~(1ul << offset);
 
     assert (sizeof *vec->bits <= sizeof 1ul);
     vec->bits[word] &= ~(1ul << offset);
@@ -95,7 +98,8 @@ bvector_set (bvector_t vec, size_t n) {
     size_t word = BVEC_WORD (vec, n);
     size_t offset = BVEC_OFFSET (vec, n);
 
     size_t word = BVEC_WORD (vec, n);
     size_t offset = BVEC_OFFSET (vec, n);
 
-    if (n >= vec->maxsize) bvector_resize (vec, n);
+    if (n >= vec->maxsize)
+        bvector_resize (vec, n);
     assert (sizeof *vec->bits <= sizeof 1ul);
     vec->bits[word] |= 1ul << offset;
 }
     assert (sizeof *vec->bits <= sizeof 1ul);
     vec->bits[word] |= 1ul << offset;
 }
@@ -117,10 +121,12 @@ bvector_resize (bvector_t vec, size_t maxsize) {
     size_t bytes;
     size_t i;
 
     size_t bytes;
     size_t i;
 
-    while ((vec->maxsize *= 2) < maxsize) continue;
+    while ((vec->maxsize *= 2) < maxsize)
+        ;
     bytes = BVEC_BYTES (vec, vec->maxsize);
     vec->bits = mh_xrealloc (vec->bits, bytes);
     bytes = BVEC_BYTES (vec, vec->maxsize);
     vec->bits = mh_xrealloc (vec->bits, bytes);
-    for (i = old_maxsize; i < vec->maxsize; ++i) bvector_clear (vec, i);
+    for (i = old_maxsize; i < vec->maxsize; ++i)
+        bvector_clear (vec, i);
 }
 
 const unsigned long *
 }
 
 const unsigned long *
@@ -144,9 +150,10 @@ static void svector_resize (svector_t, size_t);
 
 svector_t
 svector_create (size_t init_size) {
 
 svector_t
 svector_create (size_t init_size) {
-    svector_t vec = mh_xmalloc (sizeof *vec);
+    svector_t vec;
     size_t bytes;
 
     size_t bytes;
 
+    NEW(vec);
     vec->maxsize = init_size ? init_size : VEC_INIT_SIZE;
     bytes = vec->maxsize * sizeof (char *);
     vec->strs = mh_xmalloc (bytes);
     vec->maxsize = init_size ? init_size : VEC_INIT_SIZE;
     bytes = vec->maxsize * sizeof (char *);
     vec->strs = mh_xmalloc (bytes);
@@ -164,16 +171,36 @@ svector_free (svector_t vec) {
 
 char *
 svector_push_back (svector_t vec, char *s) {
 
 char *
 svector_push_back (svector_t vec, char *s) {
-    if (++vec->size >= vec->maxsize) svector_resize (vec, vec->size);
+    if (++vec->size >= vec->maxsize)
+        svector_resize (vec, vec->size);
     return vec->strs[vec->size-1] = s;
 }
 
 char *
 svector_at (svector_t vec, size_t i) {
     return vec->strs[vec->size-1] = s;
 }
 
 char *
 svector_at (svector_t vec, size_t i) {
-    if (i >= vec->maxsize) svector_resize (vec, i);
+    if (i >= vec->maxsize)
+        svector_resize (vec, i);
     return vec->strs[i];
 }
 
     return vec->strs[i];
 }
 
+/*
+ * Return address of first element that stringwise matches s.
+ * The caller can replace the contents of the return address.
+ */
+char **
+svector_find (svector_t vec, const char *s) {
+    size_t i;
+    char **str = vec->strs;
+
+    for (i = 0; i < vec->size; ++i, ++str) {
+        if (*str  &&  ! strcmp(*str, s)) {
+            return str;
+        }
+    }
+
+    return NULL;
+}
+
 char **
 svector_strs (svector_t vec) {
     return vec->strs;
 char **
 svector_strs (svector_t vec) {
     return vec->strs;
@@ -189,9 +216,11 @@ svector_resize (svector_t vec, size_t maxsize) {
     size_t old_maxsize = vec->maxsize;
     size_t i;
 
     size_t old_maxsize = vec->maxsize;
     size_t i;
 
-    while ((vec->maxsize *= 2) < maxsize) continue;
+    while ((vec->maxsize *= 2) < maxsize)
+        ;
     vec->strs = mh_xrealloc (vec->strs, vec->maxsize * sizeof (char *));
     vec->strs = mh_xrealloc (vec->strs, vec->maxsize * sizeof (char *));
-    for (i = old_maxsize; i < vec->maxsize; ++i) vec->strs[i] = NULL;
+    for (i = old_maxsize; i < vec->maxsize; ++i)
+        vec->strs[i] = NULL;
 }
 
 
 }
 
 
@@ -205,9 +234,10 @@ static void ivector_resize (ivector_t, size_t);
 
 ivector_t
 ivector_create (size_t init_size) {
 
 ivector_t
 ivector_create (size_t init_size) {
-    ivector_t vec = mh_xmalloc (sizeof *vec);
+    ivector_t vec;
     size_t bytes;
 
     size_t bytes;
 
+    NEW(vec);
     vec->maxsize = init_size ? init_size : VEC_INIT_SIZE;
     bytes = vec->maxsize * sizeof (int);
     vec->ints = mh_xmalloc (bytes);
     vec->maxsize = init_size ? init_size : VEC_INIT_SIZE;
     bytes = vec->maxsize * sizeof (int);
     vec->ints = mh_xmalloc (bytes);
@@ -225,19 +255,22 @@ ivector_free (ivector_t vec) {
 
 int
 ivector_push_back (ivector_t vec, int n) {
 
 int
 ivector_push_back (ivector_t vec, int n) {
-    if (++vec->size >= vec->maxsize) ivector_resize (vec, vec->size);
+    if (++vec->size >= vec->maxsize)
+        ivector_resize (vec, vec->size);
     return vec->ints[vec->size-1] = n;
 }
 
 int
 ivector_at (ivector_t vec, size_t i) {
     return vec->ints[vec->size-1] = n;
 }
 
 int
 ivector_at (ivector_t vec, size_t i) {
-    if (i >= vec->maxsize) ivector_resize (vec, i);
+    if (i >= vec->maxsize)
+        ivector_resize (vec, i);
     return vec->ints[i];
 }
 
 int *
 ivector_atp (ivector_t vec, size_t i) {
     return vec->ints[i];
 }
 
 int *
 ivector_atp (ivector_t vec, size_t i) {
-    if (i >= vec->maxsize) ivector_resize (vec, i);
+    if (i >= vec->maxsize)
+        ivector_resize (vec, i);
     return &vec->ints[i];
 }
 
     return &vec->ints[i];
 }
 
@@ -251,7 +284,9 @@ ivector_resize (ivector_t vec, size_t maxsize) {
     size_t old_maxsize = vec->maxsize;
     size_t i;
 
     size_t old_maxsize = vec->maxsize;
     size_t i;
 
-    while ((vec->maxsize *= 2) < maxsize) continue;
+    while ((vec->maxsize *= 2) < maxsize)
+        ;
     vec->ints = mh_xrealloc (vec->ints, vec->maxsize * sizeof (int));
     vec->ints = mh_xrealloc (vec->ints, vec->maxsize * sizeof (int));
-    for (i = old_maxsize; i < vec->maxsize; ++i) vec->ints[i] = 0;
+    for (i = old_maxsize; i < vec->maxsize; ++i)
+        vec->ints[i] = 0;
 }
 }