summaryrefslogtreecommitdiff
path: root/src/utils/vector.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/vector.c')
-rw-r--r--src/utils/vector.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/src/utils/vector.c b/src/utils/vector.c
index 1ffa8a3..f99b773 100644
--- a/src/utils/vector.c
+++ b/src/utils/vector.c
@@ -32,49 +32,59 @@ struct parserutils_vector
* \param chunk_size Number of vector slots in a chunk
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data
- * \return Pointer to vector instance, or NULL on memory exhaustion
+ * \param vector Pointer to location to receive vector instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion
*/
-parserutils_vector *parserutils_vector_create(size_t item_size,
- size_t chunk_size, parserutils_alloc alloc, void *pw)
+parserutils_error parserutils_vector_create(size_t item_size,
+ size_t chunk_size, parserutils_alloc alloc, void *pw,
+ parserutils_vector **vector)
{
- parserutils_vector *vector;
+ parserutils_vector *v;
- if (item_size == 0 || chunk_size == 0 || alloc == NULL)
- return NULL;
+ if (item_size == 0 || chunk_size == 0 || alloc == NULL ||
+ vector == NULL)
+ return PARSERUTILS_BADPARM;
- vector = alloc(NULL, sizeof(parserutils_vector), pw);
- if (vector == NULL)
- return NULL;
+ v = alloc(NULL, sizeof(parserutils_vector), pw);
+ if (v == NULL)
+ return PARSERUTILS_NOMEM;
- vector->items = alloc(NULL, item_size * chunk_size, pw);
- if (vector->items == NULL) {
- alloc(vector, 0, pw);
- return NULL;
+ v->items = alloc(NULL, item_size * chunk_size, pw);
+ if (v->items == NULL) {
+ alloc(v, 0, pw);
+ return PARSERUTILS_NOMEM;
}
- vector->item_size = item_size;
- vector->chunk_size = chunk_size;
- vector->items_allocated = chunk_size;
- vector->current_item = -1;
+ v->item_size = item_size;
+ v->chunk_size = chunk_size;
+ v->items_allocated = chunk_size;
+ v->current_item = -1;
+
+ v->alloc = alloc;
+ v->pw = pw;
- vector->alloc = alloc;
- vector->pw = pw;
+ *vector = v;
- return vector;
+ return PARSERUTILS_OK;
}
/**
* Destroy a vector instance
*
* \param vector The vector to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise.
*/
-void parserutils_vector_destroy(parserutils_vector *vector)
+parserutils_error parserutils_vector_destroy(parserutils_vector *vector)
{
if (vector == NULL)
- return;
+ return PARSERUTILS_BADPARM;
vector->alloc(vector->items, 0, vector->pw);
vector->alloc(vector, 0, vector->pw);
+
+ return PARSERUTILS_OK;
}
/**