mirror of
https://github.com/sigmasternchen/crap-libs
synced 2025-03-14 23:28:55 +00:00
new directory structure + new allocation method
This commit is contained in:
parent
c09f20d06b
commit
fe1db529a2
22 changed files with 107 additions and 301 deletions
33
Makefile
Normal file
33
Makefile
Normal file
|
@ -0,0 +1,33 @@
|
|||
#
|
||||
# Makefile for crap-libs
|
||||
#
|
||||
# Author: overflowerror
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
DEFS = -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
|
||||
CFLAGS = -Wall -Wextra -g -std=c99 -DENDEBUG $(DEFS) -fPIC
|
||||
LDFLAGS = $(DEFS) -rdynamic
|
||||
LIBFLAGS = -shared $(DEFS)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: libcrap.so
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
example: example.o memory.o try.o oop.o exceptions/stdex.o
|
||||
$(CC) $(LDFLAGS) -o $@ $^
|
||||
|
||||
libcrap.so: memory.o try.o oop.o exceptions/stdex.o
|
||||
$(CC) $(LIBFLAGS) -o $@ $^
|
||||
|
||||
example.o: example.c try.h
|
||||
memory.o: memory.c memory.h oop.h exceptions/stdex.h
|
||||
try.o: try.c try.h oop.h exceptions/stdex.h
|
||||
oop.o: oop.h misc.h
|
||||
exceptions/stdex.o: exceptions/stdex.c exceptions/stdex.h
|
||||
|
||||
clean:
|
||||
rm -f *.o exceptions/*.o example
|
5
crap.h
Normal file
5
crap.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include "oop.h"
|
||||
#include "try.h"
|
||||
#include "memory.h"
|
||||
#include "exceptions/stdex.h"
|
||||
#include "misc.h"
|
6
example.c
Normal file
6
example.c
Normal file
|
@ -0,0 +1,6 @@
|
|||
#include "crap.h"
|
||||
|
||||
int main(void) {
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,6 +1,10 @@
|
|||
#include "exceptions.h"
|
||||
#include "stdex.h"
|
||||
#include "../memory.h"
|
||||
#include "../try.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
class_t Exception_class;
|
||||
void method(Exception, destruct)(Exception_t* this) {
|
||||
|
@ -12,7 +16,9 @@ void method(Exception, populate)(Exception_t* obj, class_t c) {
|
|||
add_method(obj, Exception, destruct);
|
||||
}
|
||||
Exception_t* method(Exception, construct)(const char* msg) {
|
||||
Exception_t* obj = malloc(sizeof(Exception_t));
|
||||
throws(OutOfMemoryException_t);
|
||||
|
||||
sr_(Exception_t* obj = allocate_object(Exception_t), NULL);
|
||||
populate(Exception)(obj, Exception_class);
|
||||
|
||||
obj->msg = msg;
|
||||
|
@ -28,10 +34,14 @@ void method(NullPointerException, destruct)(NullPointerException_t* this) {
|
|||
void method(NullPointerException, populate)(NullPointerException_t* obj, class_t c) {
|
||||
populate(Exception)((Exception_t*) obj, c);
|
||||
|
||||
obj->super.msg = "Unexpected Null-pointer.";
|
||||
|
||||
add_method(obj, NullPointerException, destruct);
|
||||
}
|
||||
NullPointerException_t* method(NullPointerException, construct)() {
|
||||
NullPointerException_t* obj = malloc(sizeof(Exception_t));
|
||||
throws(OutOfMemoryException_t);
|
||||
|
||||
sr_(NullPointerException_t* obj = allocate_object(NullPointerException_t), NULL);
|
||||
populate(NullPointerException)(obj, NullPointerException_class);
|
||||
|
||||
return obj;
|
||||
|
@ -45,10 +55,17 @@ void method(OutOfMemoryException, destruct)(OutOfMemoryException_t* this) {
|
|||
void method(OutOfMemoryException, populate)(OutOfMemoryException_t* obj, class_t c) {
|
||||
populate(Exception)((Exception_t*) obj, c);
|
||||
|
||||
obj->super.msg = "Could not allocate memory.";
|
||||
|
||||
add_method(obj, OutOfMemoryException, destruct);
|
||||
}
|
||||
OutOfMemoryException_t* method(OutOfMemoryException, construct)() {
|
||||
OutOfMemoryException_t* obj = malloc(sizeof(Exception_t));
|
||||
OutOfMemoryException_t* obj = malloc(sizeof(OutOfMemoryException_t));
|
||||
if (obj == NULL) {
|
||||
fprintf(stderr, "\nCritical error! Can not allocate memory for OutOfMemoryException: %s\n", strerror(errno));
|
||||
_print_backtrace(stderr, 1);
|
||||
}
|
||||
|
||||
populate(OutOfMemoryException)(obj, OutOfMemoryException_class);
|
||||
|
||||
return obj;
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef EXCEPTIONS_H
|
||||
#define EXCEPTIONS_H
|
||||
#ifndef STDEX_H
|
||||
#define STDEX_H
|
||||
|
||||
#include "../../oop/oop.h"
|
||||
#include "../oop.h"
|
||||
|
||||
#define Exception construct(Exception)
|
||||
extern class(Exception, Object_class, NO_INTERFACES, true) {
|
|
@ -1,6 +1,6 @@
|
|||
#include "memory.h"
|
||||
#include "../try/try.h"
|
||||
#include "../try/exceptions/exceptions.h"
|
||||
#include "try.h"
|
||||
#include "exceptions/stdex.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
@ -14,7 +14,7 @@ void allocate_sub(size_t size, void** ptr) { throws(Exception_t);
|
|||
|
||||
void* allocate(size_t size) { throws(Exception_t);
|
||||
void* ptr;
|
||||
s_(allocate_sub(size, &ptr));
|
||||
sr_(allocate_sub(size, &ptr), NULL);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
@ -27,13 +27,13 @@ void reallocate_sub(size_t size, void** ptr, void* old) { throws(Exception_t);
|
|||
|
||||
void* reallocate(void* old, size_t size) { throws(Exception_t);
|
||||
void* ptr;
|
||||
s_(reallocate_sub(size, &ptr, old));
|
||||
sr_(reallocate_sub(size, &ptr, old), NULL);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* clone(const void* org, size_t size) { throws(Exception_t);
|
||||
void* ptr;
|
||||
s_(allocate_sub(size, &ptr));
|
||||
sr_(allocate_sub(size, &ptr), NULL);
|
||||
memcpy(ptr, org, size);
|
||||
return ptr;
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
#
|
||||
# Makefile for crap-libs/memory
|
||||
#
|
||||
# Author: overflowerror
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
DEFS = -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -B "../try/" -B "../oop/"
|
||||
CFLAGS = -Wall -Wextra -g -std=c99 -pedantic -DENDEBUG $(DEFS) -fPIC
|
||||
LDFLAGS = $(DEFS)
|
||||
LIBFLAGS = -shared $(DEFS)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: example libmemory.so
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
example: example.o memory.o ../try/libtry.so ../oop/liboop.so
|
||||
$(CC) $(LDFLAGS) -o $@ $^
|
||||
|
||||
libmemory.so: memory.o ../try/libtry.so ../oop/liboop.so
|
||||
$(CC) $(LIBFLAGS) -o $@ $^
|
||||
|
||||
memory.o: memory.c memory.h
|
||||
example.o: example.c memory.h
|
||||
|
||||
../try/libtry.so:
|
||||
cd ../try/ && $(MAKE) libtry.so
|
||||
|
||||
../oop/liboop.so:
|
||||
cd ../oop/ && $(MAKE) liboop.so
|
||||
|
||||
clean:
|
||||
rm -f *.o example libmemory.so
|
||||
cd ../try/ && $(MAKE) clean
|
||||
cd ../oop/ && $(MAKE) clean
|
|
@ -1,20 +0,0 @@
|
|||
#include "memory.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
|
||||
const char* str = "Hallo Welt";
|
||||
|
||||
char* tmp = clone_string(str);
|
||||
|
||||
printf("%s\n", tmp);
|
||||
|
||||
free(tmp);
|
||||
|
||||
tmp = allocate((size_t) 1 << 63);
|
||||
|
||||
free(tmp);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef UNUSED_H
|
||||
#define UNUSED_H
|
||||
#ifndef MISC_H
|
||||
#define MISC_H
|
||||
|
||||
#define UNUSED(v) (v = v);
|
||||
|
|
@ -1,4 +1,7 @@
|
|||
#include "oop.h"
|
||||
#include "memory.h"
|
||||
#include "try.h"
|
||||
#include "exceptions/stdex.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -99,8 +102,8 @@ void method(Object, destruct)(Object_t* obj) {
|
|||
free(obj);
|
||||
}
|
||||
|
||||
Object_t* method(Object, construct)() {
|
||||
Object_t* obj = malloc(sizeof(Object_t));
|
||||
Object_t* method(Object, construct)() { throws(OutOfMemoryException_t);
|
||||
sr_(Object_t* obj = allocate_object(Object_t), NULL);
|
||||
populate(Object)(obj, Object_class);
|
||||
return obj;
|
||||
}
|
30
oop/Makefile
30
oop/Makefile
|
@ -1,30 +0,0 @@
|
|||
#
|
||||
# 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
|
|
@ -1,68 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "oop.h"
|
||||
|
||||
#define Test construct(Test)
|
||||
|
||||
class(Test, Object_class, (interfaces){1 namely {Cloneable_class}}, true) {
|
||||
extends(Object_t);
|
||||
implements(Cloneable);
|
||||
|
||||
const char* string;
|
||||
|
||||
void (*print)(defclass Test*);
|
||||
void (*destruct)(defclass Test*);
|
||||
} Test_t;
|
||||
|
||||
void method(Test, print)(Test_t*);
|
||||
void method(Test, destruct)(Test_t*);
|
||||
void* method(Test, clone)(void*);
|
||||
void method(Test, populate)(Test_t*, class_t);
|
||||
Test_t* method(Test, construct)(const char*);
|
||||
|
||||
|
||||
void method(Test, print)(Test_t* this) {
|
||||
printf("%s\n", this->string);
|
||||
}
|
||||
void method(Test, destruct)(Test_t* this) {
|
||||
this->super.destruct((Object_t*) this);
|
||||
}
|
||||
|
||||
void* method(Test, clone)(void* obj) { // parameter void* because of interface
|
||||
Test_t* test = new Test("");
|
||||
test->string = ((Test_t*) obj)->string;
|
||||
return (void*) test;
|
||||
}
|
||||
|
||||
void method(Test, populate)(Test_t* obj, class_t c) {
|
||||
populate(Object)((Object_t*) obj, c);
|
||||
|
||||
add_method(obj, Test, destruct);
|
||||
add_method(obj, Test, print);
|
||||
add_method(obj, Test, clone);
|
||||
}
|
||||
|
||||
Test_t* method(Test, construct)(const char* string) {
|
||||
Test_t* obj = malloc(sizeof(Test_t));
|
||||
populate(Test)(obj, Test_class);
|
||||
|
||||
obj->string = string;
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
Test_t* obj = new Test("Hallo Welt");
|
||||
|
||||
class_t c = oop_get_class_from_obj((Object_t*) obj);
|
||||
printf("class: %s\n", oop_get_class_name(c));
|
||||
printf("superclass: %s\n", oop_get_class_name(oop_get_super_class(c)));
|
||||
printf("instanceof Test: %i\n", instanceof(obj, Test_class));
|
||||
printf("instanceof Object: %i\n", instanceof(obj, Object_class));
|
||||
printf("instanceof Cloneable: %i\n", instanceof(obj, Cloneable_class));
|
||||
|
||||
obj->print(obj);
|
||||
obj->destruct(obj);
|
||||
return 0;
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
#
|
||||
# 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
|
|
@ -1,20 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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;
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
#include "strbuilder.h"
|
||||
#include "../memory.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
class_t Strbuilder_class;
|
||||
|
@ -20,8 +21,10 @@ void method(Strbuilder, destruct)(Strbuilder_t* this) {
|
|||
}
|
||||
|
||||
void method(Strbuilder, 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);
|
||||
throws(OutOfMemoryException_t);
|
||||
|
||||
s_(this->strings = reallocate(this->strings, ++this->nrstrings * sizeof(char*)));
|
||||
s_(this->strings[this->nrstrings - 1] = allocate(strlen(string) + 1));
|
||||
strcpy(this->strings[this->nrstrings - 1], string);
|
||||
}
|
||||
|
||||
|
@ -36,9 +39,11 @@ size_t method(Strbuilder, length)(Strbuilder_t* this) {
|
|||
}
|
||||
|
||||
void method(Strbuilder, build)(Strbuilder_t* this) {
|
||||
throws(OutOfMemoryException_t);
|
||||
|
||||
size_t length = this->length(this);
|
||||
bool empty = this->string == NULL;
|
||||
this->string = realloc(this->string, length + 1);
|
||||
s_(this->string = reallocate(this->string, length + 1));
|
||||
if (empty)
|
||||
this->string[0] = '\0';
|
||||
for (int i = 0; i < this->nrstrings; i++) {
|
||||
|
@ -52,12 +57,14 @@ const char* method(Strbuilder, get)(Strbuilder_t* this) {
|
|||
return this->string;
|
||||
}
|
||||
|
||||
Strbuilder_t* method(Strbuilder, construct)(const char* string) {
|
||||
Strbuilder_t* obj = malloc(sizeof(Strbuilder_t));
|
||||
Strbuilder_t* method(Strbuilder, construct)(const char* string) {
|
||||
throws(OutOfMemoryException_t);
|
||||
|
||||
sr_(Strbuilder_t* obj = allocate_object(Strbuilder_t), NULL);
|
||||
|
||||
populate(Strbuilder)(obj, Strbuilder_class);
|
||||
|
||||
obj->string = malloc(strlen(string) + 1);
|
||||
sr_(obj->string = allocate(strlen(string) + 1), NULL);
|
||||
strcpy(obj->string, string);
|
||||
|
||||
return obj;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#define STRBUILDER_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "../oop/oop.h"
|
||||
#include "../oop.h"
|
||||
|
||||
#define Strbuilder construct(Strbuilder)
|
||||
extern class(Strbuilder, Object_class, NO_INTERFACES, true) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "try.h"
|
||||
#include "exceptions/exceptions.h"
|
||||
#include "exceptions/stdex.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
@ -69,7 +69,7 @@ void try_push(try_t id) {
|
|||
#define BACKTRACE_BUFFER_SIZE 16
|
||||
#define EXIT_BACKTRACE_FAILED 3
|
||||
#define EXIT_UNCAUGHT 4
|
||||
void print_backtrace(FILE* file) {
|
||||
void _print_backtrace(FILE* file, int ignore) {
|
||||
void* buffer[BACKTRACE_BUFFER_SIZE];
|
||||
char** strings;
|
||||
int entries = backtrace(buffer, BACKTRACE_BUFFER_SIZE);
|
||||
|
@ -83,7 +83,7 @@ void print_backtrace(FILE* file) {
|
|||
int tmp = (entries < BACKTRACE_BUFFER_SIZE) ? entries : entries - 1;
|
||||
|
||||
// from 2, because of print_backtrace and try_throw
|
||||
for (int i = 2; i < tmp; i++) {
|
||||
for (int i = ignore; i < tmp; i++) {
|
||||
fprintf(file, " at %s\n", strings[i]);
|
||||
}
|
||||
if (tmp < entries) {
|
||||
|
@ -109,7 +109,7 @@ void try_throw(try_t id, void* exception) {
|
|||
e->msg);
|
||||
#endif
|
||||
|
||||
print_backtrace(stderr);
|
||||
_print_backtrace(stderr, 2);
|
||||
} else {
|
||||
trys[id].exception = exception;
|
||||
}
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "../oop/oop.h"
|
||||
#include "../misc/unused.h"
|
||||
#include "oop.h"
|
||||
#include "misc.h"
|
||||
|
||||
typedef int try_t;
|
||||
|
||||
|
@ -17,14 +17,16 @@ typedef int try_t;
|
|||
|
||||
#define endtry while(false); } if (_try_catch) { UNUSED(_try_body); UNUSED(_try_data); }};
|
||||
#define throw(e) { try_throw(_try_id, (void*) e); return; }
|
||||
#define throwr(e, r) { try_throw(_try_id, (void*) e); return r; }
|
||||
|
||||
#define until(condition) ; do { try_reset(_try_id); _try_f(); } while(try_has_catch(_try_id) == condition); void* _try_result = try_catch(_try_id); try_remove(_try_id); if(true) { do
|
||||
#define get_thrown() (_try_result)
|
||||
#define failed false
|
||||
#define succeeded true
|
||||
|
||||
#define subtry() try_t _try_id = try_pop();
|
||||
#define s_(f) try_push(_try_id); f; if(_try_has_catch(_try_id)) return;
|
||||
#define subtry() try_t _try_id = try_pop(); UNUSED(_try_id);
|
||||
#define s_(f) try_push(_try_id); f; if(try_has_catch(_try_id)) return;
|
||||
#define sr_(f, r) try_push(_try_id); f; if(try_has_catch(_try_id)) return r;
|
||||
|
||||
#define tpush() try_push(_try_id)
|
||||
#define cthrow(e) _try_id = try_pop(); throw(e);
|
||||
|
@ -40,4 +42,6 @@ try_t try_pop(void);
|
|||
void try_push(try_t);
|
||||
void try_reset(try_t);
|
||||
|
||||
void _print_backtrace(FILE*, int);
|
||||
|
||||
#endif
|
35
try/Makefile
35
try/Makefile
|
@ -1,35 +0,0 @@
|
|||
#
|
||||
# Makefile for crap-libs/try
|
||||
#
|
||||
# Author: overflowerror
|
||||
#
|
||||
|
||||
CC = gcc
|
||||
DEFS = -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -B "../oop/"
|
||||
CFLAGS = -Wall -Wextra -g -std=c99 -DENDEBUG $(DEFS) -fPIC
|
||||
LDFLAGS = $(DEFS) -rdynamic
|
||||
LIBFLAGS = -shared $(DEFS)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: example libtry.so
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
example: example.o try.o exceptions/exceptions.o ../oop/liboop.so
|
||||
$(CC) $(LDFLAGS) -o $@ $^
|
||||
|
||||
libtry.so: try.o exceptions/exceptions.o ../oop/liboop.so
|
||||
$(CC) $(LIBFLAGS) -o $@ $^
|
||||
|
||||
try.o: try.c try.h
|
||||
example.o: example.c try.h
|
||||
exceptions/exceptions.o: exceptions/exceptions.c exceptions/exceptions.h
|
||||
|
||||
../oop/liboop.so:
|
||||
cd ../oop/ && $(MAKE) liboop.so
|
||||
|
||||
clean:
|
||||
rm -f *.o example libtry.so
|
||||
cd ../oop/ && $(MAKE) clean
|
|
@ -1,24 +0,0 @@
|
|||
#include "try.h"
|
||||
|
||||
#include "../oop/oop.h"
|
||||
#include "exceptions/exceptions.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void function(void) { throws(Exception_class)
|
||||
|
||||
throw(new Exception("This is an uncaught exception."));
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
try {
|
||||
throw(new Exception("This is a caught exception."));
|
||||
} catch(Exception_class, Exception_t* e) {
|
||||
printf("Caught: %s\n", e->msg);
|
||||
e->destruct(e);
|
||||
} endtry;
|
||||
|
||||
function();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue