diff --git a/cfwarray.c b/cfwarray.c index 547df0d..869559f 100644 --- a/cfwarray.c +++ b/cfwarray.c @@ -35,13 +35,20 @@ struct CFWArray { size_t size; }; -static void -ctor(void *ptr) +static bool +ctor(void *ptr, va_list args) { CFWArray *array = ptr; + void *obj; array->data = NULL; array->size = 0; + + while ((obj = va_arg(args, void*)) != NULL) + if (!cfw_array_push(array, obj)) + return false; + + return true; } static void diff --git a/cfwclass.h b/cfwclass.h index afe154f..95a56f4 100644 --- a/cfwclass.h +++ b/cfwclass.h @@ -29,11 +29,12 @@ #include #include +#include typedef struct CFWClass { const char *name; size_t size; - void (*ctor)(void*); + bool (*ctor)(void*, va_list args); void (*dtor)(void*); bool (*equal)(void*, void*); void* (*copy)(void*); diff --git a/cfwobject.c b/cfwobject.c index 9c98859..d18df57 100644 --- a/cfwobject.c +++ b/cfwobject.c @@ -29,7 +29,7 @@ #include "cfwobject.h" void* -cfw_new(CFWClass *class) +cfw_new(CFWClass *class, ...) { CFWObject *obj; @@ -39,8 +39,17 @@ cfw_new(CFWClass *class) obj->clsptr = class; obj->ref_cnt = 1; - if (class->ctor != NULL) - class->ctor(obj); + if (class->ctor != NULL) { + va_list args; + va_start(args, class); + + if (!class->ctor(obj, args)) { + cfw_unref(obj); + return NULL; + } + + va_end(args); + } return obj; } diff --git a/cfwobject.h b/cfwobject.h index 0b7e7de..58054d8 100644 --- a/cfwobject.h +++ b/cfwobject.h @@ -35,7 +35,7 @@ typedef struct CFWObject { } CFWObject; extern CFWClass *cfw_object; -extern void* cfw_new(CFWClass*); +extern void* cfw_new(CFWClass*, ...); extern void* cfw_ref(void*); extern void cfw_unref(void*); extern void cfw_free(void*); diff --git a/cfwstring.c b/cfwstring.c index a64244d..bbfb8fd 100644 --- a/cfwstring.c +++ b/cfwstring.c @@ -36,13 +36,23 @@ struct CFWString { size_t len; }; -static void -ctor(void *ptr) +static bool +ctor(void *ptr, va_list args) { CFWString *str = ptr; + const char *cstr = va_arg(args, const char*); - str->cstr = NULL; - str->len = 0; + if (cstr != NULL) { + if ((str->cstr = strdup(cstr)) == NULL) + return false; + + str->len = strlen(cstr); + } else { + str->cstr = NULL; + str->len = 0; + } + + return true; } static void diff --git a/test.c b/test.c index 33c4034..efcb511 100644 --- a/test.c +++ b/test.c @@ -33,30 +33,15 @@ int main() { + CFWString *s[3]; CFWArray *a; - CFWString *s; size_t i; - a = cfw_new(cfw_array); + s[0] = cfw_new(cfw_string, "Hallo"); + s[1] = cfw_new(cfw_string, "Welt"); + s[2] = cfw_new(cfw_string, "!"); - for (i = 0; i < 3; i++) { - s = cfw_new(cfw_string); - - switch (i) { - case 0: - cfw_string_set(s, "Hello"); - break; - case 1: - cfw_string_set(s, "World"); - break; - case 2: - cfw_string_set(s, "!"); - break; - } - - cfw_array_push(a, s); - cfw_unref(s); - } + a = cfw_new(cfw_array, s[0], s[1], s[2], NULL); for (i = 0; i < cfw_array_size(a); i++) puts(cfw_string_c(cfw_array_get(a, i)));