diff --git a/src/base/cptr.c b/src/base/cptr.c index a4080fe..cba9814 100644 --- a/src/base/cptr.c +++ b/src/base/cptr.c @@ -46,4 +46,42 @@ bool cptr_endsWith(char* ptr, char* fragment){ for(char cs=*ptr, cf=*fragment; cf; cs=*++ptr, cf=*++fragment) if(cs!=cf) return false; return true; -} \ No newline at end of file +} + +void memcopy(void* from, void* to, uint32 size){ + if(from==NULL || to==NULL) + throw(ERR_NULLPTR); + for(uint32 i=0; i>63) + str[--i]='-'; + return cptr_copy((char*)str+i); +} + +char* toString_uint(uint64 n, bool withPostfix, bool uppercase){ + uint64 d=n; + char str[32]; + uint8 i=sizeof(str); + str[--i]=0; + if(withPostfix) + str[--i]= uppercase ? 'U' : 'u'; + while(d!=0){ + str[--i]='0' + d%10; + d/=10; + } + return cptr_copy((char*)str+i); +} + +char* toString_float(float64 n, bool withPostfix, bool uppercase){ + int64 d=n; + float64 r=n-d; + char* strint=toString_int(d); + char strfract[32]; + uint8 i=0; + strfract[i++]='.'; + while(r!=0){ + r*=10.0; + char fc=r; + strfract[i++]=fc; + r-=fc; + } + if(withPostfix) + strfract[i++]= uppercase ? 'F' : 'f'; + strfract[i]=0; + char* str=cptr_concat(strint, strfract); + free(strint); + return str; +} + +char* toString_bin(char* bytes, uint32 size, bool withPrefix){ + char* str=malloc(size*8+1); + uint32 cn=0; + if(withPrefix){ + str[cn++]='0'; + str[cn++]='b'; + } + for(uint32 bn=0; bn>i); + } + str[cn]=0; + return str; +} + +char _4bitsHex(uint8 u, bool uppercase){ + switch(u){ + case 0: case 1: case 2: case 3: case 4: + case 5: case 6: case 7: case 8: case 9: + return '0'+u; + case 0xA: case 0xB: case 0xC: + case 0xD: case 0xE: case 0xF: + return (uppercase ? 'A'-10 : 'a'-10) + u; + default: return 219; + } +} + +char* toString_hex(char* bytes, uint32 size, bool withPrefix, bool uppercase){ + char* str=malloc(size*2); + uint32 cn=0; + if(withPrefix){ + str[cn++]='0'; + str[cn++]='x'; + } + for(uint32 bn=0; bn - Maybe (*toString)(void*, int32); // NULL or function which generates string representaion of object + char* (*toString)(void* obj, int32 fmt); // NULL or function which generates string representaion of object } ktDescriptor; #if __cplusplus diff --git a/src/base/type_system/kt_functions.c b/src/base/type_system/kt_functions.c index c183ff0..1f85eea 100644 --- a/src/base/type_system/kt_functions.c +++ b/src/base/type_system/kt_functions.c @@ -58,7 +58,7 @@ void ktDescriptors_endInit(){ printf("\e[92minitialized %u type descriptors\n", ktId_last); } -void __kt_register(char* name, int16 size, void (*freeMembers)(void*), Maybe (*toString)(void*, int32)){ +void __kt_register(char* name, int16 size, void (*freeMembers)(void*), char* (*toString)(void*, int32)){ ktDescriptor typeDesc={ .name=name, .size=size, @@ -69,7 +69,10 @@ void __kt_register(char* name, int16 size, void (*freeMembers)(void*), Maybe (*t Autoarr_add(__ktDescriptors, typeDesc); } -Maybe ktDescriptor_get(ktId id){ - if(id>ktId_last) safethrow("invalid type id",;); - return SUCCESS(UniStack(ktId_ktDescriptorPtr, &typeDescriptors[id])); +ktDescriptor ktDescriptor_get(ktId id){ + if(id>ktId_last) { + printf("\n%u\n",id); + throw("invalid type id"); + } + return typeDescriptors[id]; } diff --git a/src/base/type_system/kt_functions.h b/src/base/type_system/kt_functions.h index b1e588f..cdf5359 100644 --- a/src/base/type_system/kt_functions.h +++ b/src/base/type_system/kt_functions.h @@ -10,7 +10,7 @@ extern "C" { extern ktId ktId_last; -void __kt_register(char* name, int16 size, void (*freeMembers)(void*), Maybe (*toString)(void*, int32)); +void __kt_register(char* name, int16 size, void (*freeMembers)(void*), char* (*toString)(void*, int32)); #define kt_register(TYPE, ID_VAR_NAME, FREE_MEMBERS_FUNC, TO_STRING_FUNC)\ __kt_register(#ID_VAR_NAME, sizeof(TYPE), FREE_MEMBERS_FUNC, TO_STRING_FUNC);\ @@ -18,9 +18,9 @@ void __kt_register(char* name, int16 size, void (*freeMembers)(void*), Maybe (*t void ktDescriptors_beginInit(); void ktDescriptors_endInit(); -/// @param id id of registered type -/// @return Maybe -Maybe ktDescriptor_get(ktId id); + +/// @param id id of registered type +ktDescriptor ktDescriptor_get(ktId id); ktId_declare(Null); diff --git a/src/base/type_system/unitype.c b/src/base/type_system/unitype.c index d4115cd..7bf9f1b 100644 --- a/src/base/type_system/unitype.c +++ b/src/base/type_system/unitype.c @@ -4,8 +4,7 @@ ktId_define(Unitype); ktId_define(UnitypePtr); void Unitype_free(Unitype u){ - tryLast(ktDescriptor_get(u.typeId), mType); - ktDescriptor type=*(ktDescriptor*)mType.value.VoidPtr; + ktDescriptor type=ktDescriptor_get(u.typeId); if(type.freeMembers) type.freeMembers(u.VoidPtr); if(u.allocatedInHeap) @@ -13,11 +12,23 @@ void Unitype_free(Unitype u){ } void __UnitypePtr_free(void* u) { Unitype_free(*(Unitype*)u); } +char* toString_Unitype(void* _u, int32 fmt){ + Unitype* u=_u; + ktDescriptor type=ktDescriptor_get(u->typeId); + char* valuestr=type.toString(_u, fmt); + char* rezult=cptr_concat("{ type: ", type.name, + ", allocated on heap: ", (u->allocatedInHeap ? "true" : "false"), + ", value:", valuestr, " }"); + free(valuestr); + return rezult; +} + + + #define BUFSIZE 64 char* sprintuni(Unitype v){ char* buf=malloc(BUFSIZE); - tryLast(ktDescriptor_get(v.typeId), mType); - ktDescriptor type=*(ktDescriptor*)mType.value.VoidPtr; + ktDescriptor type=ktDescriptor_get(v.typeId); if(v.typeId==ktId_Null) sprintf_s(buf, BUFSIZE, "{Null}"); else if(v.typeId==ktId_Float64)