cfw_new() takes parameters now.

This commit is contained in:
Jonathan Schleifer 2012-04-08 19:32:57 +02:00
parent 8603645700
commit a9e4c2a8d9
6 changed files with 43 additions and 31 deletions

View file

@ -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

View file

@ -29,11 +29,12 @@
#include <stddef.h>
#include <stdbool.h>
#include <stdarg.h>
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*);

View file

@ -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;
}

View file

@ -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*);

View file

@ -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

25
test.c
View file

@ -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)));