print: add support for uint64_t hexadecimal

This commit is contained in:
King Kévin 2017-12-13 14:01:05 +01:00
parent dba76454af
commit ed0245ae54
2 changed files with 32 additions and 7 deletions

View File

@ -159,7 +159,7 @@ static size_t print_nibble(char** str, size_t* size, uint8_t nibble, bool upcase
* @param[in] upcase use upcase digits (A-F)
* @return number of characters printed
**/
static size_t print_hex(char** str, size_t* size, uint32_t hex, uint32_t padding, bool prefix, bool upcase) {
static size_t print_hex(char** str, size_t* size, uint64_t hex, uint32_t padding, bool prefix, bool upcase) {
size_t length = 0; // number of characters printed
if (prefix) { // print 0x prefix
print_printed(&length, print_char(str, size, '0'));
@ -167,11 +167,19 @@ static size_t print_hex(char** str, size_t* size, uint32_t hex, uint32_t padding
}
uint8_t digits = 0; // number of digits to print
// figure out number of digits to print
if (hex>0x00ffffff) {
if (hex>0xffffffffffffffUL) {
digits = 16;
} else if (hex>0xffffffffffffUL) {
digits = 14;
} else if (hex>0xffffffffffUL) {
digits = 12;
} else if (hex>0xffffffffUL) {
digits = 10;
} else if (hex>0xffffffUL) {
digits = 8;
} else if (hex>0x0000ffff) {
} else if (hex>0xffffUL) {
digits = 6;
} else if (hex>0x000000ff) {
} else if (hex>0xffUL) {
digits = 4;
} else {
digits = 2;
@ -287,12 +295,18 @@ static size_t vsnprintf(char** str, size_t* size, const char *format, va_list va
case 'c': // for char, unsigned char
print_printed(&length, print_char(str, size, (char)(va_arg(va,int)))); // needs casting because the returned value is promoted
break;
case 'x': // for downcase hexadecimal
case 'x': // for uint8_t, uint16_t, uint32_t downcase hexadecimal
print_printed(&length, print_hex(str, size, va_arg(va,uint32_t), padding, sign, false));
break;
case 'X': // for upcase hexadecimal
case 'X': // for uint64_t downcase hexadecimal
print_printed(&length, print_hex(str, size, va_arg(va,uint64_t), padding, sign, false));
break;
case 'h': // for uint8_t, uint16_t, uint32_t upcase hexadecimal
print_printed(&length, print_hex(str, size, va_arg(va,uint32_t), padding, sign, true));
break;
case 'H': // for uint64_t upcase hexadecimal
print_printed(&length, print_hex(str, size, va_arg(va,uint64_t), padding, sign, true));
break;
case 'b': // for bits
print_printed(&length, print_bits(str, size, va_arg(va,uint32_t), padding, sign));
break;

View File

@ -14,7 +14,18 @@
*/
/** printing utilities to replace the large printf from the standard library (API)
* @note use % as format specifier prefix, followed by + to enforce sign or 0x prefix, 0 followed by n for padding, . followed by n for number for fractional, and format specifier
* format specifier supported are: c for far, s for string, u for uint32_t, d for int32_t, U for uint64_t, D for int64_t, x for lower case hex up to uint32_t, X for upper case hex up to uint32_t, b for bits up to uint32_t
* format specifier supported are:
* - c for character
* - s for string
* - u up to uint32_t
* - U for uint64_t
* - d up to int32_t
* - D for int64_t
* - x for lower case hex up to uint32_t
* - X for lower case hex for uint64_t
* - h for upper case hex up to uint32_t
* - H for upper case hex for uint64_t
* - b for bits up to uint32_t
* @file print.h
* @author King Kévin <kingkevin@cuvoodoo.info>
* @date 2017