diff --git a/core/klibc.c b/core/klibc.c index 5498b4d..8ba4cef 100644 --- a/core/klibc.c +++ b/core/klibc.c @@ -17,3 +17,41 @@ void *memset(void *src, int c, size_t n) } return src; } + +char * itoa( int value, char * str, int base ) +{ + char * rc; + char * ptr; + char * low; + // Check for supported base. + if ( base < 2 || base > 36 ) + { + *str = '\0'; + return str; + } + rc = ptr = str; + // Set '-' for negative decimals. + if ( value < 0 && base == 10 ) + { + *ptr++ = '-'; + } + // Remember where the numbers start. + low = ptr; + // The actual conversion. + do + { + // Modulo is negative for negative value. This trick makes abs() unnecessary. + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + value % base]; + value /= base; + } while ( value ); + // Terminating the string. + *ptr-- = '\0'; + // Invert the numbers. + while ( low < ptr ) + { + char tmp = *low; + *low++ = *ptr; + *ptr-- = tmp; + } + return rc; +} diff --git a/core/klibc.h b/core/klibc.h index 0b233c9..37fd102 100644 --- a/core/klibc.h +++ b/core/klibc.h @@ -1,5 +1,6 @@ #pragma once #include "stdarg.h" -void *memcpy(void *dest, const void *src, size_t n ); +void *memcpy(void *dest, const void *src, size_t n); void *memset(void *s, int c, size_t n); +char *itoa(int value, char *str, int base); diff --git a/drivers/vga.c b/drivers/vga.c index 5784717..6d2a9e1 100644 --- a/drivers/vga.c +++ b/drivers/vga.c @@ -104,6 +104,13 @@ void vprintf(const char *format, va_list ap) printInt(d); break; } + case 'x': { + char val[sizeof(int) * 2]; + int d = va_arg(ap, int); + itoa(d, val, 16); + printString(val); + break; + } case 'c': { int c = va_arg(ap, int); printChar((char)c);