implement %x in printf

This commit is contained in:
Mathieu Maret 2018-11-16 10:34:03 +01:00
parent ac64b124da
commit 50fa9b7d24
3 changed files with 47 additions and 1 deletions

View File

@ -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;
}

View File

@ -3,3 +3,4 @@
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);

View File

@ -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);