cfw_new() takes parameters now.
This commit is contained in:
parent
8603645700
commit
a9e4c2a8d9
6 changed files with 43 additions and 31 deletions
11
cfwarray.c
11
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
|
||||
|
|
|
@ -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*);
|
||||
|
|
15
cfwobject.c
15
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;
|
||||
}
|
||||
|
|
|
@ -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*);
|
||||
|
|
14
cfwstring.c
14
cfwstring.c
|
@ -36,15 +36,25 @@ 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*);
|
||||
|
||||
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
|
||||
dtor(void *ptr)
|
||||
{
|
||||
|
|
25
test.c
25
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)));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue