From 2dd30f478e1d537bf252bddf7c8843b97d0c98dc Mon Sep 17 00:00:00 2001 From: overflowerror Date: Tue, 7 Mar 2017 23:52:11 +0100 Subject: [PATCH] first version --- oop/Makefile | 30 ++++++++++++++++ oop/example.c | 46 ++++++++++++++++++++++++ oop/oop.c | 47 +++++++++++++++++++++++++ oop/oop.h | 44 +++++++++++++++++++++++ strbuilder/Makefile | 34 ++++++++++++++++++ strbuilder/example | Bin 0 -> 18472 bytes strbuilder/example.c | 20 +++++++++++ strbuilder/strbuilder.c | 75 ++++++++++++++++++++++++++++++++++++++++ strbuilder/strbuilder.h | 26 ++++++++++++++ 9 files changed, 322 insertions(+) create mode 100644 oop/Makefile create mode 100644 oop/example.c create mode 100644 oop/oop.c create mode 100644 oop/oop.h create mode 100644 strbuilder/Makefile create mode 100755 strbuilder/example create mode 100644 strbuilder/example.c create mode 100644 strbuilder/strbuilder.c create mode 100644 strbuilder/strbuilder.h diff --git a/oop/Makefile b/oop/Makefile new file mode 100644 index 0000000..1c99336 --- /dev/null +++ b/oop/Makefile @@ -0,0 +1,30 @@ +# +# Makefile for crap-libs/oop +# +# Author: overflowerror +# + +CC = gcc +DEFS = -D_XOPEN_SOURCE=500 -D_BSD_SOURCE +CFLAGS = -Wall -Wextra -g -std=c99 -pedantic -DENDEBUG $(DEFS) -fPIC +LDFLAGS = $(DEFS) +LIBFLAGS = -shared $(DEFS) + +.PHONY: all clean + +all: example liboop.so + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +example: example.o oop.o + $(CC) $(LDFLAGS) -o $@ $^ + +liboop.so: oop.o + $(CC) $(LIBFLAGS) -o $@ $^ + +oop.o: oop.c oop.h +example.o: example.c oop.h + +clean: + rm -f *.o example liboop.so diff --git a/oop/example.c b/oop/example.c new file mode 100644 index 0000000..0d0ea8a --- /dev/null +++ b/oop/example.c @@ -0,0 +1,46 @@ +#include +#include + +#include "oop.h" + +#define test construct(test) + +class_t test_class; + +__attribute__ ((constructor)) +static void add_test_class(void) { + test_class.id = new_class("test", NO_SUPER_CLASS, true); +} + +typedef struct test { + meta_object_t meta; + void (*destruct)(struct test*); + const char* string; + void (*print)(struct test*); +} test_t; + +void test_method_print(test_t* this) { + printf("%s\n", this->string); +} +void test_method_destruct(test_t* this) { + free(this); +} + +test_t* test_method_construct(const char* string) { + test_t* obj = malloc(sizeof(test_t)); + obj->string = string; + obj->destruct = test_method_destruct; + obj->print = test_method_print; + + return obj; +} + +int main(void) { + test_t* obj = new test("Hallo Welt"); + + obj->print(obj); + + obj->destruct(obj); + + return 0; +} diff --git a/oop/oop.c b/oop/oop.c new file mode 100644 index 0000000..eb2e2f3 --- /dev/null +++ b/oop/oop.c @@ -0,0 +1,47 @@ +#include "oop.h" + +#include + +class_id_t class_ids = 0; + +meta_class_t classes[MAX_CLASSES]; + +class_id_t new_class(const char* name, class_id_t super, bool instanceable) { + classes[class_ids] = (meta_class_t) { + .name = name, + .super = super, + .instanceable = instanceable + }; + return class_ids++; +} + +bool instance_of_id(void* object, class_id_t id) { + if (sizeof (object) < sizeof (object_t)) + return false; // not an object + object_t* obj = (object_t*) object; + return obj->meta_obj.class.id == id; +} + +bool instance_of(void* object, class_t class) { + return instance_of_id(object, class.id); +} + +const char* get_class_name_by_id(class_id_t id) { + return classes[id].name; +} + +const char* get_class_name(class_t class) { + return get_class_name_by_id(class.id); +} + +class_id_t id_from_name(const char* class_name) { + for (int i = 0; i < class_ids; i++) { + if (strcmp(class_name, classes[i].name) == 0) + return i; + } + return NO_CLASS; +} + +bool class_exists(const char* class_name) { + return id_from_name(class_name) != NO_CLASS; +} diff --git a/oop/oop.h b/oop/oop.h new file mode 100644 index 0000000..74db9b1 --- /dev/null +++ b/oop/oop.h @@ -0,0 +1,44 @@ +#ifndef OOP_H +#define OOP_H + +#include +#include + +#define construct(name) name ##_method_construct + +#define call(obj, method) (obj)->method((obj)) +#define new + +#define MAX_CLASSES 1024 +#define NO_SUPER_CLASS -1 +#define NO_CLASS -1 + +typedef int class_id_t; + +typedef struct meta_class { + const char* name; + class_id_t super; + bool instanceable; +} meta_class_t; + +typedef struct class { + class_id_t id; +} class_t; + +typedef struct meta_object { + class_t class; +} meta_object_t; + +typedef struct object { + meta_object_t meta_obj; + void (*destruct)(struct object*); +} object_t; + +class_id_t new_class(const char*, class_id_t, bool); +bool instance_of_id(void*, class_id_t); +bool instance_of(void*, class_t); +const char* get_class_name(class_t); +class_id_t id_from_name(const char*); +bool class_exists(const char*); + +#endif diff --git a/strbuilder/Makefile b/strbuilder/Makefile new file mode 100644 index 0000000..64e3d82 --- /dev/null +++ b/strbuilder/Makefile @@ -0,0 +1,34 @@ +# +# Makefile for crap-libs/strbuilder +# +# Author: overflowerror +# + +CC = gcc +DEFS = -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -B "../oop/" +CFLAGS = -Wall -Wextra -g -std=c99 -pedantic -DENDEBUG $(DEFS) -fPIC +LDFLAGS = $(DEFS) +LIBFLAGS = -shared $(DEFS) + +.PHONY: all clean + +all: example libstrbuilder.so + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +example: example.o strbuilder.o ../oop/liboop.so + $(CC) $(LDFLAGS) -o $@ $^ + +../oop/liboop.so: + cd ../oop/ && $(MAKE) liboop.so + +libstrbuilder.so: strbuilder.o + $(CC) $(LIBFLAGS) -o $@ $^ + +strbuilder.o: strbuilder.c strbuilder.h +example.o: example.c strbuilder.h + +clean: + rm -f *.o example libstrbuilder.so + cd ../oop/ && $(MAKE) clean diff --git a/strbuilder/example b/strbuilder/example new file mode 100755 index 0000000000000000000000000000000000000000..2c4b919cc974e6a6c399b52f9036b493a6e027ad GIT binary patch literal 18472 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 literal 0 HcmV?d00001 diff --git a/strbuilder/example.c b/strbuilder/example.c new file mode 100644 index 0000000..ea68544 --- /dev/null +++ b/strbuilder/example.c @@ -0,0 +1,20 @@ +#include +#include + +#include "../oop/oop.h" +#include "strbuilder.h" + +int main(void) { + strbuilder_t* builder = new strbuilder("Hallo"); + + builder->add(builder, " Welt"); + builder->add(builder, "!"); + builder->build(builder); + + const char* string = builder->get(builder); + printf("%s\n", string); + + builder->destruct(builder); + + return 0; +} diff --git a/strbuilder/strbuilder.c b/strbuilder/strbuilder.c new file mode 100644 index 0000000..fa2064b --- /dev/null +++ b/strbuilder/strbuilder.c @@ -0,0 +1,75 @@ +#include "strbuilder.h" +#include +#include +#include + +class_t strbuilder_class; + +__attribute__ ((constructor)) +static void add_strbuilder_class(void) { + strbuilder_class.id = new_class("strbuilder", NO_SUPER_CLASS, true); +} + +void strbuilder_method_clear(strbuilder_t* this) { + for (int i = 0; i < this->nrstrings; i++) { + free(this->strings[i]); + } + free(this->string); + this->string = NULL; + this->nrstrings = 0; +} + +void strbuilder_method_destruct(strbuilder_t* this) { + this->clear(this); + free(this); +} + +void strbuilder_method_add(strbuilder_t* this, const char* string) { + this->strings = realloc(this->strings, ++this->nrstrings * sizeof(char*)); + this->strings[this->nrstrings - 1] = malloc(strlen(string) + 1); + strcpy(this->strings[this->nrstrings - 1], string); +} + +size_t strbuilder_method_length(strbuilder_t* this) { + size_t length = 0; + if (this->string != NULL) + length = strlen(this->string); + for (int i = 0; i < this->nrstrings; i++) { + length += strlen(this->strings[i]); + } + return length; +} + +void strbuilder_method_build(strbuilder_t* this) { + size_t length = this->length(this); + bool empty = this->string == NULL; + this->string = realloc(this->string, length + 1); + if (empty) + this->string[0] = '\0'; + for (int i = 0; i < this->nrstrings; i++) { + strcat(this->string, this->strings[i]); + free(this->strings[i]); + } + this->nrstrings = 0; +} + +const char* strbuilder_method_get(strbuilder_t* this) { + return this->string; +} + +strbuilder_t* strbuilder_method_construct(const char* string) { + strbuilder_t* obj = malloc(sizeof(strbuilder_t)); + obj->string = malloc(strlen(string) + 1); + strcpy(obj->string, string); + obj->strings = NULL; + obj->nrstrings = 0; + + obj->destruct = strbuilder_method_destruct; + obj->add = strbuilder_method_add; + obj->build = strbuilder_method_build; + obj->get = strbuilder_method_get; + obj->clear = strbuilder_method_clear; + obj->length = strbuilder_method_length; + + return obj; +} diff --git a/strbuilder/strbuilder.h b/strbuilder/strbuilder.h new file mode 100644 index 0000000..b05a76b --- /dev/null +++ b/strbuilder/strbuilder.h @@ -0,0 +1,26 @@ +#ifndef STRBUILDER_H +#define STRBUILDER_H + +#include +#include "../oop/oop.h" + +#define strbuilder construct(strbuilder) + +extern class_t strbuilder_class; + +typedef struct strbuilder { + meta_object_t meta; + void (*destruct)(struct strbuilder*); + void (*add)(struct strbuilder*, const char*); + void (*build)(struct strbuilder*); + const char* (*get)(struct strbuilder*); + void (*clear)(struct strbuilder*); + size_t (*length)(struct strbuilder*); + char* string; + char** strings; + int nrstrings; +} strbuilder_t; + +strbuilder_t* strbuilder_method_construct(const char*); + +#endif