X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_utils.c;h=9ac3e8ab7536e00771bf13afcc9fccbe88290689;hb=2fe1a1c93f2240b9c9ac2137f1b17b2e20213486;hp=39d2aca1601cac61e5507047fcf0802f4af5163a;hpb=2f0b984b0dfee0a8ab2cb1d41670f40a07ec5cdb;p=rrdtool.git diff --git a/src/rrd_utils.c b/src/rrd_utils.c index 39d2aca..9ac3e8a 100644 --- a/src/rrd_utils.c +++ b/src/rrd_utils.c @@ -16,6 +16,7 @@ #include "rrd_tool.h" #include +#include #ifdef WIN32 # define random() rand() @@ -34,3 +35,63 @@ long rrd_random(void) return random(); } + +/* rrd_add_ptr: add a pointer to a dynamically sized array of pointers, + * realloc as necessary. returns 1 on success, 0 on failure. + */ + +int rrd_add_ptr(void ***dest, size_t *dest_size, void *src) +{ + void **temp; + + assert(dest != NULL); + + temp = (void **) rrd_realloc(*dest, (*dest_size+1) * sizeof(*dest)); + if (!temp) + return 0; + + *dest = temp; + temp[*dest_size] = src; + (*dest_size)++; + + return 1; +} + +/* like rrd_add_ptr, but calls strdup() on a string first. */ +int rrd_add_strdup(char ***dest, size_t *dest_size, char *src) +{ + char *dup_src; + int add_ok; + + assert(dest != NULL); + assert(src != NULL); + + dup_src = strdup(src); + if (!dup_src) + return 0; + + add_ok = rrd_add_ptr((void ***)dest, dest_size, (void *)dup_src); + if (!add_ok) + free(dup_src); + + return add_ok; +} + +void rrd_free_ptrs(void ***src, size_t *cnt) +{ + void **sp; + + assert(src != NULL); + sp = *src; + + if (sp == NULL) + return; + + while (*cnt > 0) { + (*cnt)--; + free(sp[*cnt]); + } + + free (sp); + *src = NULL; +}