This commit is contained in:
nub31
2025-09-01 20:28:02 +02:00
parent 1ed52d1e9e
commit 7c6ff5d52d
3 changed files with 86 additions and 60 deletions

View File

@@ -8,12 +8,10 @@
void kmain()
{
vga_clear();
pic_remap();
enable_interrupts();
kprintf("\nWelcome to nub OS\n");
kprintf("Welcome to nub OS\n");
khalt();
}
@@ -28,12 +26,18 @@ void kprintf(const char* fmt, ...)
va_list args;
va_start(args, fmt);
bool should_format = false;
for (size_t i = 0; fmt[i] != '\0'; i++)
{
if (fmt[i] == '%')
if (should_format)
{
i++;
if (fmt[i] == 's')
should_format = false;
if (fmt[i] == '%')
{
vga_put_char('%', 0x0F);
}
else if (fmt[i] == 's')
{
const char* str = va_arg(args, const char*);
for (size_t j = 0; str[j] != '\0'; j++)
@@ -43,20 +47,29 @@ void kprintf(const char* fmt, ...)
}
else if (fmt[i] == 'd')
{
int val = va_arg(args, int);
char buf[12];
itoa(val, buf);
int64_t val = va_arg(args, int64_t);
char buf[21];
itoa64(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++)
{
vga_put_char(buf[j], 0x0F);
}
}
else
else if (fmt[i] == 'u')
{
vga_put_char('%', 0x0F);
vga_put_char(fmt[i], 0x0F);
uint64_t val = va_arg(args, uint64_t);
char buf[21];
uitoa64(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++)
{
vga_put_char(buf[j], 0x0F);
}
}
}
else if (fmt[i] == '%')
{
should_format = true;
}
else
{
vga_put_char(fmt[i], 0x0F);

View File

@@ -25,64 +25,77 @@ void reverse(char* str, size_t length)
}
}
int uitoa(uint64_t value, char* buffer)
void itoa64(int64_t value, char* buffer)
{
int i = 0;
if (value == 0)
{
buffer[i++] = '0';
buffer[i] = '\0';
return i;
}
while (value > 0)
{
buffer[i++] = (value % 10) + '0';
value /= 10;
}
buffer[i] = '\0';
reverse(buffer, i);
return i;
}
int itoa(int64_t value, char* buffer)
{
int i = 0;
if (value == 0)
{
buffer[i++] = '0';
buffer[i] = '\0';
return i;
}
bool negative = false;
uint64_t v;
char temp[21];
int i = 0, j = 0;
int negative = 0;
if (value < 0)
{
negative = true;
v = (uint64_t)(-value);
}
else
{
v = (uint64_t)value;
negative = 1;
if (value == INT64_MIN)
{
const char* min_str = "9223372036854775808";
for (i = 0; min_str[i] != '\0'; i++)
temp[i] = min_str[i];
i = 19;
}
else
{
value = -value;
}
}
while (v > 0)
if (value == 0 && !negative)
{
buffer[i++] = (v % 10) + '0';
v /= 10;
buffer[0] = '0';
buffer[1] = '\0';
return;
}
if (!(negative && value == INT64_MIN))
{
while (value > 0)
{
temp[i++] = '0' + (value % 10);
value /= 10;
}
}
if (negative)
{
buffer[i++] = '-';
temp[i++] = '-';
}
buffer[i] = '\0';
reverse(buffer, i);
while (i > 0)
{
buffer[j++] = temp[--i];
}
buffer[j] = '\0';
}
return i;
void uitoa64(uint64_t value, char* buffer)
{
char temp[21];
int i = 0, j = 0;
if (value == 0)
{
buffer[0] = '0';
buffer[1] = '\0';
return;
}
while (value > 0)
{
temp[i++] = '0' + (value % 10);
value /= 10;
}
while (i > 0)
{
buffer[j++] = temp[--i];
}
buffer[j] = '\0';
}

View File

@@ -5,5 +5,5 @@
int strcmp(const char* a, const char* b);
void reverse(char* str, size_t length);
int uitoa(uint64_t value, char* buffer);
int itoa(int64_t value, char* buffer);
void uitoa64(uint64_t value, char* buffer);
void itoa64(int64_t value, char* buffer);