formatting
This commit is contained in:
parent
821716adcc
commit
9e91024f35
9 changed files with 295 additions and 199 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue