formatting

This commit is contained in:
Liam Kerr 2026-02-09 18:55:51 +00:00
parent 821716adcc
commit 9e91024f35
9 changed files with 295 additions and 199 deletions

View file

@ -3,43 +3,54 @@
#include <stdarg.h>
#include <drivers/uart.h>
void uart_put(size_t base_addr, uint8_t data) {
void uart_put(size_t base_addr, uint8_t data)
{
*(volatile uint8_t *)base_addr = data;
}
int kputchar(int ch) {
int kputchar(int ch)
{
uart_put(UART_ADDRESS, ch);
return ch;
}
void kprint(const char *str) {
while (*str) {
void kprint(const char *str)
{
while (*str)
{
kputchar(*str++);
}
}
void kprint_int(int num) {
void kprint_int(int num)
{
char buffer[21];
int i = 0;
if (num == 0) {
if (num == 0)
{
kputchar('0');
return;
}
if (num < 0) {
if (num < 0)
{
kputchar('-');
num = -num;
}
while (num > 0) {
while (num > 0)
{
buffer[i++] = '0' + (num % 10);
num /= 10;
}
while (i > 0) {
while (i > 0)
{
kputchar(buffer[--i]);
}
}
void kprint_float(float num) {
if (num < 0) {
void kprint_float(float num)
{
if (num < 0)
{
kputchar('-');
num = -num;
}
@ -47,73 +58,88 @@ void kprint_float(float num) {
float frac_part = num - int_part;
kprint_int(int_part);
kputchar('.');
for (int i = 0; i < 6; i++) {
for (int i = 0; i < 6; i++)
{
frac_part *= 10.0f;
}
int fraction = (int)(frac_part + 0.5f); // Round to nearest
kprint_int(fraction);
}
void kprint_hex(uint64_t val) {
char *digits = "0123456789ABCDEF";
char buffer[17]; // 64-bit hex is 16 chars
void kprint_hex(uint64_t val)
{
char *digits = "0123456789ABCDEF";
char buffer[17]; // 64-bit hex is 16 chars
buffer[16] = '\0'; // Null-terminate the string
// We process from right to left
for (int i = 15; i >= 0; i--) {
buffer[i] = digits[val & 0xF];
val >>= 4;
}
// We process from right to left
for (int i = 15; i >= 0; i--)
{
buffer[i] = digits[val & 0xF];
val >>= 4;
}
kprint("0x");
kprint(buffer);
kprint(buffer);
}
void knewline(void) {
void knewline(void)
{
kputchar('\n');
}
void kputs(const char *str) {
void kputs(const char *str)
{
kprint(str);
knewline();
}
void kprintf(const char *format, ...) {
void kprintf(const char *format, ...)
{
va_list args;
va_start(args, format);
for(char *p = format; *p != '\0'; p++) {
if (*p == '%') {
for (char *p = format; *p != '\0'; p++)
{
if (*p == '%')
{
p++;
switch (*p) {
case 's': {
char *s = va_arg(args, char *);
kprint(s);
break;
}
case 'd': {
int d = va_arg(args, int);
kprint_int(d);
break;
}
case 'f': {
double f = va_arg(args, double);
kprint_float((float)f);
break;
}
case 'x': // Hex
case 'p': { // Pointer
uint64_t x = va_arg(args, uint64_t);
kprint_hex(x);
break;
}
case '%':
kputchar('%');
break;
default:
kputchar('%');
kputchar(*p);
switch (*p)
{
case 's':
{
char *s = va_arg(args, char *);
kprint(s);
break;
}
} else {
case 'd':
{
int d = va_arg(args, int);
kprint_int(d);
break;
}
case 'f':
{
double f = va_arg(args, double);
kprint_float((float)f);
break;
}
case 'x': // Hex
case 'p':
{ // Pointer
uint64_t x = va_arg(args, uint64_t);
kprint_hex(x);
break;
}
case '%':
kputchar('%');
break;
default:
kputchar('%');
kputchar(*p);
}
}
else
{
kputchar(*p);
}
}