stdio: add intToString and make use of it in printf

This commit is contained in:
2025-03-15 13:06:30 +03:00
parent bacba9abf1
commit fe1264d55d
2 changed files with 62 additions and 1 deletions
+1 -1
View File
@@ -68,7 +68,7 @@ void create_descriptor(uint32_t base, uint32_t limit, uint16_t flag)
descriptor |= base << 16; // set base bits 15:0 descriptor |= base << 16; // set base bits 15:0
descriptor |= limit & 0x0000FFFF; // set limit bits 15:0 descriptor |= limit & 0x0000FFFF; // set limit bits 15:0
printf("0x%.16llX\n", descriptor); printf("GDT descriptor 0x%X flag: 0x%X\n", descriptor, flag);
} }
void gdt_install() void gdt_install()
+61
View File
@@ -22,6 +22,52 @@ int putchar(int ic) {
return ic; return ic;
} }
void intToString(int value, char *buffer, char format) {
int i = 0;
int isNegative = 0;
unsigned int uValue;
if (format == 'd') {
if (value < 0) {
isNegative = 1;
uValue = -value;
} else {
uValue = value;
}
do {
buffer[i++] = '0' + (uValue % 10);
uValue /= 10;
} while (uValue > 0);
if (isNegative) {
buffer[i++] = '-';
}
} else if (format == 'x' || format == 'X') {
uValue = (unsigned int)value;
do {
int digit = uValue % 16;
if (digit < 10) {
buffer[i++] = '0' + digit;
} else {
buffer[i++] = (format == 'x') ? ('a' + digit - 10) : ('A' + digit - 10);
}
uValue /= 16;
} while (uValue > 0);
} else {
buffer[0] = '\0';
return;
}
for (int j = 0; j < i / 2; j++) {
char temp = buffer[j];
buffer[j] = buffer[i - j - 1];
buffer[i - j - 1] = temp;
}
buffer[i] = '\0';
}
static bool print(const char* data, size_t length) { static bool print(const char* data, size_t length) {
const unsigned char* bytes = (const unsigned char*) data; const unsigned char* bytes = (const unsigned char*) data;
@@ -80,6 +126,21 @@ int printf(const char* restrict format, ...) {
if (!print(str, len)) if (!print(str, len))
return -1; return -1;
written += len; written += len;
} else if(*format == 'x' || *format == 'X') {
format++;
int number = va_arg(parameters, int);
char str[256];
if(*format == 'x')
intToString(number, str, 'x');
else
intToString(number, str, 'X');
size_t len = strlen(str);
if(!print(str, len))
return -1;
written += strlen(str);
} else { } else {
format = format_begun_at; format = format_begun_at;
size_t len = strlen(format); size_t len = strlen(format);