Commit 0d6e5db80a7adf84b972d8eadd3ba7a2a1c52b99

Authored by Georg Hopp
1 parent 5897c437

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.
... ... @@ -52,6 +52,13 @@ extern void * classClone(void *);
52 52 #define delete(object) classDelete((void **)&(object))
53 53 #define clone(object) classClone((void *)(object))
54 54
  55 +/**
  56 + * With this one we can create a new instance via a
  57 + * intermidiary that gets the arguments.
  58 + */
  59 +extern void * classNewParams(class_ptr, va_list *);
  60 +#define newParams(class,args) classNewParams(_##class, args)
  61 +
55 62 #endif // __CLASS_INTERFACE_CLASS_H__
56 63
57 64 // vim: set ts=4 sw=4:
... ...
... ... @@ -37,18 +37,15 @@ struct interface i_Class = {
37 37 };
38 38
39 39 void *
40   -classNew(class_ptr class, ...)
  40 +classNewParams(class_ptr class, va_list * params)
41 41 {
42 42 void * object = memCalloc(1, class->object_size + sizeof(void*));
43   - va_list params;
44 43 int ret;
45 44
46 45 * (class_ptr *)object = class;
47 46 object += sizeof(void*);
48 47
49   - va_start(params, class);
50   - RETCALL(object, Class, ctor, ret, &params);
51   - va_end(params);
  48 + RETCALL(object, Class, ctor, ret, params);
52 49
53 50 if (-1 == ret) {
54 51 classDelete(&object);
... ... @@ -57,6 +54,19 @@ classNew(class_ptr class, ...)
57 54 return object;
58 55 }
59 56
  57 +void *
  58 +classNew(class_ptr class, ...)
  59 +{
  60 + va_list params;
  61 + void * object;
  62 +
  63 + va_start(params, class);
  64 + object = classNewParams(class, &params);
  65 + va_end(params);
  66 +
  67 + return object;
  68 +}
  69 +
60 70 void
61 71 classDelete(void ** object)
62 72 {
... ...
Please register or login to post a comment