diff --git a/src/base/errors.c b/src/base/errors.c index e3f61a2..5adc0ee 100644 --- a/src/base/errors.c +++ b/src/base/errors.c @@ -12,6 +12,7 @@ char* errname(ErrorId err){ case ERR_NULLPTR: return "ERR_NULLPTR"; case ERR_ENDOFSTR: return "ERR_ENDOFSTR"; case ERR_KEYNOTFOUND: return "ERR_KEYNOTFOUND"; + case ERR_FORMAT: return "ERR_FORMAT"; default: return "UNKNOWN_ERROR"; } } diff --git a/src/base/kprint/README.md b/src/base/kprint/README.md index 6961b00..354d3bd 100644 --- a/src/base/kprint/README.md +++ b/src/base/kprint/README.md @@ -10,7 +10,7 @@ I don't really like printf function (and its variants), so i made safer and more ## how to use it: + **format construction:** ``` - kprint_format fmt= kprint_fgColor | kprint_fbgColor | kprint_fdataFmt | flags | ktId; + kprint_format fmt= kprint_fgColor | kprint_bgColor | kprint_fdataFmt | flags | ktId; ``` [more about `kprint_format`](kprint_format.md) + fgColor and bgColor can be set to change console output color diff --git a/src/base/kprint/kprint.c b/src/base/kprint/kprint.c index f099b69..744fc74 100644 --- a/src/base/kprint/kprint.c +++ b/src/base/kprint/kprint.c @@ -1,29 +1,37 @@ -/* #include "../base.h" +#include "../base.h" #include "../../String/StringBuilder.h" -Maybe __next_toString(kprint_format format, void* object){ - // detecting type - if(!format.typeId) switch((kprint_dataFormat)((uint32)0 | format.dataFmt)){ +ktId __typeFromFormat(kprint_format f){ + ktId typeId=kprint_format_ktId(f); + if(typeId) + return typeId; + switch(kprint_format_dataFormat(f)){ case kprint_fmtInt: case kprint_fmtHex: case kprint_fmtBin: - format.typeId=ktId_Int64; break; + return ktId_Int64; case kprint_fmtUInt: - format.typeId=ktId_UInt64; break; + return ktId_UInt64; case kprint_fmtFloat: - format.typeId=ktId_Float64; break; + return ktId_Float64; case kprint_fmtChar: - format.typeId=ktId_Char; break; + return ktId_Char; case kprint_fmtString: - format.typeId=ktId_CharPtr; break; + return ktId_CharPtr; default: - safethrow("typeId is not set, can't autodetect type",;); + return -1; } - ktDescriptor typeDesc=ktDescriptor_get(format.typeId); +} + +Maybe __next_toString(kprint_format f, void* object){ + // detecting type + ktId typeId=__typeFromFormat(f); + if(typeId==-1) + safethrow("typeId is not set, can't autodetect type",;); + ktDescriptor typeDesc=ktDescriptor_get(typeId); if(!typeDesc.toString) safethrow("type descriptor doesnt have toString() func",;); - try(typeDesc.toString(object, &format), mStr,;); - return SUCCESS(mStr.value); + return SUCCESS(UniHeap(ktId_CharPtr, typeDesc.toString(object, f))); } Maybe __ksprint(uint8 n, kprint_format* formats, void** objects){ @@ -43,6 +51,7 @@ Maybe __kfprint(FILE* file, uint8 n, kprint_format* formats, void** objects){ safethrow("can't write string to file", Unitype_free(maybeStr.value)); Unitype_free(maybeStr.value); } + fflush(file); return MaybeNull; } @@ -50,24 +59,94 @@ void __kprint(uint8 n, kprint_format* formats, void** objects){ for(uint8 i=0; i +#define FOREGROUND_YELLOW FOREGROUND_GREEN | FOREGROUND_RED + +DWORD kprint_fgColor_toWin(kprint_fgColor f){ + //printf("fg: %x\n", f); + switch(f){ + case kprint_fgBlack: return 0; + case kprint_fgDarkRed: return FOREGROUND_RED; + case kprint_fgDarkGreen: return FOREGROUND_GREEN; + case kprint_fgDarkYellow: return FOREGROUND_GREEN | FOREGROUND_RED; + case kprint_fgDarkBlue: return FOREGROUND_BLUE; + case kprint_fgDarkMagneta: return FOREGROUND_RED | FOREGROUND_BLUE; + case kprint_fgDarkCyan: return FOREGROUND_BLUE | FOREGROUND_GREEN; + case kprint_fgGray: return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; + case kprint_fgDarkGray: return FOREGROUND_INTENSITY; + case kprint_fgRed: return FOREGROUND_RED | FOREGROUND_INTENSITY; + case kprint_fgGreen: return FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case kprint_fgYellow: return FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; + case kprint_fgBlue: return FOREGROUND_BLUE | FOREGROUND_INTENSITY; + case kprint_fgMagneta: return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY; + case kprint_fgCyan: return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case kprint_fgWhite: return FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + default: throw(ERR_FORMAT); + } +} + +DWORD kprint_bgColor_toWin(kprint_bgColor f){ + //printf("bg: %x\n", f); + switch(f){ + case kprint_bgBlack: return 0; + case kprint_bgDarkRed: return BACKGROUND_RED; + case kprint_bgDarkGreen: return BACKGROUND_GREEN; + case kprint_bgDarkYellow: return BACKGROUND_GREEN | BACKGROUND_RED; + case kprint_bgDarkBlue: return BACKGROUND_BLUE; + case kprint_bgDarkMagneta: return BACKGROUND_RED | BACKGROUND_BLUE; + case kprint_bgDarkCyan: return BACKGROUND_BLUE | BACKGROUND_GREEN; + case kprint_bgGray: return BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; + case kprint_bgDarkGray: return BACKGROUND_INTENSITY; + case kprint_bgRed: return BACKGROUND_RED | BACKGROUND_INTENSITY; + case kprint_bgGreen: return BACKGROUND_GREEN | BACKGROUND_INTENSITY; + case kprint_bgYellow: return BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY; + case kprint_bgBlue: return BACKGROUND_BLUE | BACKGROUND_INTENSITY; + case kprint_bgMagneta: return BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY; + case kprint_bgCyan: return BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY; + case kprint_bgWhite: return BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY; + default: throw(ERR_FORMAT); + } +} void kprint_setColor(kprint_format f){ - if(!f.bgColorChanged | !f.fgColorChanged) + DWORD color=0; + if(!kprint_format_fgColorChanged(f) & !kprint_format_bgColorChanged(f)) return; + if(kprint_format_fgColorChanged(f)) + color+=kprint_fgColor_toWin(kprint_format_fgColor(f)); + if(kprint_format_bgColorChanged(f)) + color+=kprint_bgColor_toWin(kprint_format_bgColor(f)); + HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(hConsole, color); } +#else +void kprint_setColor(kprint_format f){ + if(kprint_format_fgColorChanged(f)){ + uint8 fg=(f&0x0f000000)>>24; + if(fg<8) fg+=30; + else fg+=90-8; + printf("\e[%um", fg); + } + if(kprint_format_bgColorChanged(f)){ + uint8 bg=(f&0x00f00000)>>20; + if(bg<8) bg+=40; + else bg+=100-8; + printf("\e[%um", bg); + } +} +#endif - - - -Maybe ksprint_ar(uint32 count, kprint_format format, ktId typeId, void* array){ +/* Maybe ksprint_ar(uint32 count, kprint_format format, ktId typeId, void* array){ ktDescriptor typeDesc=ktDescriptor_get(format.typeId); if(!typeDesc.toString) safethrow("type descriptor doesnt have toString() func",;); @@ -75,11 +154,11 @@ Maybe ksprint_ar(uint32 count, kprint_format format, ktId typeId, void* array){ StringBuilder_append_char(strb, '['); for (uint16 e=1; etypeId); char* valuestr=type.toString(_u, fmt); diff --git a/tests/main.cpp b/tests/main.cpp index 39d2405..35967c1 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -9,6 +9,7 @@ void test_all(){ test_hash_functions(); test_hashtable(); test_dtsod(); + test_kprint_colors(); printf("\e[96m--------------------------------------\e[0m\n"); } @@ -18,7 +19,8 @@ int main(){ ktDescriptors_initKerepTypes(); ktDescriptors_endInit(); printf("\e[97mkerep tests are starting!\n"); - optime("test_all",1,test_all()); + // optime("test_all",1,test_all()); + test_kprint_colors(); printf("\e[0m\n"); return 0; } diff --git a/tests/test_autoarr-vs-vector.cpp b/tests/test_autoarr-vs-vector.cpp index 1468463..37aba5e 100644 --- a/tests/test_autoarr-vs-vector.cpp +++ b/tests/test_autoarr-vs-vector.cpp @@ -4,7 +4,7 @@ int64 _autoarrVsVector(uint16 blockCount, uint16 blockLength){ uint32 count=blockLength*blockCount; - printf("\e[94mblock count: %u block length: %u count: %llu\n", blockCount, blockLength, (uint64)count); + printf("\e[94mblock count: %u block length: %u count: " IFWIN("%llu", "%lu") "\n", blockCount, blockLength, (uint64)count); Autoarr_int64* ar=Autoarr_create(int64, blockCount, blockLength); std::vector vec=std::vector(); optime("Autoarr_add", 1, ({ @@ -15,7 +15,7 @@ int64 _autoarrVsVector(uint16 blockCount, uint16 blockLength){ for(uint32 i=0; i< count; i++) vec.push_back(i); })); - int64 t; + int64 t=0; optime("Autoarr_get", 1, ({ for(uint32 i=0; i< count; i++) t=Autoarr_get(ar, i); diff --git a/tests/test_kprint_colors.c b/tests/test_kprint_colors.c new file mode 100644 index 0000000..e23b8d9 --- /dev/null +++ b/tests/test_kprint_colors.c @@ -0,0 +1,47 @@ +#include "tests.h" +#if defined(_WIN32)|| defined(_WIN64) + #include +#endif + +#define testColor(COLOR) \ + kprint_setColor(kprint_bgBlack | kprint_fg##COLOR);\ + printf(#COLOR " ");\ + kprint_setColor(kprint_bg##COLOR | kprint_fgGray);\ + printf(#COLOR);\ + kprint_setColor(kprint_bgBlack | kprint_fgBlack);\ + printf("\n"); + +void test_kprint_colors(){ + IFWIN( + ({ + HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + for(uint8 col=0; col<255; col++){ + SetConsoleTextAttribute(hConsole, col); + printf("%u ",col); + } + }), + ({ + for(uint8 col=0; col<255; col++) + printf("\e[%um%u ", col, col); + }) + ); + printf("\n"); + + testColor(Black); + testColor(DarkRed); + testColor(DarkGreen); + testColor(DarkYellow); + testColor(DarkBlue); + testColor(DarkMagneta); + testColor(DarkCyan); + testColor(Gray); + testColor(DarkGray); + testColor(Red); + testColor(Green); + testColor(Yellow); + testColor(Blue); + testColor(Magneta); + testColor(Cyan); + testColor(White); + kprint_setColor(kprint_bgBlack | kprint_fgGray); +} \ No newline at end of file