From ff54f0e5cdeca9df3dd7fffd87b9e51266bf7944 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 20:45:41 +0200 Subject: [PATCH 1/8] New array functions. * cfw_array_contains() * cfw_array_contains_ptr() * cfw_array_find() * cfw_array_find_ptr() --- src/cfwarray.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/cfwarray.h | 4 ++++ 2 files changed, 53 insertions(+) diff --git a/src/cfwarray.c b/src/cfwarray.c index 869559f..86d0368 100644 --- a/src/cfwarray.c +++ b/src/cfwarray.c @@ -25,6 +25,7 @@ */ #include +#include #include "cfwobject.h" #include "cfwarray.h" @@ -203,6 +204,54 @@ cfw_array_pop(CFWArray *array) return true; } +bool +cfw_array_contains(CFWArray *array, void *ptr) +{ + size_t i; + + for (i = 0; i < array->size; i++) + if (cfw_equal(array->data[i], ptr)) + return true; + + return false; +} + +bool +cfw_array_contains_ptr(CFWArray *array, void *ptr) +{ + size_t i; + + for (i = 0; i < array->size; i++) + if (array->data[i] == ptr) + return true; + + return false; +} + +size_t +cfw_array_find(CFWArray *array, void *ptr) +{ + size_t i; + + for (i = 0; i < array->size; i++) + if (cfw_equal(array->data[i], ptr)) + return i; + + return SIZE_MAX; +} + +size_t +cfw_array_find_ptr(CFWArray *array, void *ptr) +{ + size_t i; + + for (i = 0; i < array->size; i++) + if (array->data[i] == ptr) + return i; + + return SIZE_MAX; +} + static CFWClass class = { .name = "CFWArray", .size = sizeof(CFWArray), diff --git a/src/cfwarray.h b/src/cfwarray.h index 66af963..40f25ec 100644 --- a/src/cfwarray.h +++ b/src/cfwarray.h @@ -37,5 +37,9 @@ extern bool cfw_array_set(CFWArray*, size_t, void*); extern bool cfw_array_push(CFWArray*, void*); extern void* cfw_array_last(CFWArray*); extern bool cfw_array_pop(CFWArray*); +extern bool cfw_array_contains(CFWArray*, void*); +extern bool cfw_array_contains_ptr(CFWArray*, void*); +extern size_t cfw_array_find(CFWArray*, void*); +extern size_t cfw_array_find_ptr(CFWArray*, void*); #endif From 405ecc9c7346a8f3deb1e51bc31baa3bc19757f8 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:02:11 +0200 Subject: [PATCH 2/8] Install includes. --- configure.ac | 2 +- src/Makefile | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 911b868..02451bf 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT(CoreFW, 0.1, js@webkeks.org) +AC_INIT(corefw, 0.1, js@webkeks.org) AC_CONFIG_SRCDIR(src) AC_CANONICAL_HOST diff --git a/src/Makefile b/src/Makefile index dbbdc7d..1811477 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,4 +7,7 @@ SRCS = cfwarray.c \ cfwobject.c \ cfwstring.c +INCLUDES = ${SRCS:.c=.h} \ + cfwclass.h + include ../buildsys.mk From 794d352d331412be96e1f6c0975e4c9c662c0c1d Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:05:46 +0200 Subject: [PATCH 3/8] Add cfw_class_name(). --- src/Makefile | 4 ++-- src/cfwclass.c | 33 +++++++++++++++++++++++++++++++++ src/cfwclass.h | 2 ++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/cfwclass.c diff --git a/src/Makefile b/src/Makefile index 1811477..d3cb9a8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,10 +4,10 @@ LIB_MAJOR = 0 LIB_MINOR = 0 SRCS = cfwarray.c \ + cfwclass.c \ cfwobject.c \ cfwstring.c -INCLUDES = ${SRCS:.c=.h} \ - cfwclass.h +INCLUDES = ${SRCS:.c=.h} include ../buildsys.mk diff --git a/src/cfwclass.c b/src/cfwclass.c new file mode 100644 index 0000000..af34bca --- /dev/null +++ b/src/cfwclass.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2012, Jonathan Schleifer + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "cfwclass.h" + +const char* +cfw_class_name(CFWClass *cls) +{ + return cls->name; +} diff --git a/src/cfwclass.h b/src/cfwclass.h index 95a56f4..7b6c9fc 100644 --- a/src/cfwclass.h +++ b/src/cfwclass.h @@ -40,4 +40,6 @@ typedef struct CFWClass { void* (*copy)(void*); } CFWClass; +extern const char* cfw_class_name(CFWClass*); + #endif From 1b72ec95bfb99064aa2d6a0bd22930be56d45774 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:06:46 +0200 Subject: [PATCH 4/8] clsptr -> cls. --- src/cfwarray.c | 2 +- src/cfwobject.c | 14 +++++++------- src/cfwobject.h | 2 +- src/cfwstring.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cfwarray.c b/src/cfwarray.c index 86d0368..cd45b8f 100644 --- a/src/cfwarray.c +++ b/src/cfwarray.c @@ -72,7 +72,7 @@ equal(void *ptr1, void *ptr2) CFWArray *array1, *array2; size_t i; - if (obj2->clsptr != cfw_array) + if (obj2->cls != cfw_array) return false; array1 = ptr1; diff --git a/src/cfwobject.c b/src/cfwobject.c index d18df57..76e5486 100644 --- a/src/cfwobject.c +++ b/src/cfwobject.c @@ -36,7 +36,7 @@ cfw_new(CFWClass *class, ...) if ((obj = malloc(class->size)) == NULL) return NULL; - obj->clsptr = class; + obj->cls = class; obj->ref_cnt = 1; if (class->ctor != NULL) { @@ -78,8 +78,8 @@ cfw_free(void *ptr) { CFWObject *obj = ptr; - if (obj->clsptr->dtor != NULL) - obj->clsptr->dtor(obj); + if (obj->cls->dtor != NULL) + obj->cls->dtor(obj); free(obj); } @@ -89,8 +89,8 @@ cfw_equal(void *ptr1, void *ptr2) { CFWObject *obj1 = ptr1, *obj2 = ptr2; - if (obj1->clsptr->equal != NULL) { - return obj1->clsptr->equal(obj1, obj2); + if (obj1->cls->equal != NULL) { + return obj1->cls->equal(obj1, obj2); } else return (obj1 == obj2); } @@ -100,8 +100,8 @@ cfw_copy(void *ptr) { CFWObject *obj = ptr; - if (obj->clsptr->copy != NULL) - return obj->clsptr->copy(obj); + if (obj->cls->copy != NULL) + return obj->cls->copy(obj); else return NULL; } diff --git a/src/cfwobject.h b/src/cfwobject.h index 58054d8..1b8597a 100644 --- a/src/cfwobject.h +++ b/src/cfwobject.h @@ -30,7 +30,7 @@ #include "cfwclass.h" typedef struct CFWObject { - CFWClass *clsptr; + CFWClass *cls; int ref_cnt; } CFWObject; diff --git a/src/cfwstring.c b/src/cfwstring.c index bbfb8fd..1c913ed 100644 --- a/src/cfwstring.c +++ b/src/cfwstring.c @@ -70,7 +70,7 @@ equal(void *ptr1, void *ptr2) CFWObject *obj2 = ptr2; CFWString *str1, *str2; - if (obj2->clsptr != cfw_string) + if (obj2->cls != cfw_string) return false; str1 = ptr1; From effaa94ab75889f437828559430ad8e3144eef1c Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:12:05 +0200 Subject: [PATCH 5/8] Add corefw.h. --- src/Makefile | 3 ++- src/corefw.h | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/corefw.h diff --git a/src/Makefile b/src/Makefile index d3cb9a8..9b653d8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,6 +8,7 @@ SRCS = cfwarray.c \ cfwobject.c \ cfwstring.c -INCLUDES = ${SRCS:.c=.h} +INCLUDES = ${SRCS:.c=.h} \ + corefw.h include ../buildsys.mk diff --git a/src/corefw.h b/src/corefw.h new file mode 100644 index 0000000..fdda80a --- /dev/null +++ b/src/corefw.h @@ -0,0 +1,9 @@ +#ifndef __COREFW_H__ +#define __COREFW_H__ + +#include "cfwclass.h" +#include "cfwobject.h" +#include "cfwstring.h" +#include "cfwarray.h" + +#endif From d957ec53eaed5548ef1b6ab378ac4aa483394ec3 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:16:01 +0200 Subject: [PATCH 6/8] Add -Wall. --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 02451bf..b14fe8e 100644 --- a/configure.ac +++ b/configure.ac @@ -10,6 +10,8 @@ AC_PROG_RANLIB AC_PROG_LN_S AC_PROG_INSTALL +CFLAGS="$CFLAGS -Wall" + BUILDSYS_SHARED_LIB BUILDSYS_INIT BUILDSYS_TOUCH_DEPS From 09158745058fced74e34ab2c574a7cad6f6ce999 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:19:56 +0200 Subject: [PATCH 7/8] Add cfw_string_append(). --- src/cfwstring.c | 17 +++++++++++++++++ src/cfwstring.h | 1 + tests/tests.c | 16 ++++++++++++++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/cfwstring.c b/src/cfwstring.c index 1c913ed..239b343 100644 --- a/src/cfwstring.c +++ b/src/cfwstring.c @@ -131,6 +131,23 @@ cfw_string_set(CFWString *str, const char *cstr) return true; } +bool +cfw_string_append(CFWString *str, CFWString *append) +{ + char *new; + + if ((new = realloc(str->cstr, str->len + append->len + 1)) == NULL) + return false; + + memcpy(new + str->len, append->cstr, append->len); + new[str->len + append->len] = 0; + + str->cstr = new; + str->len += append->len; + + return true; +} + static CFWClass class = { .name = "CFWString", .size = sizeof(CFWString), diff --git a/src/cfwstring.h b/src/cfwstring.h index 9424334..6572f28 100644 --- a/src/cfwstring.h +++ b/src/cfwstring.h @@ -34,5 +34,6 @@ extern CFWClass *cfw_string; extern const char* cfw_string_c(CFWString*); extern size_t cfw_string_len(CFWString*); extern bool cfw_string_set(CFWString*, const char*); +extern bool cfw_string_append(CFWString*, CFWString*); #endif diff --git a/tests/tests.c b/tests/tests.c index efcb511..6962553 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -38,13 +38,25 @@ main() size_t i; s[0] = cfw_new(cfw_string, "Hallo"); - s[1] = cfw_new(cfw_string, "Welt"); + s[1] = cfw_new(cfw_string, " Welt"); s[2] = cfw_new(cfw_string, "!"); a = cfw_new(cfw_array, s[0], s[1], s[2], NULL); + cfw_unref(s[0]); + cfw_unref(s[1]); + cfw_unref(s[2]); + + s[0] = cfw_new(cfw_string, NULL); + for (i = 0; i < cfw_array_size(a); i++) - puts(cfw_string_c(cfw_array_get(a, i))); + cfw_string_append(s[0], cfw_array_get(a, i)); + + cfw_unref(a); + + puts(cfw_string_c(s[0])); + + cfw_unref(s[0]); return 0; } From 5151647e66fbdfb7c555a7e3338374fe75e764b6 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sun, 8 Apr 2012 21:21:32 +0200 Subject: [PATCH 8/8] cstr -> data. --- src/cfwstring.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/cfwstring.c b/src/cfwstring.c index 239b343..f0ce883 100644 --- a/src/cfwstring.c +++ b/src/cfwstring.c @@ -32,7 +32,7 @@ struct CFWString { CFWObject obj; - char *cstr; + char *data; size_t len; }; @@ -43,12 +43,12 @@ ctor(void *ptr, va_list args) const char *cstr = va_arg(args, const char*); if (cstr != NULL) { - if ((str->cstr = strdup(cstr)) == NULL) + if ((str->data = strdup(cstr)) == NULL) return false; str->len = strlen(cstr); } else { - str->cstr = NULL; + str->data = NULL; str->len = 0; } @@ -60,8 +60,8 @@ dtor(void *ptr) { CFWString *str = ptr; - if (str->cstr != NULL) - free(str->cstr); + if (str->data != NULL) + free(str->data); } static bool @@ -79,7 +79,7 @@ equal(void *ptr1, void *ptr2) if (str1->len != str2->len) return false; - return !strcmp(str1->cstr, str2->cstr); + return !memcmp(str1->data, str2->data, str1->len); } static void* @@ -91,21 +91,21 @@ copy(void *ptr) if ((new = cfw_new(cfw_string)) == NULL) return NULL; - if ((new->cstr = malloc(str->len + 1)) == NULL) { + if ((new->data = malloc(str->len + 1)) == NULL) { cfw_unref(new); return NULL; } new->len = str->len; - memcpy(new->cstr, str->cstr, str->len + 1); + memcpy(new->data, str->data, str->len + 1); return new; } const char* -cfw_string_c(CFWString *string) +cfw_string_c(CFWString *str) { - return string->cstr; + return str->data; } size_t @@ -122,10 +122,10 @@ cfw_string_set(CFWString *str, const char *cstr) if ((copy = strdup(cstr)) == NULL) return false; - if (str->cstr != NULL) - free(str->cstr); + if (str->data != NULL) + free(str->data); - str->cstr = copy; + str->data = copy; str->len = strlen(copy); return true; @@ -136,13 +136,13 @@ cfw_string_append(CFWString *str, CFWString *append) { char *new; - if ((new = realloc(str->cstr, str->len + append->len + 1)) == NULL) + if ((new = realloc(str->data, str->len + append->len + 1)) == NULL) return false; - memcpy(new + str->len, append->cstr, append->len); + memcpy(new + str->len, append->data, append->len); new[str->len + append->len] = 0; - str->cstr = new; + str->data = new; str->len += append->len; return true;