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() void kmain()
{ {
vga_clear(); vga_clear();
pic_remap(); pic_remap();
enable_interrupts(); enable_interrupts();
kprintf("\nWelcome to nub OS\n"); kprintf("Welcome to nub OS\n");
khalt(); khalt();
} }
@@ -28,12 +26,18 @@ void kprintf(const char* fmt, ...)
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
bool should_format = false;
for (size_t i = 0; fmt[i] != '\0'; i++) for (size_t i = 0; fmt[i] != '\0'; i++)
{ {
if (should_format)
{
should_format = false;
if (fmt[i] == '%') if (fmt[i] == '%')
{ {
i++; vga_put_char('%', 0x0F);
if (fmt[i] == 's') }
else if (fmt[i] == 's')
{ {
const char* str = va_arg(args, const char*); const char* str = va_arg(args, const char*);
for (size_t j = 0; str[j] != '\0'; j++) for (size_t j = 0; str[j] != '\0'; j++)
@@ -43,20 +47,29 @@ void kprintf(const char* fmt, ...)
} }
else if (fmt[i] == 'd') else if (fmt[i] == 'd')
{ {
int val = va_arg(args, int); int64_t val = va_arg(args, int64_t);
char buf[12]; char buf[21];
itoa(val, buf); itoa64(val, buf);
for (size_t j = 0; buf[j] != '\0'; j++) for (size_t j = 0; buf[j] != '\0'; j++)
{ {
vga_put_char(buf[j], 0x0F); vga_put_char(buf[j], 0x0F);
} }
} }
else else if (fmt[i] == 'u')
{ {
vga_put_char('%', 0x0F); uint64_t val = va_arg(args, uint64_t);
vga_put_char(fmt[i], 0x0F); 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 else
{ {
vga_put_char(fmt[i], 0x0F); 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; char temp[21];
if (value == 0) int i = 0, j = 0;
{ int negative = 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;
if (value < 0) if (value < 0)
{ {
negative = true; negative = 1;
v = (uint64_t)(-value); 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 else
{ {
v = (uint64_t)value; value = -value;
}
} }
while (v > 0) if (value == 0 && !negative)
{ {
buffer[i++] = (v % 10) + '0'; buffer[0] = '0';
v /= 10; buffer[1] = '\0';
return;
}
if (!(negative && value == INT64_MIN))
{
while (value > 0)
{
temp[i++] = '0' + (value % 10);
value /= 10;
}
} }
if (negative) if (negative)
{ {
buffer[i++] = '-'; temp[i++] = '-';
} }
buffer[i] = '\0'; while (i > 0)
reverse(buffer, i); {
buffer[j++] = temp[--i];
return i; }
buffer[j] = '\0';
}
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); int strcmp(const char* a, const char* b);
void reverse(char* str, size_t length); void reverse(char* str, size_t length);
int uitoa(uint64_t value, char* buffer); void uitoa64(uint64_t value, char* buffer);
int itoa(int64_t value, char* buffer); void itoa64(int64_t value, char* buffer);