base_toString

This commit is contained in:
timerix 2022-10-24 15:25:13 +06:00
parent d270554dfa
commit 4222c3ebf6
7 changed files with 62 additions and 26 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -76,3 +76,7 @@ ktDescriptor ktDescriptor_get(ktId id){
}
return typeDescriptors[id];
}
void ktDescriptors_free(){
free(typeDescriptors);
}

View File

@ -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);

View File

@ -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;
}