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 |= 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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user