154 lines
5.3 KiB
C
154 lines
5.3 KiB
C
#include "types.h"
|
|
#include "errors.h"
|
|
#include "../Autoarr/Autoarr.h"
|
|
#include "../Hashtable/Hashtable.h"
|
|
#include "../SearchTree/SearchTree.h"
|
|
|
|
const char* my_type_name(my_type t){
|
|
switch (t) {
|
|
case Null: return "Null";
|
|
case Float64: return "Float64";
|
|
case Float32: return "Float32";
|
|
case Bool: return "Bool";
|
|
case Char: return "Char";
|
|
case Int8: return "Int8";
|
|
case UInt8: return "UInt8";
|
|
case Int16: return "Int16";
|
|
case UInt16: return "UInt16";
|
|
case Int32: return "Int32";
|
|
case UInt32: return "UInt32";
|
|
case Int64: return "Int64";
|
|
case UInt64: return "UInt64";
|
|
case Int8Ptr: return "Int8Ptr";
|
|
case UInt8Ptr: return "UInt8Ptr";
|
|
case Int16Ptr: return "Int16Ptr";
|
|
case UInt16Ptr: return "UInt16Ptr";
|
|
case Int32Ptr: return "Int32Ptr";
|
|
case UInt32Ptr: return "UInt32Ptr";
|
|
case Int64Ptr: return "Int64Ptr";
|
|
case UInt64Ptr: return "UInt64Ptr";
|
|
case CharPtr: return "CharPtr";
|
|
case STNodePtr: return "STNodePtr";
|
|
case HashtablePtr: return "HashtablePtr";
|
|
case UniversalType: return "Unitype";
|
|
case AutoarrInt8Ptr: return "AutoarrInt8Ptr";
|
|
case AutoarrUInt8Ptr: return "AutoarrUInt8Ptr";
|
|
case AutoarrInt16Ptr: return "AutoarrInt16Ptr";
|
|
case AutoarrUInt16Ptr: return "AutoarrUInt16Ptr";
|
|
case AutoarrInt32Ptr: return "AutoarrInt32Ptr";
|
|
case AutoarrUInt32Ptr: return "AutoarrUInt32Ptr";
|
|
case AutoarrInt64Ptr: return "AutoarrInt64Ptr";
|
|
case AutoarrUInt64Ptr: return "AutoarrUInt64Ptr";
|
|
case AutoarrUnitypePtr: return "AutoarrUnitypePtr";
|
|
case AutoarrKVPairPtr: return "AutoarrKVPairPtr";
|
|
default: throw(ERR_WRONGTYPE); return "ERROR";
|
|
}
|
|
}
|
|
|
|
// frees VoidPtr value or does nothing if type isn't pointer
|
|
void Unitype_free(Unitype u){
|
|
switch (u.type) {
|
|
case Null:
|
|
case Float32:
|
|
case Float64:
|
|
case Char:
|
|
case Bool:
|
|
case Int8:
|
|
case UInt8:
|
|
case Int16:
|
|
case UInt16:
|
|
case Int32:
|
|
case UInt32:
|
|
case Int64:
|
|
case UInt64:
|
|
break;
|
|
case Int8Ptr:
|
|
case UInt8Ptr:
|
|
case Int16Ptr:
|
|
case UInt16Ptr:
|
|
case Int32Ptr:
|
|
case UInt32Ptr:
|
|
case Int64Ptr:
|
|
case UInt64Ptr:
|
|
case CharPtr:
|
|
free(u.VoidPtr);
|
|
break;
|
|
case HashtablePtr:
|
|
Hashtable_free(u.VoidPtr);
|
|
break;
|
|
case STNodePtr:
|
|
STNode_free(u.VoidPtr);
|
|
break;
|
|
case AutoarrInt8Ptr:
|
|
__Autoarr_free_int8(u.VoidPtr);
|
|
break;
|
|
case AutoarrUInt8Ptr:
|
|
__Autoarr_free_uint8(u.VoidPtr);
|
|
break;
|
|
case AutoarrInt16Ptr:
|
|
__Autoarr_free_int16(u.VoidPtr);
|
|
break;
|
|
case AutoarrUInt16Ptr:
|
|
__Autoarr_free_uint16(u.VoidPtr);
|
|
break;
|
|
case AutoarrInt32Ptr:
|
|
__Autoarr_free_int32(u.VoidPtr);
|
|
break;
|
|
case AutoarrUInt32Ptr:
|
|
__Autoarr_free_uint32(u.VoidPtr);
|
|
break;
|
|
case AutoarrInt64Ptr:
|
|
__Autoarr_free_int64(u.VoidPtr);
|
|
break;
|
|
case AutoarrUInt64Ptr:
|
|
__Autoarr_free_uint64(u.VoidPtr);
|
|
break;
|
|
case AutoarrUnitypePtr:
|
|
Autoarr_free_Unitype(u.VoidPtr);
|
|
break;
|
|
case AutoarrKVPairPtr:
|
|
Autoarr_free_KVPair(u.VoidPtr);
|
|
break;
|
|
default: throw(ERR_WRONGTYPE);
|
|
}
|
|
}
|
|
|
|
#define BUFSIZE 64
|
|
char* sprintuni(Unitype v){
|
|
char* buf=malloc(BUFSIZE);
|
|
IFWIN(
|
|
switch (v.type) {
|
|
case Null: sprintf_s(buf, BUFSIZE, "{Null}");break;
|
|
case Float64: sprintf_s(buf, BUFSIZE, "{%s : %lf}", my_type_name(v.type),v.Float64);break;
|
|
case Bool:
|
|
case UInt64: sprintf_s(buf, BUFSIZE, "{%s : %lu}", my_type_name(v.type),v.UInt64);break;
|
|
case Int64: sprintf_s(buf, BUFSIZE, "{%s : %ld}", my_type_name(v.type),v.Int64);break;
|
|
case CharPtr: ;
|
|
size_t newBUFSIZE=cptr_length(v.VoidPtr) + BUFSIZE/2;
|
|
buf=realloc(buf, newBUFSIZE);
|
|
sprintf_s(buf, newBUFSIZE, "{%s : \"%s\"}", my_type_name(v.type),(char*)v.VoidPtr);
|
|
break;
|
|
default: sprintf_s(buf, BUFSIZE, "{%s : %p}", my_type_name(v.type),v.VoidPtr);break;
|
|
},
|
|
switch (v.type) {
|
|
case Null: sprintf(buf, "{Null}");break;
|
|
case Float64: sprintf(buf, "{%s : %lf}", my_type_name(v.type),v.Float64);break;
|
|
case Bool:
|
|
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: ;
|
|
size_t newBUFSIZE=cptr_length(v.VoidPtr) + BUFSIZE/2;
|
|
buf=realloc(buf, newBUFSIZE);
|
|
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;
|
|
}
|
|
);
|
|
return buf;
|
|
}
|
|
|
|
void printuni(Unitype v){
|
|
char* s=sprintuni(v);
|
|
fputs(s, stdout);
|
|
free(s);
|
|
} |