diff options
Diffstat (limited to 'src/libmowgli/object')
-rw-r--r-- | src/libmowgli/object/class.c | 59 | ||||
-rw-r--r-- | src/libmowgli/object/class.h | 34 | ||||
-rw-r--r-- | src/libmowgli/object/message.c | 68 | ||||
-rw-r--r-- | src/libmowgli/object/message.h | 3 | ||||
-rw-r--r-- | src/libmowgli/object/metadata.c | 36 | ||||
-rw-r--r-- | src/libmowgli/object/metadata.h | 3 | ||||
-rw-r--r-- | src/libmowgli/object/object.c | 18 | ||||
-rw-r--r-- | src/libmowgli/object/object.h | 3 |
8 files changed, 110 insertions, 114 deletions
diff --git a/src/libmowgli/object/class.c b/src/libmowgli/object/class.c index 9bddf79..627b59d 100644 --- a/src/libmowgli/object/class.c +++ b/src/libmowgli/object/class.c @@ -23,9 +23,10 @@ #include "mowgli.h" -static mowgli_patricia_t *mowgli_object_class_dict = NULL; +static mowgli_patricia_t *mowgli_object_class_dict; -static void _object_key_canon(char *str) +static void +_object_key_canon(char *str) { while (*str) { @@ -34,17 +35,17 @@ static void _object_key_canon(char *str) } } -void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mowgli_destructor_t des, mowgli_boolean_t dynamic) +void +mowgli_object_class_bootstrap() { - /* if the object_class dictionary has not yet been initialized, we will want to do that. */ - if (mowgli_object_class_dict == NULL) - mowgli_object_class_dict = mowgli_patricia_create(_object_key_canon); - - if (klass == NULL) - mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); + mowgli_object_class_dict = mowgli_patricia_create(_object_key_canon); +} - if (mowgli_object_class_find_by_name(name) != NULL) - mowgli_throw_exception_fatal(mowgli.object_class.duplicate_object_class_exception); +void +mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mowgli_destructor_t des, mowgli_boolean_t dynamic) +{ + return_if_fail(klass != NULL); + return_if_fail(mowgli_object_class_find_by_name(name) == NULL); /* initialize object_class::name */ klass->name = mowgli_strdup(name); @@ -64,12 +65,13 @@ void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mo mowgli_patricia_add(mowgli_object_class_dict, klass->name, klass); } -int mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_class_t *klass2) +int +mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_class_t *klass2) { - mowgli_node_t *n; + return_val_if_fail(klass1 != NULL, 0); + return_val_if_fail(klass2 != NULL, 0); - if (klass1 == NULL || klass2 == NULL) - mowgli_throw_exception_val(mowgli.object_class.invalid_object_class_exception, 0); + mowgli_node_t *n; MOWGLI_LIST_FOREACH(n, klass1->derivitives.head) { @@ -82,15 +84,17 @@ int mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_ return 0; } -void mowgli_object_class_set_derivitive(mowgli_object_class_t *klass, mowgli_object_class_t *parent) +void +mowgli_object_class_set_derivitive(mowgli_object_class_t *klass, mowgli_object_class_t *parent) { - if (klass == NULL || parent == NULL) - mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); + return_if_fail(klass != NULL); + return_if_fail(parent != NULL); mowgli_node_add(klass, mowgli_node_create(), &parent->derivitives); } -void *mowgli_object_class_reinterpret_impl(/* mowgli_object_t */ void *opdata, mowgli_object_class_t *klass) +void * +mowgli_object_class_reinterpret_impl( /* mowgli_object_t */ void *opdata, mowgli_object_class_t *klass) { mowgli_object_t *object = mowgli_object(opdata); @@ -101,24 +105,23 @@ void *mowgli_object_class_reinterpret_impl(/* mowgli_object_t */ void *opdata, m if (mowgli_object_class_check_cast(object->klass, klass)) return object; - mowgli_log("Invalid reinterpreted cast from %s<%p> to %s", object->klass->name, klass->name); + mowgli_log("Invalid reinterpreted cast from %s<%p> to %s", object->klass->name, (void *) object, klass->name); return NULL; } -mowgli_object_class_t *mowgli_object_class_find_by_name(const char *name) +mowgli_object_class_t * +mowgli_object_class_find_by_name(const char *name) { return mowgli_patricia_retrieve(mowgli_object_class_dict, name); } -void mowgli_object_class_destroy(mowgli_object_class_t *klass) +void +mowgli_object_class_destroy(mowgli_object_class_t *klass) { - mowgli_node_t *n, *tn; + return_if_fail(klass != NULL); + return_if_fail(klass->dynamic == TRUE); - if (klass == NULL) - mowgli_throw_exception_fatal(mowgli.object_class.invalid_object_class_exception); - - if (klass->dynamic != TRUE) - mowgli_throw_exception_fatal(mowgli.object_class.nondynamic_object_class_exception); + mowgli_node_t *n, *tn; MOWGLI_LIST_FOREACH_SAFE(n, tn, klass->derivitives.head) { diff --git a/src/libmowgli/object/class.h b/src/libmowgli/object/class.h index 9612aa4..121368b 100644 --- a/src/libmowgli/object/class.h +++ b/src/libmowgli/object/class.h @@ -26,7 +26,8 @@ typedef void (*mowgli_destructor_t)(void *); -typedef struct { +typedef struct +{ char *name; mowgli_list_t derivitives; mowgli_destructor_t destructor; @@ -37,24 +38,25 @@ typedef struct { extern void mowgli_object_class_init(mowgli_object_class_t *klass, const char *name, mowgli_destructor_t des, mowgli_boolean_t dynamic); extern int mowgli_object_class_check_cast(mowgli_object_class_t *klass1, mowgli_object_class_t *klass2); extern void mowgli_object_class_set_derivitive(mowgli_object_class_t *klass, mowgli_object_class_t *parent); -extern void *mowgli_object_class_reinterpret_impl(/* mowgli_object_t */ void *object, mowgli_object_class_t *klass); +extern void *mowgli_object_class_reinterpret_impl( /* mowgli_object_t */ void *object, mowgli_object_class_t *klass); extern mowgli_object_class_t *mowgli_object_class_find_by_name(const char *name); extern void mowgli_object_class_destroy(mowgli_object_class_t *klass); -#define MOWGLI_REINTERPRET_CAST(object, klass) (klass *) mowgli_object_class_reinterpret_impl(object, mowgli_object_class_find_by_name( # klass )); +#define MOWGLI_REINTERPRET_CAST(object, klass) (klass *) mowgli_object_class_reinterpret_impl(object, mowgli_object_class_find_by_name(#klass)) -#define mowgli_forced_cast(from_type, to_type, from, to)\ -do { \ - union cast_union \ - { \ - to_type out; \ - from_type in; \ - } u; \ - typedef int cant_use_union_cast[ \ - sizeof (from_type) == sizeof (u) \ - && sizeof (from_type) == sizeof (to_type) ? 1 : -1];\ - u.in = from; \ - to = u.out; \ -} while (0) +#define mowgli_forced_cast(from_type, to_type, from, to) \ + do \ + { \ + union cast_union \ + { \ + to_type out; \ + from_type in; \ + } u; \ + typedef int cant_use_union_cast[ \ + sizeof(from_type) == sizeof(u) \ + && sizeof(from_type) == sizeof(to_type) ? 1 : -1]; \ + u.in = from; \ + to = u.out; \ + } while (0) #endif diff --git a/src/libmowgli/object/message.c b/src/libmowgli/object/message.c index e4328c8..d99f53b 100644 --- a/src/libmowgli/object/message.c +++ b/src/libmowgli/object/message.c @@ -23,71 +23,61 @@ #include "mowgli.h" -void mowgli_object_class_message_handler_attach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) +void +mowgli_object_class_message_handler_attach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) { - if (klass == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_object_class_exception); - - if (sig == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); + return_if_fail(klass != NULL); + return_if_fail(sig != NULL); mowgli_node_add(sig, mowgli_node_create(), &klass->message_handlers); } -void mowgli_object_class_message_handler_detach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) +void +mowgli_object_class_message_handler_detach(mowgli_object_class_t *klass, mowgli_object_message_handler_t *sig) { - mowgli_node_t *n; + return_if_fail(klass != NULL); + return_if_fail(sig != NULL); - if (klass == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_object_class_exception); - - if (sig == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); + mowgli_node_t *n; n = mowgli_node_find(sig, &klass->message_handlers); mowgli_node_delete(n, &klass->message_handlers); mowgli_node_free(n); } -void mowgli_object_message_handler_attach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) +void +mowgli_object_message_handler_attach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) { - if (self == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); - - if (sig == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); + return_if_fail(self != NULL); + return_if_fail(sig != NULL); mowgli_node_add(sig, mowgli_node_create(), &self->message_handlers); } -void mowgli_object_message_handler_detach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) +void +mowgli_object_message_handler_detach(mowgli_object_t *self, mowgli_object_message_handler_t *sig) { - mowgli_node_t *n; + return_if_fail(self != NULL); + return_if_fail(sig != NULL); - if (self == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); - - if (sig == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_signal_exception); + mowgli_node_t *n; n = mowgli_node_find(sig, &self->message_handlers); mowgli_node_delete(n, &self->message_handlers); mowgli_node_free(n); } -void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, ...) +void +mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, ...) { + return_if_fail(self != NULL); + return_if_fail(name != NULL); + mowgli_argstack_t *stack; mowgli_object_message_handler_t *sig = NULL; mowgli_node_t *n; va_list va; - if (self == NULL) - mowgli_throw_exception(mowgli.object_messaging.invalid_object_exception); - - if (name == NULL) - mowgli_throw_exception(mowgli.null_pointer_exception); - /* try to find a signal to compile the argument stack from, we start with self::klass first. */ MOWGLI_LIST_FOREACH(n, self->klass->message_handlers.head) { @@ -101,7 +91,6 @@ void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, .. } if (sig == NULL) - { MOWGLI_LIST_FOREACH(n, self->klass->message_handlers.head) { mowgli_object_message_handler_t *sig2 = (mowgli_object_message_handler_t *) n->data; @@ -112,11 +101,10 @@ void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, .. break; } } - } - /* return if no signals found, else compile the argstack */ - if (sig == NULL) - return; + /* return if no signals found, else compile the argstack */ + if (sig == NULL) + return; va_start(va, name); stack = mowgli_argstack_create_from_va_list(sig->descstr, va); @@ -126,7 +114,7 @@ void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, .. { sig = (mowgli_object_message_handler_t *) n->data; - if (!strcasecmp(sig->name, name) && sig->handler != NULL) + if (!strcasecmp(sig->name, name) && (sig->handler != NULL)) sig->handler(self, sig, stack); } @@ -134,7 +122,7 @@ void mowgli_object_message_broadcast(mowgli_object_t *self, const char *name, .. { sig = (mowgli_object_message_handler_t *) n->data; - if (!strcasecmp(sig->name, name) && sig->handler != NULL) + if (!strcasecmp(sig->name, name) && (sig->handler != NULL)) sig->handler(self, sig, stack); } diff --git a/src/libmowgli/object/message.h b/src/libmowgli/object/message.h index 4a49d00..aee82af 100644 --- a/src/libmowgli/object/message.h +++ b/src/libmowgli/object/message.h @@ -27,7 +27,8 @@ typedef struct mowgli_object_message_handler_ mowgli_object_message_handler_t; typedef void (*mowgli_object_messaging_func_t)(mowgli_object_t *self, mowgli_object_message_handler_t *sig, mowgli_argstack_t *argstack); -struct mowgli_object_message_handler_ { +struct mowgli_object_message_handler_ +{ char *name; char *descstr; mowgli_object_messaging_func_t handler; diff --git a/src/libmowgli/object/metadata.c b/src/libmowgli/object/metadata.c index 742e0dc..307947e 100644 --- a/src/libmowgli/object/metadata.c +++ b/src/libmowgli/object/metadata.c @@ -23,17 +23,15 @@ #include "mowgli.h" -void mowgli_object_metadata_associate(mowgli_object_t *self, const char *key, void *value) +void +mowgli_object_metadata_associate(mowgli_object_t *self, const char *key, void *value) { + return_if_fail(self != NULL); + return_if_fail(key != NULL); + mowgli_object_metadata_entry_t *e = NULL; mowgli_node_t *n; - if (self == NULL) - mowgli_throw_exception(mowgli.object_metadata.invalid_object_exception); - - if (key == NULL) - mowgli_throw_exception(mowgli.null_pointer_exception); - MOWGLI_LIST_FOREACH(n, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; @@ -55,17 +53,15 @@ void mowgli_object_metadata_associate(mowgli_object_t *self, const char *key, vo mowgli_node_add(e, mowgli_node_create(), &self->metadata); } -void mowgli_object_metadata_dissociate(mowgli_object_t *self, const char *key) +void +mowgli_object_metadata_dissociate(mowgli_object_t *self, const char *key) { + return_if_fail(self != NULL); + return_if_fail(key != NULL); + mowgli_object_metadata_entry_t *e; mowgli_node_t *n, *tn; - if (self == NULL) - mowgli_throw_exception(mowgli.object_metadata.invalid_object_exception); - - if (key == NULL) - mowgli_throw_exception(mowgli.null_pointer_exception); - MOWGLI_LIST_FOREACH_SAFE(n, tn, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; @@ -81,17 +77,15 @@ void mowgli_object_metadata_dissociate(mowgli_object_t *self, const char *key) } } -void *mowgli_object_metadata_retrieve(mowgli_object_t *self, const char *key) +void * +mowgli_object_metadata_retrieve(mowgli_object_t *self, const char *key) { + return_null_if_fail(self != NULL); + return_null_if_fail(key != NULL); + mowgli_object_metadata_entry_t *e; mowgli_node_t *n; - if (self == NULL) - mowgli_throw_exception_val(mowgli.object_metadata.invalid_object_exception, NULL); - - if (key == NULL) - mowgli_throw_exception_val(mowgli.null_pointer_exception, NULL); - MOWGLI_LIST_FOREACH(n, self->metadata.head) { e = (mowgli_object_metadata_entry_t *) n->data; diff --git a/src/libmowgli/object/metadata.h b/src/libmowgli/object/metadata.h index 0cdda69..fe2170c 100644 --- a/src/libmowgli/object/metadata.h +++ b/src/libmowgli/object/metadata.h @@ -24,7 +24,8 @@ #ifndef __MOWGLI_OBJECT_METADATA_H__ #define __MOWGLI_OBJECT_METADATA_H__ -typedef struct { +typedef struct +{ char *name; void *data; } mowgli_object_metadata_entry_t; diff --git a/src/libmowgli/object/object.c b/src/libmowgli/object/object.c index 7b24ea7..04a218f 100644 --- a/src/libmowgli/object/object.c +++ b/src/libmowgli/object/object.c @@ -40,7 +40,8 @@ * Side Effects: * - none */ -void mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_class_t *klass, mowgli_destructor_t des) +void +mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_class_t *klass, mowgli_destructor_t des) { return_if_fail(obj != NULL); @@ -48,7 +49,9 @@ void mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_cl obj->name = mowgli_strdup(name); if (klass != NULL) + { obj->klass = klass; + } else { mowgli_object_class_t *tmp = mowgli_alloc(sizeof(mowgli_object_class_t)); @@ -85,8 +88,7 @@ void mowgli_object_init(mowgli_object_t *obj, const char *name, mowgli_object_cl * - none */ void -mowgli_object_init_from_class(mowgli_object_t *obj, const char *name, - mowgli_object_class_t *klass) +mowgli_object_init_from_class(mowgli_object_t *obj, const char *name, mowgli_object_class_t *klass) { return_if_fail(obj != NULL); return_if_fail(klass != NULL); @@ -108,7 +110,8 @@ mowgli_object_init_from_class(mowgli_object_t *obj, const char *name, * Side Effects: * - none */ -void * mowgli_object_ref(void *object) +void * +mowgli_object_ref(void *object) { return_val_if_fail(object != NULL, NULL); @@ -131,7 +134,8 @@ void * mowgli_object_ref(void *object) * Side Effects: * - if the refcount is 0, the object is destroyed. */ -void mowgli_object_unref(void *object) +void +mowgli_object_unref(void *object) { mowgli_object_t *obj = mowgli_object(object); @@ -159,6 +163,8 @@ void mowgli_object_unref(void *object) free(obj); } else - mowgli_throw_exception(mowgli.object.invalid_object_class_exception); + { + mowgli_log_warning("invalid object class"); + } } } diff --git a/src/libmowgli/object/object.h b/src/libmowgli/object/object.h index 0f13ce1..255df10 100644 --- a/src/libmowgli/object/object.h +++ b/src/libmowgli/object/object.h @@ -24,7 +24,8 @@ #ifndef __MOWGLI_OBJECT_H__ #define __MOWGLI_OBJECT_H__ -typedef struct { +typedef struct +{ char *name; int refcount; mowgli_object_class_t *klass; |