From 0d6e5db80a7adf84b972d8eadd3ba7a2a1c52b99 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Sun, 10 Nov 2013 02:39:44 +0000 Subject: [PATCH] add function to create an object with a va_list pointer instead of its argument list. Obviously the va_list must contain the correct values for the class constructor. --- include/class/interface/class.h | 7 +++++++ src/class/interface/i_class.c | 20 +++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/include/class/interface/class.h b/include/class/interface/class.h index 98cbdbd..721af7b 100644 --- a/include/class/interface/class.h +++ b/include/class/interface/class.h @@ -52,6 +52,13 @@ extern void * classClone(void *); #define delete(object) classDelete((void **)&(object)) #define clone(object) classClone((void *)(object)) +/** + * With this one we can create a new instance via a + * intermidiary that gets the arguments. + */ +extern void * classNewParams(class_ptr, va_list *); +#define newParams(class,args) classNewParams(_##class, args) + #endif // __CLASS_INTERFACE_CLASS_H__ // vim: set ts=4 sw=4: diff --git a/src/class/interface/i_class.c b/src/class/interface/i_class.c index 196363d..25b1608 100644 --- a/src/class/interface/i_class.c +++ b/src/class/interface/i_class.c @@ -37,18 +37,15 @@ struct interface i_Class = { }; void * -classNew(class_ptr class, ...) +classNewParams(class_ptr class, va_list * params) { void * object = memCalloc(1, class->object_size + sizeof(void*)); - va_list params; int ret; * (class_ptr *)object = class; object += sizeof(void*); - va_start(params, class); - RETCALL(object, Class, ctor, ret, ¶ms); - va_end(params); + RETCALL(object, Class, ctor, ret, params); if (-1 == ret) { classDelete(&object); @@ -57,6 +54,19 @@ classNew(class_ptr class, ...) return object; } +void * +classNew(class_ptr class, ...) +{ + va_list params; + void * object; + + va_start(params, class); + object = classNewParams(class, ¶ms); + va_end(params); + + return object; +} + void classDelete(void ** object) {