...
This commit is contained in:
35
src/kernel.c
35
src/kernel.c
@@ -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);
|
||||||
|
|||||||
101
src/string.c
101
src/string.c
@@ -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';
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
Reference in New Issue
Block a user