#include "print.h" #include "stream.h" #include extern print_stream_t* kout; static char* hex_chars = "0123456789abcdef"; static void kprint(const char *str) { while (*str) { kout->putchar(*str); str++; } } static void kputd(int d) { if (d == 0) { kout->putchar('0'); return; } char buffer[12]; int i = 0; while (d > 0) { buffer[i++] = '0' + (d % 10); d /= 10; } for (int j = i - 1; j >= 0; j--) { kout->putchar(buffer[j]); } } static void kputx(unsigned int x) { if (x == 0) { kout->putchar('0'); return; } char buffer[8]; int i = 0; while (x > 0) { buffer[i++] = hex_chars[x & 0xF]; x >>= 4; } for (int j = i - 1; j >= 0; j--) { kout->putchar(buffer[j]); } } void kputc(const char c) { kout->putchar(c); } void kprintf(const char* fmt, ...) { va_list args; va_start(args, fmt); while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt) { case 's': { const char* str = va_arg(args, const char*); kprint(str); break; } case 'd': { int d = va_arg(args, int); kputd(d); break; } case 'x': { unsigned int x = va_arg(args, unsigned int); kputx(x); break; } case '%': kout->putchar('%'); break; default: kout->putchar('%'); kout->putchar(*fmt); break; } fmt++; } else { kout->putchar(*fmt); fmt++; } } va_end(args); }