diff --git a/src/base/kprint/kprint.c b/src/base/kprint/kprint.c index 1323c3c..2fb60a8 100644 --- a/src/base/kprint/kprint.c +++ b/src/base/kprint/kprint.c @@ -1,22 +1,112 @@ #include "../base.h" +#include "../../String/StringBuilder.h" +Maybe __next_toString(uint16 size, va_list args, StringBuilder* strb){ + kprint_format format=va_arg(args, kprint_format); + if(!format.dataFmtSet) + safethrow("format is not set", StringBuilder_free(strb)); + // detecting type + if(!format.typeId) switch(format.dataFmt){ + case kprint_fmtInt: + case kprint_fmtHex: + case kprint_fmtBin: + switch(size){ + case 1: format.typeId=kerepTypeId_Int8; break; + case 2: format.typeId=kerepTypeId_Int16; break; + case 4: format.typeId=kerepTypeId_Int32; break; + case 8: format.typeId=kerepTypeId_Int64; break; + default: safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + } + break; + case kprint_fmtUInt: + switch(size){ + case 1: format.typeId=kerepTypeId_UInt8; break; + case 2: format.typeId=kerepTypeId_UInt16; break; + case 4: format.typeId=kerepTypeId_UInt32; break; + case 8: format.typeId=kerepTypeId_UInt64; break; + default: safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + } + break; + case kprint_fmtFloat: + switch(size){ + case 4: format.typeId=kerepTypeId_Float32; break; + case 8: format.typeId=kerepTypeId_Float64; break; + default: safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + } + break; + case kprint_fmtChar: + if(size!=1) + safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + format.typeId=kerepTypeId_Char; + break; + case kprint_fmtString: + switch(size){ + case sizeof(char*): format.typeId=kerepTypeId_CharPtr; break; + case sizeof(string): format.typeId=kerepTypeId_string; break; + default: safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + } + break; + default: + safethrow("typeId is not set, can't autodetect type", StringBuilder_free(strb)); + } + try(kerepTypeDescriptor_get(format.typeId),mtd,StringBuilder_free(strb)); + kerepTypeDescriptor typeDesc=*(kerepTypeDescriptor*)mtd.value.VoidPtr; + if(size