From 121f492b8463b600ed625035245415d9d3ab06b5 Mon Sep 17 00:00:00 2001 From: timerix Date: Mon, 24 Oct 2022 19:13:04 +0600 Subject: [PATCH] kprintf color parse --- src/kprint/kprint.c | 4 +-- src/kprint/kprintf.c | 70 ++++++++++++++++++++++++++++++++++++++++++-- tests/main.cpp | 4 +-- 3 files changed, 70 insertions(+), 8 deletions(-) diff --git a/src/kprint/kprint.c b/src/kprint/kprint.c index d8d609b..907e208 100644 --- a/src/kprint/kprint.c +++ b/src/kprint/kprint.c @@ -139,13 +139,13 @@ void kprint_setColor(kprint_format f){ uint8 fg=(f&0x0f000000)>>24; if(fg<8) fg+=30; else fg+=90-8; - kprintf("\e[%um", fg); + printf("\e[%um", fg); } if(kprint_format_bgColorChanged(f)){ uint8 bg=(f&0x00f00000)>>20; if(bg<8) bg+=40; else bg+=100-8; - kprintf("\e[%um", bg); + printf("\e[%um", bg); } } #endif diff --git a/src/kprint/kprintf.c b/src/kprint/kprintf.c index b5facc4..2208b3d 100644 --- a/src/kprint/kprintf.c +++ b/src/kprint/kprintf.c @@ -2,11 +2,56 @@ #include "../base/base.h" #include "../base/type_system/base_toString.h" +#if defined(_WIN64) || defined(_WIN32) +#include + +DWORD unixColorToWin(uint8 c){ + switch(c){ + //foreground + case 30: return 0; + case 31: return FOREGROUND_RED; + case 32: return FOREGROUND_GREEN; + case 33: return FOREGROUND_GREEN | FOREGROUND_RED; + case 34: return FOREGROUND_BLUE; + case 35: return FOREGROUND_RED | FOREGROUND_BLUE; + case 36: return FOREGROUND_BLUE | FOREGROUND_GREEN; + case 37: return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; + case 90: return FOREGROUND_INTENSITY; + case 91: return FOREGROUND_RED | FOREGROUND_INTENSITY; + case 92: return FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case 93: return FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY; + case 94: return FOREGROUND_BLUE | FOREGROUND_INTENSITY; + case 95: return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY; + case 96: return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + case 97: return FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; + //background + case 40: return 0; + case 41: return BACKGROUND_RED; + case 42: return BACKGROUND_GREEN; + case 43: return BACKGROUND_GREEN | BACKGROUND_RED; + case 44: return BACKGROUND_BLUE; + case 45: return BACKGROUND_RED | BACKGROUND_BLUE; + case 46: return BACKGROUND_BLUE | BACKGROUND_GREEN; + case 47: return BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED; + case 100: return BACKGROUND_INTENSITY; + case 101: return BACKGROUND_RED | BACKGROUND_INTENSITY; + case 102: return BACKGROUND_GREEN | BACKGROUND_INTENSITY; + case 103: return BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY; + case 104: return BACKGROUND_BLUE | BACKGROUND_INTENSITY; + case 105: return BACKGROUND_BLUE | BACKGROUND_RED | BACKGROUND_INTENSITY; + case 106: return BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY; + case 107: return BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY; + default: return 0; + } +} +#endif + void kprintf(const char* format, ...){ va_list vl; va_start(vl, format); char c; while((c=*format++)){ + iteration_start: if(c=='%'){ char* argstr=NULL; c=*format++; @@ -48,7 +93,7 @@ void kprintf(const char* format, ...){ break; case 'c': argstr=malloc(2); - argstr[0]=va_arg(vl,char); + argstr[0]=(char)va_arg(vl,int); argstr[1]=0; break; default: @@ -61,10 +106,29 @@ void kprintf(const char* format, ...){ } else if(c=='\e'){ IFWIN( ({ - + if((c=*format++)=='['){ + uint16 colorUnix=0; + for(int8 i=0; i<6 && c!=0; i++){ + c=*format++; + switch (c){ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + colorUnix=colorUnix*10+c-'0'; + break; + case 'm': + DWORD colorWin=unixColorToWin(colorUnix); + HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + SetConsoleTextAttribute(hConsole, colorWin); + c=*format++; + goto iteration_start; + default: + goto iteration_start; + } + } + } }), putc(c,stdout); - ) + ); } else { putc(c,stdout); } diff --git a/tests/main.cpp b/tests/main.cpp index d14e62c..e36df44 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -19,9 +19,7 @@ int main(){ ktDescriptors_initKerepTypes(); ktDescriptors_endInit(); kprintf("\e[97mkerep tests are starting!\n"); - // optime("test_all",1,test_all()); - test_rng_algorithms(); - test_kprint_colors(); + optime("test_all",1,test_all()); ktDescriptors_free(); kprintf("\e[0m\n"); return 0;