X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Fobject.c;h=9101918654379a1ff41491df64187d399468d186;hp=711607afaf5acd16960a732dbd96e9e97c199fe4;hb=703c09231bca96e2e5d680ead4b471ec9e276ef5;hpb=bf3b8e60b2fdc493c4e04b05ce67abf69ca9a4ff diff --git a/src/core/object.c b/src/core/object.c index 711607a..9101918 100644 --- a/src/core/object.c +++ b/src/core/object.c @@ -1,5 +1,5 @@ /* - * syscollector - src/core/object.c + * SysDB - src/core/object.c * Copyright (C) 2012 Sebastian 'tokkee' Harl * All rights reserved. * @@ -25,6 +25,10 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif /* HAVE_CONFIG_H */ + #include "core/object.h" #include @@ -33,80 +37,110 @@ #include /* - * private helper functions + * private types */ static int -sc_object_wrapper_init(sc_object_t *obj, va_list ap) +sdb_object_wrapper_init(sdb_object_t *obj, va_list ap) { void *data = va_arg(ap, void *); void (*destructor)(void *) = va_arg(ap, void (*)(void *)); assert(obj); - SC_OBJ_WRAPPER(obj)->data = data; - SC_OBJ_WRAPPER(obj)->destructor = destructor; + SDB_OBJ_WRAPPER(obj)->data = data; + SDB_OBJ_WRAPPER(obj)->destructor = destructor; return 0; -} /* sc_object_wrapper_init */ +} /* sdb_object_wrapper_init */ static void -sc_object_wrapper_destroy(sc_object_t *obj) +sdb_object_wrapper_destroy(sdb_object_t *obj) { if (! obj) return; assert(obj->ref_cnt <= 0); - if (SC_OBJ_WRAPPER(obj)->destructor && SC_OBJ_WRAPPER(obj)->data) - SC_OBJ_WRAPPER(obj)->destructor(SC_OBJ_WRAPPER(obj)->data); - SC_OBJ_WRAPPER(obj)->data = NULL; -} /* sc_object_wrapper_destroy */ + if (SDB_OBJ_WRAPPER(obj)->destructor && SDB_OBJ_WRAPPER(obj)->data) + SDB_OBJ_WRAPPER(obj)->destructor(SDB_OBJ_WRAPPER(obj)->data); + SDB_OBJ_WRAPPER(obj)->data = NULL; +} /* sdb_object_wrapper_destroy */ + +static sdb_type_t sdb_object_wrapper_type = { + sizeof(sdb_object_wrapper_t), + + sdb_object_wrapper_init, + sdb_object_wrapper_destroy +}; /* * public API */ -sc_object_t * -sc_object_create(size_t size, int (*init)(sc_object_t *, va_list), - void (*destructor)(sc_object_t *), ...) +sdb_object_t * +sdb_object_vcreate(const char *name, sdb_type_t type, va_list ap) { - sc_object_t *obj; + sdb_object_t *obj; - obj = malloc(size); - if (! obj) + if (type.size < sizeof(sdb_object_t)) return NULL; - memset(obj, 0, sizeof(*obj)); - if (init) { - va_list ap; - va_start(ap, destructor); + obj = malloc(type.size); + if (! obj) + return NULL; + memset(obj, 0, type.size); + obj->type = type; - if (init(obj, ap)) { + if (name) { + obj->name = strdup(name); + if (! obj->name) { obj->ref_cnt = 1; - sc_object_deref(obj); - va_end(ap); + sdb_object_deref(obj); return NULL; } + } - va_end(ap); + if (type.init) { + if (type.init(obj, ap)) { + obj->ref_cnt = 1; + sdb_object_deref(obj); + return NULL; + } } obj->ref_cnt = 1; - obj->destructor = destructor; - obj->size = size; return obj; -} /* sc_object_create */ +} /* sdb_object_vcreate */ + +sdb_object_t * +sdb_object_create(const char *name, sdb_type_t type, ...) +{ + sdb_object_t *obj; + va_list ap; + + va_start(ap, type); + obj = sdb_object_vcreate(name, type, ap); + va_end(ap); + return obj; +} /* sdb_object_create */ -sc_object_t * -sc_object_create_wrapper(void *data, void (*destructor)(void *)) +sdb_object_t * +sdb_object_create_simple(const char *name, size_t size, + void (*destructor)(sdb_object_t *)) { - return sc_object_create(sizeof(sc_object_wrapper_t), - sc_object_wrapper_init, sc_object_wrapper_destroy, - data, destructor); -} /* sc_object_create_wrapper */ + sdb_type_t t = { size, NULL, destructor }; + return sdb_object_create(name, t); +} /* sdb_object_create_simple */ + +sdb_object_t * +sdb_object_create_wrapper(const char *name, + void *data, void (*destructor)(void *)) +{ + return sdb_object_create(name, sdb_object_wrapper_type, data, destructor); +} /* sdb_object_create_wrapper */ void -sc_object_deref(sc_object_t *obj) +sdb_object_deref(sdb_object_t *obj) { if (! obj) return; @@ -115,20 +149,35 @@ sc_object_deref(sc_object_t *obj) if (obj->ref_cnt > 0) return; - if (obj->destructor) - obj->destructor(obj); + if (obj->type.destroy) + obj->type.destroy(obj); + if (obj->name) + free(obj->name); free(obj); -} /* sc_object_deref */ +} /* sdb_object_deref */ void -sc_object_ref(sc_object_t *obj) +sdb_object_ref(sdb_object_t *obj) { if (! obj) return; assert(obj->ref_cnt > 0); ++obj->ref_cnt; -} /* sc_object_ref */ +} /* sdb_object_ref */ + +int +sdb_object_cmp_by_name(const sdb_object_t *o1, const sdb_object_t *o2) +{ + if ((! o1) && (! o2)) + return 0; + else if (! o1) + return -1; + else if (! o2) + return 1; + + return strcasecmp(o1->name, o2->name); +} /* sdb_object_cmp_by_name */ /* vim: set tw=78 sw=4 ts=4 noexpandtab : */