From fed9b6f27f1c27babcddfef57184deef68fa6132 Mon Sep 17 00:00:00 2001 From: Francesco Romani Date: Sat, 5 Jul 2014 18:04:33 +0200 Subject: [PATCH] utils: add utility dynamic array Add utility code to handle a dynamic array. Supported operations: * append an item * grow the array * get an item * get the length of the array * check if the array has any data on it. There are clear use cases for this utility in the OrcParser, but may be useful elsewhere as well. Part-of: --- orc/orcutils.c | 31 +++++++++++++++++++++++++++++++ orc/orcutils.h | 20 ++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/orc/orcutils.c b/orc/orcutils.c index f0b77f6..adbb5ad 100644 --- a/orc/orcutils.c +++ b/orc/orcutils.c @@ -206,3 +206,34 @@ _strtoll (const char *nptr, char **endptr, int base) return (neg) ? - val : val; } +int +orc_vector_length (OrcVector *vector) +{ + return (vector == NULL) ?0 :vector->n_items; +} + +int +orc_vector_has_data (OrcVector *vector) +{ + return (orc_vector_length (vector) > 0 && + vector->items != NULL && /* extra sanity check */ + vector->items[0] != NULL); +} + +void +orc_vector_extend (OrcVector *vector) +{ + vector->n_items_alloc += ORC_VECTOR_ITEM_CHUNK; + vector->items = realloc (vector->items, sizeof(void *) * vector->n_items_alloc); +} + +void +orc_vector_append (OrcVector *vector, void *item) +{ + if (vector->n_items == vector->n_items_alloc) { + orc_vector_extend (vector); + } + vector->items[vector->n_items] = item; + vector->n_items++; +} + diff --git a/orc/orcutils.h b/orc/orcutils.h index c20e27f..9b1f993 100644 --- a/orc/orcutils.h +++ b/orc/orcutils.h @@ -231,6 +231,26 @@ ORC_BEGIN_DECLS char * get_proc_cpuinfo (void); #endif +#define ORC_VECTOR_ITEM_CHUNK 32 + +typedef struct _OrcVector OrcVector; +struct _OrcVector { + void **items; + int n_items; + int n_items_alloc; +}; + +#define ORC_VECTOR_AS_TYPE(VECTOR, TYPE) \ + ((TYPE **)(((VECTOR)->items))) + +#define ORC_VECTOR_GET_ITEM(VECTOR, INDEX, TYPEPTR) \ + ((TYPEPTR) &((VECTOR)->items[(INDEX)])) + +void orc_vector_extend (OrcVector *vector); +void orc_vector_append (OrcVector *vector, void *item); +int orc_vector_length (OrcVector *vector); +int orc_vector_has_data (OrcVector *vector); + char * _strndup (const char *s, int n); char ** strsplit (const char *s, char delimiter); char * get_tag_value (char *s, const char *tag); -- 2.7.4