Adding ptr_array data structure.

This commit is contained in:
Bart House
2019-07-13 16:08:08 -07:00
parent c44ad5645d
commit e665d3b850
3 changed files with 43 additions and 0 deletions

View 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 */

View 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 ### */

View 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*/