forked from PoliEcho-holding-org/kern
43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
#include <kernel.h>
|
|
#include <serial.h>
|
|
#include <stdarg.h>
|
|
#include <ctype.h>
|
|
|
|
uint8_t console_loglevel = CONSOLE_LOGLEVEL;
|
|
|
|
int printk(const char *fmt, ...) {
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
int ret = vprintk(fmt, ap);
|
|
va_end(ap);
|
|
return ret;
|
|
}
|
|
|
|
int vprintk(const char* fmt, va_list ap) {
|
|
int loglevel = LOGLEVEL_DEFAULT;
|
|
if (*fmt == KERN_SOH_ASCII) {
|
|
fmt++;
|
|
if (isdigit(*fmt)) loglevel = *fmt++ - '0';
|
|
}
|
|
|
|
if (loglevel > console_loglevel) return 0;
|
|
|
|
// Loglevel colors
|
|
switch (loglevel) {
|
|
case LOGLEVEL_EMERG: debugf("\x1b[1;31m"); break; // bold red
|
|
case LOGLEVEL_ALERT: debugf("\x1b[1;31m"); break; // bold red
|
|
case LOGLEVEL_CRIT: debugf("\x1b[31m"); break; // red
|
|
case LOGLEVEL_ERROR: debugf("\x1b[31m"); break; // red
|
|
case LOGLEVEL_WARNING: debugf("\x1b[33m"); break; // yellow
|
|
case LOGLEVEL_NOTICE: debugf("\x1b[34m"); break; // green
|
|
case LOGLEVEL_INFO: debugf("\x1b[37m"); break; // white
|
|
case LOGLEVEL_DEBUG: debugf("\x1b[2;32m"); break; // green
|
|
}
|
|
|
|
// TODO: debugf("[%4d.%6d] ", seconds, milliseconds);
|
|
int ret = vdebugf(fmt, ap);
|
|
debugf("\x1b[0m");
|
|
return ret;
|
|
}
|
|
|