stdio: add intToString and make use of it in printf
This commit is contained in:
@@ -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 |= 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()
|
||||
|
||||
+61
@@ -22,6 +22,52 @@ int putchar(int 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) {
|
||||
const unsigned char* bytes = (const unsigned char*) data;
|
||||
@@ -80,6 +126,21 @@ int printf(const char* restrict format, ...) {
|
||||
if (!print(str, len))
|
||||
return -1;
|
||||
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 {
|
||||
format = format_begun_at;
|
||||
size_t len = strlen(format);
|
||||
|
||||
Reference in New Issue
Block a user