mirror of
https://github.com/CIS-osdev/kernel
synced 2025-05-12 14:48:07 +03:00
69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
#include "khal.h"
|
|
#include <stdarg.h>
|
|
#include <stdint.h>
|
|
|
|
static char *itoa(uint64_t value, char *buf, uint8_t base) {
|
|
char *ptr = buf;
|
|
uint64_t temp = value;
|
|
do {
|
|
uint64_t digit = temp % base;
|
|
if (digit < 10)
|
|
*ptr = '0' + digit;
|
|
else
|
|
*ptr = 'A' + (digit - 10);
|
|
ptr++;
|
|
temp /= base;
|
|
} while (temp);
|
|
*ptr = '\0';
|
|
// Reverse the string
|
|
char *start = buf;
|
|
char *end = ptr - 1;
|
|
while (start < end) {
|
|
char tmp = *start;
|
|
*start = *end;
|
|
*end = tmp;
|
|
start++;
|
|
end--;
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
// TODO: normalize
|
|
void __attribute__((format(printf, 1, 2))) serial_printf(const char *fmt, ...) {
|
|
char buf[32];
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
while (*fmt) {
|
|
if (*fmt == '%') {
|
|
fmt++;
|
|
switch (*fmt) {
|
|
case 's': {
|
|
char *str = va_arg(args, char *);
|
|
while (*str) serial_write_byte(*str++);
|
|
} break;
|
|
case 'd': {
|
|
int64_t num = va_arg(args, int64_t);
|
|
itoa(num, buf, 10);
|
|
serial_printf("%s", buf);
|
|
} break;
|
|
case 'u': {
|
|
uint64_t num = va_arg(args, uint64_t);
|
|
itoa(num, buf, 10);
|
|
serial_printf("%s", buf);
|
|
} break;
|
|
case 'x': {
|
|
uint64_t num = va_arg(args, uint64_t);
|
|
itoa(num, buf, 16);
|
|
serial_printf("%s", buf);
|
|
} break;
|
|
case 'c': serial_write_byte(va_arg(args, int)); break;
|
|
default: serial_write_byte(*fmt); break;
|
|
}
|
|
fmt++;
|
|
} else {
|
|
serial_write_byte(*fmt++);
|
|
}
|
|
}
|
|
va_end(args);
|
|
}
|