#include #include #include #include #include #include void printk(const char *restrict format, ...) { va_list args; va_start(args, format); vprintk(format, args); va_end(args); } void vprintk(const char *restrict format, va_list args) { char buf[80]; for (; *format; format++) { if (*format == '%') { bool l = false; char c = *++format; if (c == 'l') { l = true; c = *++format; } switch(c) { case '%': putchar('%'); break; case 's': puts(va_arg(args, char*)); break; case 'c': putchar(va_arg(args, int)); break; case 'd': if (l) ltoa(va_arg(args, long long), buf, 10); else itoa(va_arg(args, int), buf, 10); puts(buf); break; case 'u': if (l) ultoa(va_arg(args, unsigned long long), buf, 10); else utoa(va_arg(args, unsigned int), buf, 10); puts(buf); break; case 'f': case 'F': ftoa(va_arg(args, double), buf); puts(buf); break; case 'x': case 'X': utoa(va_arg(args, unsigned int), buf, 16); puts(buf); break; case 'b': va_arg(args, int) ? puts("true") : puts("false"); break; case 'k': { static char disp[] = {'B', 'K', 'M', 'G'}; uint32_t size = va_arg(args, unsigned int); size_t i = 0; while (size / 1024 > 0) { size /= 1024; i++; } utoa(size, buf, 10); puts(buf); putchar(disp[i]); if (i > 0) putchar('B'); break; } default: break; } } else { putchar(*format); } } } void puts(const char *s) { for(; *s; s++) putchar(*s); }