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;
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
ctor(void *ptr)
|
ctor(void *ptr, va_list args)
|
||||||
{
|
{
|
||||||
CFWArray *array = ptr;
|
CFWArray *array = ptr;
|
||||||
|
void *obj;
|
||||||
|
|
||||||
array->data = NULL;
|
array->data = NULL;
|
||||||
array->size = 0;
|
array->size = 0;
|
||||||
|
|
||||||
|
while ((obj = va_arg(args, void*)) != NULL)
|
||||||
|
if (!cfw_array_push(array, obj))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -29,11 +29,12 @@
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
typedef struct CFWClass {
|
typedef struct CFWClass {
|
||||||
const char *name;
|
const char *name;
|
||||||
size_t size;
|
size_t size;
|
||||||
void (*ctor)(void*);
|
bool (*ctor)(void*, va_list args);
|
||||||
void (*dtor)(void*);
|
void (*dtor)(void*);
|
||||||
bool (*equal)(void*, void*);
|
bool (*equal)(void*, void*);
|
||||||
void* (*copy)(void*);
|
void* (*copy)(void*);
|
||||||
|
|
15
cfwobject.c
15
cfwobject.c
|
@ -29,7 +29,7 @@
|
||||||
#include "cfwobject.h"
|
#include "cfwobject.h"
|
||||||
|
|
||||||
void*
|
void*
|
||||||
cfw_new(CFWClass *class)
|
cfw_new(CFWClass *class, ...)
|
||||||
{
|
{
|
||||||
CFWObject *obj;
|
CFWObject *obj;
|
||||||
|
|
||||||
|
@ -39,8 +39,17 @@ cfw_new(CFWClass *class)
|
||||||
obj->clsptr = class;
|
obj->clsptr = class;
|
||||||
obj->ref_cnt = 1;
|
obj->ref_cnt = 1;
|
||||||
|
|
||||||
if (class->ctor != NULL)
|
if (class->ctor != NULL) {
|
||||||
class->ctor(obj);
|
va_list args;
|
||||||
|
va_start(args, class);
|
||||||
|
|
||||||
|
if (!class->ctor(obj, args)) {
|
||||||
|
cfw_unref(obj);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ typedef struct CFWObject {
|
||||||
} CFWObject;
|
} CFWObject;
|
||||||
|
|
||||||
extern CFWClass *cfw_object;
|
extern CFWClass *cfw_object;
|
||||||
extern void* cfw_new(CFWClass*);
|
extern void* cfw_new(CFWClass*, ...);
|
||||||
extern void* cfw_ref(void*);
|
extern void* cfw_ref(void*);
|
||||||
extern void cfw_unref(void*);
|
extern void cfw_unref(void*);
|
||||||
extern void cfw_free(void*);
|
extern void cfw_free(void*);
|
||||||
|
|
14
cfwstring.c
14
cfwstring.c
|
@ -36,15 +36,25 @@ struct CFWString {
|
||||||
size_t len;
|
size_t len;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static bool
|
||||||
ctor(void *ptr)
|
ctor(void *ptr, va_list args)
|
||||||
{
|
{
|
||||||
CFWString *str = ptr;
|
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->cstr = NULL;
|
||||||
str->len = 0;
|
str->len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dtor(void *ptr)
|
dtor(void *ptr)
|
||||||
{
|
{
|
||||||
|
|
25
test.c
25
test.c
|
@ -33,30 +33,15 @@
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
|
CFWString *s[3];
|
||||||
CFWArray *a;
|
CFWArray *a;
|
||||||
CFWString *s;
|
|
||||||
size_t i;
|
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++) {
|
a = cfw_new(cfw_array, s[0], s[1], s[2], NULL);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < cfw_array_size(a); i++)
|
for (i = 0; i < cfw_array_size(a); i++)
|
||||||
puts(cfw_string_c(cfw_array_get(a, i)));
|
puts(cfw_string_c(cfw_array_get(a, i)));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue