diff --git a/DtsodParser/DtsodV24_deserialize.c b/DtsodParser/DtsodV24_deserialize.c index adedb24..8018192 100644 --- a/DtsodParser/DtsodV24_deserialize.c +++ b/DtsodParser/DtsodV24_deserialize.c @@ -171,7 +171,6 @@ Unitype __ParseValue(DeserializeSharedData* shared, string str){ sprintf(err,"can't parse to int: <%s>",_c); throw(err); } - free(_c); return Uni(Int64,li); } diff --git a/Makefile b/Makefile index dfc7810..3bedacc 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TESTS=$(wildcard tests/*c) $(wildcard tests/**/*.c) OUTDIR=bin CMP=gcc -all: clear_c clear_bin build_test build_lib +all: clear_c clear_bin build_test clear_c: clear diff --git a/base/base.h b/base/base.h index b9001c5..906b6ed 100644 --- a/base/base.h +++ b/base/base.h @@ -10,23 +10,26 @@ extern "C" { #include "mystr.h" // executes codeblock and prints execution time -/*#define optime(opname,repeats,codeblock) ({\ - struct timespec start, stop;\ - clock_gettime(CLOCK_REALTIME, &start);\ - for(uint64 ___OPREP=0;___OPREP0) cptr[str.length]=str.ptr[str.length]; @@ -69,6 +69,7 @@ bool string_compare(string str0, string str1){ //creates new string which is reversed variant of string string_reverse(string s){ + if(s.length==0) return s; string r={malloc(s.length), s.length}; for(uint32 i=0; i #include #include +#include #define CHOOSE(B, Y, N) __builtin_choose_expr(B, Y, N) diff --git a/base/types.c b/base/types.c index 8aa92fe..95c2dd7 100644 --- a/base/types.c +++ b/base/types.c @@ -115,16 +115,22 @@ void Unitype_free(Unitype u){ } } - -void printuni(Unitype v){ +void sprintuni(char* buf,Unitype v){ switch (v.type) { - case Null: printf("{Null}");break; - case Float64: printf("{%s : %lf}",my_type_name(v.type),v.Float64);break; - case Char: printf("{%s : '%c'}",my_type_name(v.type),v.Char);break; + case Null: sprintf(buf, "{Null}");break; + case Float64: sprintf(buf, "{%s : %lf}",my_type_name(v.type),v.Float64);break; + case Char: sprintf(buf, "{%s : '%c'}",my_type_name(v.type),v.Char);break; case Bool: - case UInt64: printf("{%s : %lu}",my_type_name(v.type),v.UInt64);break; - case Int64: printf("{%s : %ld}",my_type_name(v.type),v.Int64);break; - case CharPtr: printf("{%s : \"%s\"}",my_type_name(v.type),(char*)v.VoidPtr);break; - default: printf("{%s : %p}",my_type_name(v.type),v.VoidPtr);break; + case UInt64: sprintf(buf, "{%s : %lu}",my_type_name(v.type),v.UInt64);break; + case Int64: sprintf(buf, "{%s : %ld}",my_type_name(v.type),v.Int64);break; + case CharPtr: sprintf(buf, "{%s : \"%s\"}",my_type_name(v.type),(char*)v.VoidPtr);break; + default: sprintf(buf, "{%s : %p}",my_type_name(v.type),v.VoidPtr);break; } } + +void printuni(Unitype v){ + char* s=malloc(64); + sprintuni(s,v); + fputs(s, stdout); + free(s); +} \ No newline at end of file diff --git a/base/types.h b/base/types.h index af08c82..08d2461 100644 --- a/base/types.h +++ b/base/types.h @@ -51,6 +51,7 @@ static const Unitype UniFalse={.Bool=false,.type=Bool}; //frees VoidPtr value or does nothing if type isn't pointer void Unitype_free(Unitype u); void printuni(Unitype v); +void sprintuni(char* s, Unitype v); #if __cplusplus } diff --git a/kerep.vcxproj b/kerep.vcxproj index cfcdc93..5ed9303 100644 --- a/kerep.vcxproj +++ b/kerep.vcxproj @@ -75,27 +75,27 @@ - bin-$(Platform)\$(Configuration)\ - obj-$(Platform)\$(Configuration)\ + bin\$(Configuration)-$(Platform)\ + obj\$(Configuration)-$(Platform)\ true false - bin-$(Platform)\$(Configuration)\ - obj-$(Platform)\$(Configuration)\ + bin\$(Configuration)-$(Platform)\ + obj\$(Configuration)-$(Platform)\ true false true - bin-$(Platform)\$(Configuration)\ - obj-$(Platform)\$(Configuration)\ + bin\$(Configuration)-$(Platform)\ + obj\$(Configuration)-$(Platform)\ false true - bin-$(Platform)\$(Configuration)\ - obj-$(Platform)\$(Configuration)\ + bin\$(Configuration)-$(Platform)\ + obj\$(Configuration)-$(Platform)\ false @@ -220,6 +220,8 @@ + + @@ -237,6 +239,7 @@ + diff --git a/kerep.vcxproj.filters b/kerep.vcxproj.filters index a4008fb..802eb88 100644 --- a/kerep.vcxproj.filters +++ b/kerep.vcxproj.filters @@ -125,5 +125,14 @@ Исходные файлы + + Исходные файлы + + + Исходные файлы + + + Исходные файлы + \ No newline at end of file diff --git a/tests/main.c b/tests/main.c index 47445cc..a91c53e 100644 --- a/tests/main.c +++ b/tests/main.c @@ -6,6 +6,7 @@ void test_all(){ test_hashtable(); test_string(); test_dtsod(); + test_safethrow(); printf("\e[96m---------------------------------------\e[0m\n"); } diff --git a/tests/test_safethrow.c b/tests/test_safethrow.c new file mode 100644 index 0000000..17dff57 --- /dev/null +++ b/tests/test_safethrow.c @@ -0,0 +1,43 @@ +#include "tests.h" + +Maybe dont_throw(){ + return SUCCESS(Uni(UInt64, 9/2)); +} + +Maybe throw_error(){ + safethrow("test exception"); +} + +Maybe throw_errcode(){ + safethrow(ERR_NULLPTR); +} + +Maybe test_maybe(){ + printf("\e[94mdont_throw returns \e[92m"); + throwNext(dont_throw(),rez0) + printMaybe(rez0); + printf("\n"); + throwNext(throw_error(),rez1) + printMaybe(rez1); + throw("test_maybe failed"); + return MaybeNull; +} + + +Maybe c(){ throwNext(throw_errcode(),_) return MaybeNull; } +Maybe b(){ throwNext(c(),_) return MaybeNull; } +Maybe a(){ throwNext(b(),_) return MaybeNull; } + +void test_safethrow(){ + printf("\e[96m-----------[test_safethrow]-----------\n"); + optime("test_safethrow", 1, ({ + Maybe e=test_maybe(); + printf("\e[94mthrow_error:\n\e[92m"); + printMaybe(e); + Maybe_free(e); + printf("\e[94mthrow_errcode:\n\e[92m"); + e=a(); + printMaybe(e); + Maybe_free(e); + })); +} diff --git a/tests/test_string.c b/tests/test_string.c index 6eef4c2..e9e249f 100644 --- a/tests/test_string.c +++ b/tests/test_string.c @@ -6,10 +6,10 @@ void test_string(){ printf("\e[96m-------------[test_string]-------------\n"); char c[]="0123456789abcdef"; string s=string_cpFromCharPtr(c); - printf("\e[92m\"%s\" -> string_cpFromCharPtr()\n",c); + printf("\e[92m\"%s\" \e[94m-> string_cpFromCharPtr()\n",c); if(s.length!=16) throw("string created with incorrect length"); char* p=string_cpToCptr(s); - printf("\e[92mstring_cpToCptr() -> \"%s\"\n",p); + printf("\e[94mstring_cpToCptr() -> \e[92m\"%s\"\n",p); free(p); free(s.ptr); })); diff --git a/tests/tests.h b/tests/tests.h index 220ac56..edaa49f 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -8,4 +8,5 @@ void test_searchtree(); void test_autoarr(); void test_hashtable(); void test_string(); -void test_dtsod(); \ No newline at end of file +void test_dtsod(); +void test_safethrow(); \ No newline at end of file