]> granicus.if.org Git - nethack/commitdiff
Adding ptr_array data structure.
authorBart House <bart@barthouse.com>
Sat, 13 Jul 2019 23:08:08 +0000 (16:08 -0700)
committerBart House <bart@barthouse.com>
Sat, 13 Jul 2019 23:08:08 +0000 (16:08 -0700)
include/decl.h
include/extern.h
src/hacklib.c

index 5ebaa326e6181daab3ba7b935f96208b80042b2f..834b14ab89d727a3cbee68c96fcf3d927af193f8 100644 (file)
@@ -455,6 +455,13 @@ struct early_opt {
     boolean valallowed;
 };
 
+struct ptr_array {
+    size_t  length;
+    size_t  max_length;
+    void ** elements;
+};
+typedef struct ptr_array ptr_array_t;
+
 #undef E
 
 #endif /* DECL_H */
index abea20a68ffbbd4f8ea474eb426ca4a1b442e264..d2ed2ff9e5d2c66413381caf99ab8ae17dd266c6 100644 (file)
@@ -968,6 +968,8 @@ E void FDECL(strbuf_append, (strbuf_t *, const char *));
 E void FDECL(strbuf_reserve, (strbuf_t *, int));
 E void FDECL(strbuf_empty, (strbuf_t *));
 E void FDECL(strbuf_nl_to_crlf, (strbuf_t *));
+E struct ptr_array * FDECL(ptr_array_new, (size_t length));
+E void FDECL(ptr_array_free, (struct ptr_array *));
 
 /* ### invent.c ### */
 
index b97a78a65204413ebfdf2f7fe88dd913601f9a4d..9fe316517ee0c64baf04223ee743d05c8be09abf 100644 (file)
@@ -1223,4 +1223,38 @@ strbuf_t *strbuf;
     }
 }
 
+ptr_array_t *
+ptr_array_new(max_length)
+    size_t max_length;
+{
+    size_t esize = max_length * sizeof(void *);
+    ptr_array_t * a = (ptr_array_t *) malloc(sizeof(ptr_array_t) + esize);
+    a->elements = (void **)(a + 1);
+    a->length = 0;
+    a->max_length = max_length;
+    memset(a->elements, 0, esize);
+    return a;
+}
+
+void
+ptr_array_free(a)
+    ptr_array_t * a;
+{
+    size_t i;
+
+    nhassert(a->length <= a->max_length);
+
+    for(i = 0; i < a->length; i++)
+        if(a->elements[i])
+            free(a->elements[i]);
+
+    for (i = a->length; i < a->max_length; i++) {
+        nhassert(a->elements[i] == NULL);
+        if(a->elements[i])
+            free(a->elements[i]);
+    }
+
+    free(a);
+}
+
 /*hacklib.c*/