" "
};
-void *_dd_add_obj(dd_t *dd, void *talloc_chunk, void *obj, size_t size)
+int _dd_add_obj(dd_t *dd, void *talloc_chunk, void *obj, size_t size, int (*destructor)(void *))
{
AFP_ASSERT(talloc_chunk);
-
+
+ if (destructor)
+ talloc_set_destructor(talloc_chunk, destructor);
if (dd->dd_talloc_array == NULL) {
dd->dd_talloc_array = talloc_array(dd, void *, 1);
} else {
printf("%s}\n", neststrings[nestinglevel]);
}
+static int bstring_destructor(void *bstr)
+{
+ bdestroy(*(bstring *)bstr);
+ return 0;
+}
+
#ifdef SPOT_TEST_MAIN
#include <stdarg.h>
LOG(logtype_default, log_info, "Start");
i = 2;
- dd_add_obj(dd, &i, int64_t);
+ dd_add_obj(dd, &i, int64_t, NULL);
bstring str = bfromcstr("hello world");
- dd_add_obj(dd, &str, bstring);
+ dd_add_obj(dd, &str, bstring, bstring_destructor);
bool b = true;
- dd_add_obj(dd, &b, bool);
+ dd_add_obj(dd, &b, bool, NULL);
b = false;
- dd_add_obj(dd, &b, bool);
+ dd_add_obj(dd, &b, bool, NULL);
i = 1;
- dd_add_obj(dd, &i, int64_t);
+ dd_add_obj(dd, &i, int64_t, NULL);
/* add a nested array */
dd_t *nested = talloc_zero(dd, dd_t);
- dd_add_obj(nested, &i, int64_t);
- dd_add_obj(nested, &str, bstring);
- dd_add_obj(dd, &nested, dd_t);
+ dd_add_obj(nested, &i, int64_t, NULL);
+ dd_add_obj(nested, &str, bstring, bstring_destructor);
+ dd_add_obj(dd, &nested, dd_t, NULL);
dd_dump(dd, 0);
#include "config.h"
#endif /* HAVE_CONFIG_H */
+#ifndef DD_H
+#define DD_H
+
/* dynamic datastore */
typedef struct {
void **dd_talloc_array;
#define dd_init(dd) (dd)->dd_talloc_array = NULL;
-#define dd_add_obj(dd, obj, type) \
- _dd_add_obj((dd), talloc((dd), type), (obj), sizeof(type));
+#define dd_add_obj(dd, obj, type, destructor) \
+ _dd_add_obj((dd), talloc((dd), type), (obj), sizeof(type), (destructor));
+
+#define dd_get_count(dd) talloc_array_length(dd->dd_talloc_array)
+
+extern int _dd_add_obj(dd_t *dd, void *talloc_chunk, void *obj, size_t size, int (*destructor)(void *));
-#define dd_get_count(dd) talloc_array_length(dd)
+#endif /* DD_H */