diff --git a/src/base/type_system/README.md b/src/base/type_system/README.md index 587291c..356cd5d 100644 --- a/src/base/type_system/README.md +++ b/src/base/type_system/README.md @@ -25,6 +25,8 @@ Every registered type should have it's own descriptor (`ktDescriptor`). It's a s ## type registration To finally register a type, you should call macro `kt_register()` between `ktDescriptors_beginInit()` and `ktDescriptors_endInit()`. Better do it at the start of your program. To register all types from kerep, call `ktDescriptors_initKerepTypes()`. + +You can free internal ktDescriptors storage by calling `ktDescriptors_free()` at exit, if your debugger (valgrind in my case) sees a memory leak. Examples: + [ktDescriptors_initKerepTypes()](src/base/type_system/init.c) + [kerep types registration](tests/main.cpp) diff --git a/src/base/type_system/base_toString.c b/src/base/type_system/base_toString.c index ee6d5d6..a4be0ca 100644 --- a/src/base/type_system/base_toString.c +++ b/src/base/type_system/base_toString.c @@ -2,6 +2,26 @@ #include "../cptr.h" #include "../../kprint/kprint_format.h" +char* __toString_char(void* c, uint32 fmt) { + char* cc=malloc(2); + cc[0]=*(char*)c; + cc[1]=0; + return cc; +} + +char* __toString_bool(void* c, uint32 fmt) { + static const char _strbool[4][6]={ "false", "true\0", "False", "True\0" }; + uint8 strind=*(bool*)c==1 + kprint_format_uppercase(fmt)*2; + char* rez=malloc(6); + rez[0]=_strbool[strind][0]; + rez[1]=_strbool[strind][1]; + rez[2]=_strbool[strind][2]; + rez[3]=_strbool[strind][3]; + rez[4]=_strbool[strind][4]; + rez[5]=0; + return rez; +} + char* toString_int(int64 n){ int64 d=n; char str[32]; @@ -151,3 +171,6 @@ __toString_uint_def(64) return NULL;\ }\ } + +__toString_float_def(32) +__toString_float_def(64) diff --git a/src/base/type_system/base_toString.h b/src/base/type_system/base_toString.h index c3831cd..a0ed7ac 100644 --- a/src/base/type_system/base_toString.h +++ b/src/base/type_system/base_toString.h @@ -7,16 +7,19 @@ extern "C" { #include "../errors.h" // functions for base types +char* __toString_char(void* c, uint32 fmt); +char* __toString_bool(void* c, uint32 fmt); + char* toString_int(int64 n); char* __toString_int8(void* n, uint32 fmt); char* __toString_int16(void* n, uint32 fmt); -char* __toString_uint32(void* n, uint32 fmt); +char* __toString_int32(void* n, uint32 fmt); char* __toString_int64(void* n, uint32 fmt); char* toString_uint(uint64 n, bool withPostfix, bool uppercase); char* __toString_uint8(void* n, uint32 fmt); char* __toString_uint16(void* n, uint32 fmt); -char* __toString_uuint32(void* n, uint32 fmt); +char* __toString_uint32(void* n, uint32 fmt); char* __toString_uint64(void* n, uint32 fmt); char* toString_float(float64 n, bool withPostfix, bool uppercase); // very bad implimentation diff --git a/src/base/type_system/init.c b/src/base/type_system/init.c index 3e964dc..0f1b18b 100644 --- a/src/base/type_system/init.c +++ b/src/base/type_system/init.c @@ -9,31 +9,32 @@ void ktDescriptors_initKerepTypes(){ // null kt_register(NULL, ktId_Null, NULL, NULL); // base types - kt_register(char, ktId_Char, NULL, NULL); - kt_register(bool, ktId_Bool, NULL, NULL); - kt_register(float32, ktId_Float32, NULL, NULL); - kt_register(float64, ktId_Float64, NULL, NULL); - kt_register(int8, ktId_Int8, NULL, NULL); - kt_register(uint8, ktId_UInt8, NULL, NULL); - kt_register(int16, ktId_Int16, NULL, NULL); - kt_register(uint16, ktId_UInt16, NULL, NULL); - kt_register(int32, ktId_Int32, NULL, NULL); - kt_register(uint32, ktId_UInt32, NULL, NULL); - kt_register(int64, ktId_Int64, NULL, NULL); - kt_register(uint64, ktId_UInt64, NULL, NULL); + kt_register(char, ktId_Char, NULL, __toString_char); + kt_register(bool, ktId_Bool, NULL, __toString_bool); + kt_register(float32, ktId_Float32, NULL, __toString_float32); + kt_register(float64, ktId_Float64, NULL, __toString_float64); + kt_register(int8, ktId_Int8, NULL, __toString_int8); + kt_register(uint8, ktId_UInt8, NULL, __toString_uint8); + kt_register(int16, ktId_Int16, NULL, __toString_int16); + kt_register(uint16, ktId_UInt16, NULL, __toString_uint16); + kt_register(int32, ktId_Int32, NULL, __toString_int32); + kt_register(uint32, ktId_UInt32, NULL, __toString_uint32); + kt_register(int64, ktId_Int64, NULL, __toString_int64); + kt_register(uint64, ktId_UInt64, NULL, __toString_uint64); // base type pointers - kt_register(char*, ktId_CharPtr, NULL, NULL); - kt_register(bool*, ktId_BoolPtr, NULL, NULL); - kt_register(float32*, ktId_Float32Ptr, NULL, NULL); - kt_register(float64*, ktId_Float64Ptr, NULL, NULL); - kt_register(int8*, ktId_Int8Ptr, NULL, NULL); - kt_register(uint8*, ktId_UInt8Ptr, NULL, NULL); - kt_register(int16*, ktId_Int16Ptr, NULL, NULL); - kt_register(uint16*, ktId_UInt16Ptr, NULL, NULL); - kt_register(int32*, ktId_Int32Ptr, NULL, NULL); - kt_register(uint32*, ktId_UInt32Ptr, NULL, NULL); - kt_register(int64*, ktId_Int64Ptr, NULL, NULL); - kt_register(uint64*, ktId_UInt64Ptr, NULL, NULL); + kt_register(char*, ktId_CharPtr, NULL, __toString_char); + kt_register(bool*, ktId_BoolPtr, NULL, __toString_bool); + kt_register(float32*, ktId_Float32Ptr, NULL, __toString_float32); + kt_register(float64*, ktId_Float64Ptr, NULL, __toString_float64); + kt_register(int8*, ktId_Int8Ptr, NULL, __toString_int8); + kt_register(uint8*, ktId_UInt8Ptr, NULL, __toString_uint8); + kt_register(int16*, ktId_Int16Ptr, NULL, __toString_int16); + kt_register(uint16*, ktId_UInt16Ptr, NULL, __toString_uint16); + kt_register(int32*, ktId_Int32Ptr, NULL, __toString_int32); + kt_register(uint32*, ktId_UInt32Ptr, NULL, __toString_uint32); + kt_register(int64*, ktId_Int64Ptr, NULL, __toString_int64); + kt_register(uint64*, ktId_UInt64Ptr, NULL, __toString_uint64); + // ktDescriptor kt_register(ktDescriptor, ktId_ktDescriptor, NULL, NULL); kt_register(ktDescriptor*, ktId_ktDescriptorPtr, NULL, NULL); diff --git a/src/base/type_system/kt_functions.c b/src/base/type_system/kt_functions.c index a459d2a..5d3d014 100644 --- a/src/base/type_system/kt_functions.c +++ b/src/base/type_system/kt_functions.c @@ -76,3 +76,7 @@ ktDescriptor ktDescriptor_get(ktId id){ } return typeDescriptors[id]; } + +void ktDescriptors_free(){ + free(typeDescriptors); +} diff --git a/src/base/type_system/kt_functions.h b/src/base/type_system/kt_functions.h index 7274727..cf27d3e 100644 --- a/src/base/type_system/kt_functions.h +++ b/src/base/type_system/kt_functions.h @@ -21,6 +21,8 @@ void ktDescriptors_endInit(); /// @param id id of registered type ktDescriptor ktDescriptor_get(ktId id); +// call it to free heap-allocated ktDescriptors array +void ktDescriptors_free(); ktId_declare(Null); diff --git a/tests/main.cpp b/tests/main.cpp index 0ba2387..99c7197 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -22,6 +22,7 @@ int main(){ // optime("test_all",1,test_all()); // test_kprint_colors(); test_rng_algorithms(); + ktDescriptors_free(); printf("\e[0m\n"); return 0; }