yet another ktid type system refactoring
This commit is contained in:
@@ -15,6 +15,8 @@ char* errname(ErrorId err){
|
||||
case ERR_KEYNOTFOUND: return "ERR_KEYNOTFOUND";
|
||||
case ERR_FORMAT: return "ERR_FORMAT";
|
||||
case ERR_UNEXPECTEDVAL: return "ERR_UNEXPECTEDVAL";
|
||||
case ERR_IO: return "ERR_IO";
|
||||
case ERR_IO_EOF: return "ERR_IO_EOF";
|
||||
default: return "UNKNOWN_ERROR";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,8 @@ typedef enum ErrorId {
|
||||
SUCCESS, // not an error
|
||||
ERR_MAXLENGTH, ERR_WRONGTYPE, ERR_WRONGINDEX,
|
||||
ERR_NOTIMPLEMENTED, ERR_NULLPTR, ERR_ENDOFSTR,
|
||||
ERR_KEYNOTFOUND, ERR_FORMAT, ERR_UNEXPECTEDVAL
|
||||
ERR_KEYNOTFOUND, ERR_FORMAT, ERR_UNEXPECTEDVAL,
|
||||
ERR_IO, ERR_IO_EOF
|
||||
} ErrorId;
|
||||
|
||||
char* errname(ErrorId err);
|
||||
@@ -34,7 +35,7 @@ void printMaybe(Maybe e);
|
||||
|
||||
#define SUCCESS(REZLT) (Maybe){.errmsg=NULL, .value=REZLT}
|
||||
|
||||
#define __RETURN_EXCEPTION(ERRMSG) return (Maybe){.errmsg=ERRMSG, .value=UniNull}
|
||||
#define __RETURN_EXCEPTION(ERRMSG) return (Maybe){.value=UniNull, .errmsg=ERRMSG}
|
||||
|
||||
#define __EXIT(ERRMSG) ({ kprintf("\e[91m%s\e[0m \n", ERRMSG); free(ERRMSG); exit(128); })
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ extern "C" {
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <locale.h>
|
||||
#include <time.h>
|
||||
@@ -23,6 +22,15 @@ typedef int64_t int64;
|
||||
typedef uint64_t uint64;
|
||||
typedef float float32;
|
||||
typedef double float64;
|
||||
// Usually bool from stdbool.h is defined as macro,
|
||||
// so in other macros like ktid_##TYPE it will be replaced by _Bool.
|
||||
// ktid__Bool will be created instead of ktid_bool
|
||||
// In C++ bool is a keyword, so there is no need to redefine it.
|
||||
#if !__cplusplus
|
||||
typedef uint8 bool;
|
||||
#define true 1
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
#define dbg(N) kprintf("\e[95m%d\n",N)
|
||||
|
||||
|
||||
@@ -4,18 +4,16 @@ For using some kerep capabilities, such as generic structs, unitype, and kprint,
|
||||
|
||||
## type id
|
||||
|
||||
Every registered type has its own id (`ktId`), which should be declared in header file and defined in source file.
|
||||
Every registered type has its own id (`ktid`), which should be declared in header file and defined in source file.
|
||||
Example:
|
||||
```c
|
||||
//someStruct.h
|
||||
typedef struct { } someStruct;
|
||||
ktId_declare(someStruct);
|
||||
ktId_declare(someStructPtr); // pointer to type is another type
|
||||
ktid_declare(someStruct);
|
||||
```
|
||||
```c
|
||||
//someStruct.c
|
||||
ktId_define(someStruct);
|
||||
ktId_define(someStructPtr);
|
||||
ktid_define(someStruct);
|
||||
```
|
||||
|
||||
## type descriptors
|
||||
|
||||
@@ -3,14 +3,18 @@
|
||||
#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_charPtr(void* c, uint32 fmt){
|
||||
return cptr_copy(*(char**)c);
|
||||
//*c=char
|
||||
if(kprint_format_dataFormat(fmt)==kprint_fmtChar){
|
||||
char* cc=malloc(2);
|
||||
cc[0]=*(char*)c;
|
||||
cc[1]=0;
|
||||
return cc;
|
||||
}
|
||||
// *c=cstring
|
||||
else if(kprint_format_dataFormat(fmt)==kprint_fmtString){
|
||||
return cptr_copy(*(char**)c);
|
||||
}
|
||||
else throw(ERR_FORMAT);
|
||||
}
|
||||
|
||||
char* __toString_bool(void* c, uint32 fmt) {
|
||||
|
||||
@@ -7,8 +7,8 @@ extern "C" {
|
||||
#include "../errors.h"
|
||||
|
||||
// functions for base types
|
||||
// has different output for fmtChar and fmtString
|
||||
char* __toString_char(void* c, uint32 fmt);
|
||||
char* __toString_charPtr(void* c, uint32 fmt);
|
||||
char* __toString_bool(void* c, uint32 fmt);
|
||||
|
||||
char* toString_int(int64 n);
|
||||
|
||||
@@ -8,127 +8,80 @@
|
||||
|
||||
void ktDescriptors_initKerepTypes(){
|
||||
// null
|
||||
kt_register(NULL, ktId_Null, NULL, NULL);
|
||||
__kt_register("Null", sizeof(NULL), NULL, NULL);
|
||||
ktid_Null=ktid_last;
|
||||
// base types
|
||||
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, __toString_charPtr);
|
||||
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, NULL, __toString_char);
|
||||
kt_register(bool, NULL, __toString_bool);
|
||||
kt_register(float32, NULL, __toString_float32);
|
||||
kt_register(float64, NULL, __toString_float64);
|
||||
kt_register(int8, NULL, __toString_int8);
|
||||
kt_register(uint8, NULL, __toString_uint8);
|
||||
kt_register(int16, NULL, __toString_int16);
|
||||
kt_register(uint16, NULL, __toString_uint16);
|
||||
kt_register(int32, NULL, __toString_int32);
|
||||
kt_register(uint32, NULL, __toString_uint32);
|
||||
kt_register(int64, NULL, __toString_int64);
|
||||
kt_register(uint64, NULL, __toString_uint64);
|
||||
|
||||
// ktDescriptor
|
||||
kt_register(ktDescriptor, ktId_ktDescriptor, NULL, NULL);
|
||||
kt_register(ktDescriptor*, ktId_ktDescriptorPtr, NULL, NULL);
|
||||
kt_register(ktDescriptor, NULL, NULL);
|
||||
|
||||
|
||||
// base type arrays
|
||||
kt_register(Array_char, ktId_ArrayChar, (freeMembers_t)Array_char_freeValues, NULL);
|
||||
kt_register(Array_bool, ktId_ArrayBool, (freeMembers_t)Array_bool_freeValues, NULL);
|
||||
kt_register(Array_float32, ktId_ArrayFloat32, (freeMembers_t)Array_float32_freeValues, NULL);
|
||||
kt_register(Array_float64, ktId_ArrayFloat64, (freeMembers_t)Array_float64_freeValues, NULL);
|
||||
kt_register(Array_int8, ktId_ArrayInt8, (freeMembers_t)Array_int8_freeValues, NULL);
|
||||
kt_register(Array_uint8, ktId_ArrayUInt8, (freeMembers_t)Array_uint8_freeValues, NULL);
|
||||
kt_register(Array_int16, ktId_ArrayInt16, (freeMembers_t)Array_int16_freeValues, NULL);
|
||||
kt_register(Array_uint16, ktId_ArrayUInt16, (freeMembers_t)Array_uint16_freeValues, NULL);
|
||||
kt_register(Array_int32, ktId_ArrayInt32, (freeMembers_t)Array_int32_freeValues, NULL);
|
||||
kt_register(Array_uint32, ktId_ArrayUInt32, (freeMembers_t)Array_uint32_freeValues, NULL);
|
||||
kt_register(Array_int64, ktId_ArrayInt64, (freeMembers_t)Array_int64_freeValues, NULL);
|
||||
kt_register(Array_uint64, ktId_ArrayUInt64, (freeMembers_t)Array_uint64_freeValues, NULL);
|
||||
// base type array pointers
|
||||
kt_register(Array_char*, ktId_ArrayCharPtr, (freeMembers_t)Array_char_freeValues, NULL);
|
||||
kt_register(Array_bool*, ktId_ArrayBoolPtr, (freeMembers_t)Array_bool_freeValues, NULL);
|
||||
kt_register(Array_float32*, ktId_ArrayFloat32Ptr, (freeMembers_t)Array_float32_freeValues, NULL);
|
||||
kt_register(Array_float64*, ktId_ArrayFloat64Ptr, (freeMembers_t)Array_float64_freeValues, NULL);
|
||||
kt_register(Array_int8*, ktId_ArrayInt8Ptr, (freeMembers_t)Array_int8_freeValues, NULL);
|
||||
kt_register(Array_uint8*, ktId_ArrayUInt8Ptr, (freeMembers_t)Array_uint8_freeValues, NULL);
|
||||
kt_register(Array_int16*, ktId_ArrayInt16Ptr, (freeMembers_t)Array_int16_freeValues, NULL);
|
||||
kt_register(Array_uint16*, ktId_ArrayUInt16Ptr, (freeMembers_t)Array_uint16_freeValues, NULL);
|
||||
kt_register(Array_int32*, ktId_ArrayInt32Ptr, (freeMembers_t)Array_int32_freeValues, NULL);
|
||||
kt_register(Array_uint32*, ktId_ArrayUInt32Ptr, (freeMembers_t)Array_uint32_freeValues, NULL);
|
||||
kt_register(Array_int64*, ktId_ArrayInt64Ptr, (freeMembers_t)Array_int64_freeValues, NULL);
|
||||
kt_register(Array_uint64*, ktId_ArrayUInt64Ptr, (freeMembers_t)Array_uint64_freeValues, NULL);
|
||||
kt_register(Array_char, (freeMembers_t)Array_char_freeValues, NULL);
|
||||
kt_register(Array_bool, (freeMembers_t)Array_bool_freeValues, NULL);
|
||||
kt_register(Array_float32, (freeMembers_t)Array_float32_freeValues, NULL);
|
||||
kt_register(Array_float64, (freeMembers_t)Array_float64_freeValues, NULL);
|
||||
kt_register(Array_int8, (freeMembers_t)Array_int8_freeValues, NULL);
|
||||
kt_register(Array_uint8, (freeMembers_t)Array_uint8_freeValues, NULL);
|
||||
kt_register(Array_int16, (freeMembers_t)Array_int16_freeValues, NULL);
|
||||
kt_register(Array_uint16, (freeMembers_t)Array_uint16_freeValues, NULL);
|
||||
kt_register(Array_int32, (freeMembers_t)Array_int32_freeValues, NULL);
|
||||
kt_register(Array_uint32, (freeMembers_t)Array_uint32_freeValues, NULL);
|
||||
kt_register(Array_int64, (freeMembers_t)Array_int64_freeValues, NULL);
|
||||
kt_register(Array_uint64, (freeMembers_t)Array_uint64_freeValues, NULL);
|
||||
|
||||
// base type autoarrs
|
||||
kt_register(Autoarr_char, ktId_AutoarrChar, ____Autoarr_free_char, NULL);
|
||||
kt_register(Autoarr_bool, ktId_AutoarrBool, ____Autoarr_free_bool, NULL);
|
||||
kt_register(Autoarr_float32, ktId_AutoarrFloat32, ____Autoarr_free_float32, NULL);
|
||||
kt_register(Autoarr_float64, ktId_AutoarrFloat64, ____Autoarr_free_float64, NULL);
|
||||
kt_register(Autoarr_int8, ktId_AutoarrInt8, ____Autoarr_free_int8, NULL);
|
||||
kt_register(Autoarr_uint8, ktId_AutoarrUInt8, ____Autoarr_free_uint8, NULL);
|
||||
kt_register(Autoarr_int16, ktId_AutoarrInt16, ____Autoarr_free_int16, NULL);
|
||||
kt_register(Autoarr_uint16, ktId_AutoarrUInt16, ____Autoarr_free_uint16, NULL);
|
||||
kt_register(Autoarr_int32, ktId_AutoarrInt32, ____Autoarr_free_int32, NULL);
|
||||
kt_register(Autoarr_uint32, ktId_AutoarrUInt32, ____Autoarr_free_uint32, NULL);
|
||||
kt_register(Autoarr_int64, ktId_AutoarrInt64, ____Autoarr_free_int64, NULL);
|
||||
kt_register(Autoarr_uint64, ktId_AutoarrUInt64, ____Autoarr_free_uint64, NULL);
|
||||
// base type autoarr pointers
|
||||
kt_register(Autoarr_char*, ktId_AutoarrCharPtr, ____Autoarr_free_char, NULL);
|
||||
kt_register(Autoarr_bool*, ktId_AutoarrBoolPtr, ____Autoarr_free_bool, NULL);
|
||||
kt_register(Autoarr_float32*, ktId_AutoarrFloat32Ptr, ____Autoarr_free_float32, NULL);
|
||||
kt_register(Autoarr_float64*, ktId_AutoarrFloat64Ptr, ____Autoarr_free_float64, NULL);
|
||||
kt_register(Autoarr_int8*, ktId_AutoarrInt8Ptr, ____Autoarr_free_int8, NULL);
|
||||
kt_register(Autoarr_uint8*, ktId_AutoarrUInt8Ptr, ____Autoarr_free_uint8, NULL);
|
||||
kt_register(Autoarr_int16*, ktId_AutoarrInt16Ptr, ____Autoarr_free_int16, NULL);
|
||||
kt_register(Autoarr_uint16*, ktId_AutoarrUInt16Ptr, ____Autoarr_free_uint16, NULL);
|
||||
kt_register(Autoarr_int32*, ktId_AutoarrInt32Ptr, ____Autoarr_free_int32, NULL);
|
||||
kt_register(Autoarr_uint32*, ktId_AutoarrUInt32Ptr, ____Autoarr_free_uint32, NULL);
|
||||
kt_register(Autoarr_int64*, ktId_AutoarrInt64Ptr, ____Autoarr_free_int64, NULL);
|
||||
kt_register(Autoarr_uint64*, ktId_AutoarrUInt64Ptr, ____Autoarr_free_uint64, NULL);
|
||||
kt_register(Autoarr_char, ____Autoarr_free_char, NULL);
|
||||
kt_register(Autoarr_bool, ____Autoarr_free_bool, NULL);
|
||||
kt_register(Autoarr_float32, ____Autoarr_free_float32, NULL);
|
||||
kt_register(Autoarr_float64, ____Autoarr_free_float64, NULL);
|
||||
kt_register(Autoarr_int8, ____Autoarr_free_int8, NULL);
|
||||
kt_register(Autoarr_uint8, ____Autoarr_free_uint8, NULL);
|
||||
kt_register(Autoarr_int16, ____Autoarr_free_int16, NULL);
|
||||
kt_register(Autoarr_uint16, ____Autoarr_free_uint16, NULL);
|
||||
kt_register(Autoarr_int32, ____Autoarr_free_int32, NULL);
|
||||
kt_register(Autoarr_uint32, ____Autoarr_free_uint32, NULL);
|
||||
kt_register(Autoarr_int64, ____Autoarr_free_int64, NULL);
|
||||
kt_register(Autoarr_uint64, ____Autoarr_free_uint64, NULL);
|
||||
|
||||
// Unitype
|
||||
kt_register(Unitype, ktId_Unitype, __UnitypePtr_free, NULL);
|
||||
kt_register(Unitype*, ktId_UnitypePtr, __UnitypePtr_free, NULL);
|
||||
kt_register(Autoarr_Unitype, ktId_AutoarrUnitype, ____Autoarr_free_Unitype_, NULL);
|
||||
kt_register(Autoarr_Unitype*, ktId_AutoarrUnitypePtr, ____Autoarr_free_Unitype_, NULL);
|
||||
kt_register(Unitype, __UnitypePtr_free, NULL);
|
||||
kt_register(Array_Unitype, (freeMembers_t)Array_Unitype_freeValues, NULL);
|
||||
kt_register(Autoarr_Unitype, ____Autoarr_free_Unitype_, NULL);
|
||||
// replacing autogenerated freear() function to custom
|
||||
Autoarr_Unitype* _uar=Autoarr_create(Unitype, 1, 1);
|
||||
_uar->functions->freear=__Autoarr_free_Unitype_;
|
||||
Autoarr_free(_uar, true);
|
||||
|
||||
// SearchTreeNode
|
||||
kt_register(STNode, ktId_STNode, __STNode_free, NULL);
|
||||
kt_register(STNode*, ktId_STNodePtr, __STNode_free, NULL);
|
||||
kt_register(STNode, __STNode_free, NULL);
|
||||
|
||||
// KeyValuePair
|
||||
kt_register(KVPair, ktId_KVPair, __KVPair_free, NULL);
|
||||
kt_register(KVPair*, ktId_KVPairPtr, __KVPair_free, NULL);
|
||||
kt_register(Autoarr_KVPair, ktId_AutoarrKVPair, ____Autoarr_free_KVPair_, NULL);
|
||||
kt_register(Autoarr_KVPair*, ktId_AutoarrKVPairPtr, ____Autoarr_free_KVPair_, NULL);
|
||||
kt_register(KVPair, __KVPair_free, NULL);
|
||||
kt_register(Autoarr_KVPair, ____Autoarr_free_KVPair_, NULL);
|
||||
// replacing autogenerated freear() function to custom
|
||||
Autoarr_KVPair* _kvpar=Autoarr_create(KVPair, 1, 1);
|
||||
_kvpar->functions->freear=__Autoarr_free_KVPair_;
|
||||
Autoarr_free(_kvpar, true);
|
||||
|
||||
// Hashtable
|
||||
kt_register(Hashtable, ktId_Hashtable, __Hashtable_free, NULL);
|
||||
kt_register(Hashtable*, ktId_HashtablePtr, __Hashtable_free, NULL);
|
||||
kt_register(Hashtable, __Hashtable_free, NULL);
|
||||
|
||||
// string
|
||||
kt_register(string, ktId_string, NULL, NULL);
|
||||
kt_register(string*, ktId_stringPtr, NULL, NULL);
|
||||
kt_register(string, ktId_AutoarrString, ____Autoarr_free_string, NULL);
|
||||
kt_register(string*, ktId_AutoarrStringPtr, ____Autoarr_free_string, NULL);
|
||||
kt_register(string, NULL, NULL);
|
||||
kt_register(string, ____Autoarr_free_string, NULL);
|
||||
// StringBuilder
|
||||
kt_register(StringBuilder, ktId_StringBuilder, __StringBuilder_free, NULL);
|
||||
kt_register(StringBuilder*, ktId_StringBuilderPtr, __StringBuilder_free, NULL);
|
||||
kt_register(StringBuilder, __StringBuilder_free, NULL);
|
||||
}
|
||||
|
||||
@@ -5,13 +5,13 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../std.h"
|
||||
#include "ktId.h"
|
||||
#include "ktid.h"
|
||||
|
||||
typedef void (*freeMembers_t)(void*);
|
||||
typedef char* (*toString_t)(void* obj, uint32 fmt);
|
||||
typedef struct ktDescriptor{
|
||||
char* name;
|
||||
ktId id;
|
||||
ktid id;
|
||||
uint16 size;
|
||||
freeMembers_t freeMembers; // NULL or function which frees all struct members
|
||||
toString_t toString; // NULL or function which generates string representaion of object
|
||||
|
||||
@@ -5,12 +5,18 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../std.h"
|
||||
typedef uint16 ktId;
|
||||
typedef uint16 ktid;
|
||||
|
||||
#define ktId_declare(TYPE_NAME)\
|
||||
extern ktId ktId_##TYPE_NAME
|
||||
#define ktId_define(TYPE_NAME)\
|
||||
ktId ktId_##TYPE_NAME=-1
|
||||
#define ktid_name(TYPE) ktid_##TYPE
|
||||
#define ktid_ptrName(TYPE) ktid_##TYPE##_Ptr
|
||||
|
||||
#define ktid_declare(TYPE)\
|
||||
extern ktid ktid_##TYPE;\
|
||||
extern ktid ktid_##TYPE##_Ptr;
|
||||
|
||||
#define ktid_define(TYPE)\
|
||||
ktid ktid_##TYPE=-1;\
|
||||
ktid ktid_##TYPE##_Ptr=-1;
|
||||
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -3,42 +3,28 @@
|
||||
Autoarr_declare(ktDescriptor)
|
||||
Autoarr_define(ktDescriptor)
|
||||
|
||||
ktId_define(Null);
|
||||
ktid ktid_Null=-1;
|
||||
|
||||
ktId_define(Char);
|
||||
ktId_define(Bool);
|
||||
ktId_define(Float32);
|
||||
ktId_define(Float64);
|
||||
ktId_define(Int8);
|
||||
ktId_define(UInt8);
|
||||
ktId_define(Int16);
|
||||
ktId_define(UInt16);
|
||||
ktId_define(Int32);
|
||||
ktId_define(UInt32);
|
||||
ktId_define(Int64);
|
||||
ktId_define(UInt64);
|
||||
ktid_define(char);
|
||||
ktid_define(bool);
|
||||
ktid_define(float32);
|
||||
ktid_define(float64);
|
||||
ktid_define(int8);
|
||||
ktid_define(uint8);
|
||||
ktid_define(int16);
|
||||
ktid_define(uint16);
|
||||
ktid_define(int32);
|
||||
ktid_define(uint32);
|
||||
ktid_define(int64);
|
||||
ktid_define(uint64);
|
||||
|
||||
ktId_define(CharPtr);
|
||||
ktId_define(BoolPtr);
|
||||
ktId_define(Float32Ptr);
|
||||
ktId_define(Float64Ptr);
|
||||
ktId_define(Int8Ptr);
|
||||
ktId_define(UInt8Ptr);
|
||||
ktId_define(Int16Ptr);
|
||||
ktId_define(UInt16Ptr);
|
||||
ktId_define(Int32Ptr);
|
||||
ktId_define(UInt32Ptr);
|
||||
ktId_define(Int64Ptr);
|
||||
ktId_define(UInt64Ptr);
|
||||
|
||||
ktId_define(ktDescriptor);
|
||||
ktId_define(ktDescriptorPtr);
|
||||
ktid_define(ktDescriptor);
|
||||
|
||||
// type descriptors are stored here during initialization
|
||||
Autoarr(ktDescriptor)* __ktDescriptors=NULL;
|
||||
// here type descriptors are stored when initialization is complited
|
||||
ktDescriptor* typeDescriptors=NULL;
|
||||
ktId ktId_last=-1;
|
||||
ktid ktid_last=-1;
|
||||
|
||||
typedef enum{
|
||||
NotInitialized, Initializing, Initialized
|
||||
@@ -55,22 +41,22 @@ void ktDescriptors_endInit(){
|
||||
typeDescriptors=Autoarr_toArray(__ktDescriptors);
|
||||
Autoarr_free(__ktDescriptors,true);
|
||||
if(typeDescriptors==NULL) throw(ERR_NULLPTR);
|
||||
kprintf("\e[92minitialized %u type descriptors\n", ktId_last);
|
||||
kprintf("\e[92minitialized %u type descriptors\n", ktid_last);
|
||||
}
|
||||
|
||||
void __kt_register(char* name, int16 size, void (*freeMembers)(void*), char* (*toString)(void*, uint32)){
|
||||
ktDescriptor typeDesc={
|
||||
.name=name,
|
||||
.size=size,
|
||||
.id=++ktId_last,
|
||||
.id=++ktid_last,
|
||||
.freeMembers=freeMembers,
|
||||
.toString=toString
|
||||
};
|
||||
Autoarr_add(__ktDescriptors, typeDesc);
|
||||
}
|
||||
|
||||
ktDescriptor ktDescriptor_get(ktId id){
|
||||
if(id>ktId_last) {
|
||||
ktDescriptor ktDescriptor_get(ktid id){
|
||||
if(id>ktid_last) {
|
||||
kprintf("\ntype id: %u\n",id);
|
||||
throw("invalid type id");
|
||||
}
|
||||
|
||||
@@ -5,55 +5,43 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#include "../std.h"
|
||||
#include "ktId.h"
|
||||
#include "ktid.h"
|
||||
#include "ktDescriptor.h"
|
||||
|
||||
extern ktId ktId_last;
|
||||
extern ktid ktid_last;
|
||||
void __kt_register(char* name, int16 size, void (*freeMembers)(void*), char* (*toString)(void*, uint32));
|
||||
|
||||
#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);\
|
||||
ID_VAR_NAME=ktId_last;
|
||||
#define kt_register(TYPE, FREE_MEMBERS_FUNC, TO_STRING_FUNC)\
|
||||
__kt_register(#TYPE, sizeof(TYPE), FREE_MEMBERS_FUNC, TO_STRING_FUNC);\
|
||||
ktid_##TYPE=ktid_last;\
|
||||
__kt_register(#TYPE "*", sizeof(TYPE), FREE_MEMBERS_FUNC, TO_STRING_FUNC);\
|
||||
ktid_##TYPE##_Ptr=ktid_last;
|
||||
|
||||
void ktDescriptors_beginInit();
|
||||
void ktDescriptors_endInit();
|
||||
|
||||
/// @param id id of registered type
|
||||
ktDescriptor ktDescriptor_get(ktId id);
|
||||
ktDescriptor ktDescriptor_get(ktid id);
|
||||
|
||||
// call it to free heap-allocated ktDescriptors array
|
||||
void ktDescriptors_free();
|
||||
|
||||
ktId_declare(Null);
|
||||
extern ktid ktid_Null;
|
||||
|
||||
ktId_declare(Char);
|
||||
ktId_declare(Bool);
|
||||
ktId_declare(Float32);
|
||||
ktId_declare(Float64);
|
||||
ktId_declare(Int8);
|
||||
ktId_declare(UInt8);
|
||||
ktId_declare(Int16);
|
||||
ktId_declare(UInt16);
|
||||
ktId_declare(Int32);
|
||||
ktId_declare(UInt32);
|
||||
ktId_declare(Int64);
|
||||
ktId_declare(UInt64);
|
||||
ktid_declare(char);
|
||||
ktid_declare(bool);
|
||||
ktid_declare(float32);
|
||||
ktid_declare(float64);
|
||||
ktid_declare(int8);
|
||||
ktid_declare(uint8);
|
||||
ktid_declare(int16);
|
||||
ktid_declare(uint16);
|
||||
ktid_declare(int32);
|
||||
ktid_declare(uint32);
|
||||
ktid_declare(int64);
|
||||
ktid_declare(uint64);
|
||||
|
||||
ktId_declare(CharPtr);
|
||||
ktId_declare(BoolPtr);
|
||||
ktId_declare(Float32Ptr);
|
||||
ktId_declare(Float64Ptr);
|
||||
ktId_declare(Int8Ptr);
|
||||
ktId_declare(UInt8Ptr);
|
||||
ktId_declare(Int16Ptr);
|
||||
ktId_declare(UInt16Ptr);
|
||||
ktId_declare(Int32Ptr);
|
||||
ktId_declare(UInt32Ptr);
|
||||
ktId_declare(Int64Ptr);
|
||||
ktId_declare(UInt64Ptr);
|
||||
|
||||
ktId_declare(ktDescriptor);
|
||||
ktId_declare(ktDescriptorPtr);
|
||||
ktid_declare(ktDescriptor);
|
||||
|
||||
#if __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "init.h"
|
||||
#include "ktId.h"
|
||||
#include "ktid.h"
|
||||
#include "ktDescriptor.h"
|
||||
#include "kt_functions.h"
|
||||
#include "unitype.h"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "../base.h"
|
||||
|
||||
ktId_define(Unitype);
|
||||
ktId_define(UnitypePtr);
|
||||
ktid_define(Unitype);
|
||||
|
||||
void Unitype_free(Unitype u){
|
||||
ktDescriptor type=ktDescriptor_get(u.typeId);
|
||||
@@ -29,15 +28,15 @@ char* toString_Unitype(void* _u, uint32 fmt){
|
||||
char* sprintuni(Unitype v){
|
||||
char* buf=malloc(BUFSIZE);
|
||||
ktDescriptor type=ktDescriptor_get(v.typeId);
|
||||
if(v.typeId==ktId_Null)
|
||||
if(v.typeId==ktid_Null)
|
||||
sprintf_s(buf, BUFSIZE, "{Null}");
|
||||
else if(v.typeId==ktId_Float64)
|
||||
else if(v.typeId==ktid_name(float64))
|
||||
sprintf_s(buf, BUFSIZE, "{%s : %lf}", type.name,v.Float64);
|
||||
else if(v.typeId==ktId_Bool || v.typeId==ktId_UInt64)
|
||||
else if(v.typeId==ktid_name(bool) || v.typeId==ktid_name(uint64))
|
||||
sprintf_s(buf, BUFSIZE, "{%s : " IFWIN("%llu", "%lu") "}", type.name,v.UInt64);
|
||||
else if(v.typeId==ktId_Int64)
|
||||
else if(v.typeId==ktid_name(int64))
|
||||
sprintf_s(buf, BUFSIZE, "{%s : " IFWIN("%lld", "%ld") "}", type.name,v.Int64);
|
||||
else if(v.typeId==ktId_CharPtr){
|
||||
else if(v.typeId==ktid_ptrName(char)){
|
||||
size_t newBUFSIZE=cptr_length(v.VoidPtr) + BUFSIZE/2;
|
||||
buf=realloc(buf, newBUFSIZE);
|
||||
sprintf_s(buf, BUFSIZE, "{%s : \"%s\"}", type.name,(char*)v.VoidPtr);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ktId.h"
|
||||
#include "ktid.h"
|
||||
|
||||
typedef struct Unitype{
|
||||
union {
|
||||
@@ -15,27 +15,26 @@ typedef struct Unitype{
|
||||
void* VoidPtr;
|
||||
char Bytes[8];
|
||||
};
|
||||
ktId typeId;
|
||||
ktid typeId;
|
||||
bool allocatedInHeap; // should Unitype_free call free() to VoidPtr*
|
||||
} Unitype;
|
||||
ktId_declare(Unitype);
|
||||
ktId_declare(UnitypePtr);
|
||||
ktid_declare(Unitype);
|
||||
|
||||
|
||||
#define __UniDef(TYPE, VAL) (Unitype){\
|
||||
.TYPE=VAL, .typeId=ktId_##TYPE, .allocatedInHeap=false}
|
||||
#define __UniDef(FIELD, TYPE, VAL) (Unitype){\
|
||||
.FIELD=VAL, .typeId=ktid_name(TYPE), .allocatedInHeap=false}
|
||||
|
||||
#define UniInt64(VAL) __UniDef(Int64, VAL)
|
||||
#define UniUInt64(VAL) __UniDef(UInt64, VAL)
|
||||
#define UniFloat64(VAL) __UniDef(Float64, VAL)
|
||||
#define UniBool(VAL) __UniDef(Bool, VAL)
|
||||
#define UniInt64(VAL) __UniDef(Int64, int64, VAL)
|
||||
#define UniUInt64(VAL) __UniDef(UInt64, uint64, VAL)
|
||||
#define UniFloat64(VAL) __UniDef(Float64, float64, VAL)
|
||||
#define UniBool(VAL) __UniDef(Bool, bool, VAL)
|
||||
|
||||
#define UniStack(ID_VAR_NAME, VAL) (Unitype){\
|
||||
.VoidPtr=VAL, .typeId=ID_VAR_NAME, .allocatedInHeap=false}
|
||||
#define UniHeap(ID_VAR_NAME, VAL) (Unitype){\
|
||||
.VoidPtr=VAL, .typeId=ID_VAR_NAME, .allocatedInHeap=true}
|
||||
#define UniStackPtr(TYPE, VAL) (Unitype){\
|
||||
.VoidPtr=VAL, .typeId=ktid_ptrName(TYPE), .allocatedInHeap=false}
|
||||
#define UniHeapPtr(TYPE, VAL) (Unitype){\
|
||||
.VoidPtr=VAL, .typeId=ktid_ptrName(TYPE), .allocatedInHeap=true}
|
||||
|
||||
#define UniNull UniStack(ktId_Null, NULL)
|
||||
#define UniNull (Unitype){.Int64=0, .typeId=ktid_Null, .allocatedInHeap=false}
|
||||
#define UniTrue UniBool(true)
|
||||
#define UniFalse UniBool(false)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user