@@ -155,7 +155,7 @@ typedef enum {
155155 */
156156static void mbed_minimal_formatted_string_signed (char * buffer , size_t length , int * result , MBED_SIGNED_STORAGE value );
157157static void mbed_minimal_formatted_string_unsigned (char * buffer , size_t length , int * result , MBED_UNSIGNED_STORAGE value );
158- static void mbed_minimal_formatted_string_hexadecimal (char * buffer , size_t length , int * result , MBED_UNSIGNED_STORAGE value );
158+ static void mbed_minimal_formatted_string_hexadecimal (char * buffer , size_t length , int * result , MBED_UNSIGNED_STORAGE value , bool upper );
159159static void mbed_minimal_formatted_string_void_pointer (char * buffer , size_t length , int * result , const void * value );
160160static void mbed_minimal_formatted_string_character (char * buffer , size_t length , int * result , char character );
161161static void mbed_minimal_formatted_string_string (char * buffer , size_t length , int * result , const char * string , size_t precision );
@@ -268,8 +268,9 @@ static void mbed_minimal_formatted_string_unsigned(char* buffer, size_t length,
268268 * @param[in] length The length of the buffer.
269269 * @param result The current output location.
270270 * @param[in] value The value to be printed.
271+ * @param upper Flag to print the hexadecimal in upper or lower case.
271272 */
272- static void mbed_minimal_formatted_string_hexadecimal (char * buffer , size_t length , int * result , MBED_UNSIGNED_STORAGE value )
273+ static void mbed_minimal_formatted_string_hexadecimal (char * buffer , size_t length , int * result , MBED_UNSIGNED_STORAGE value , bool upper )
273274{
274275 bool print_leading_zero = false;
275276
@@ -284,8 +285,11 @@ static void mbed_minimal_formatted_string_hexadecimal(char* buffer, size_t lengt
284285 unsigned int nibble_one = (output >> 4 );
285286 unsigned int nibble_two = (output & 0x0F );
286287
287- const char int2hex [16 ] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' ,
288+ const char int2hex_lower [16 ] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' ,
289+ '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' };
290+ const char int2hex_upper [16 ] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' ,
288291 '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' };
292+ const char * int2hex = upper ? int2hex_upper : int2hex_lower ;
289293
290294 if (print_leading_zero || nibble_one != 0 ) {
291295 mbed_minimal_putchar (buffer , length , result , int2hex [nibble_one ]);
@@ -313,7 +317,7 @@ static void mbed_minimal_formatted_string_void_pointer(char* buffer, size_t leng
313317 mbed_minimal_putchar (buffer , length , result , 'x' );
314318
315319 /* write rest as a regular hexadecimal number */
316- mbed_minimal_formatted_string_hexadecimal (buffer , length , result , (ptrdiff_t ) value );
320+ mbed_minimal_formatted_string_hexadecimal (buffer , length , result , (ptrdiff_t ) value , true );
317321}
318322
319323#if MBED_CONF_MINIMAL_PRINTF_ENABLE_FLOATING_POINT
@@ -367,6 +371,18 @@ static void mbed_minimal_formatted_string_double(char* buffer, size_t length, in
367371 decimal ++ ;
368372 }
369373
374+ /* convert precision to unsigned integer */
375+ MBED_UNSIGNED_STORAGE precision_in_uint = precision ;
376+ precision_in_uint /= 10 ;
377+
378+ /* ensure that leading zeros are printed if decimal equals 0 */
379+ MBED_UNSIGNED_STORAGE val = decimal ? decimal : decimal + 1 ;
380+ while (precision_in_uint > val ) {
381+ /* print leading zeros */
382+ mbed_minimal_putchar (buffer , length , result , '0' );
383+ precision_in_uint /= 10 ;
384+ }
385+
370386 /* write decimal part */
371387 mbed_minimal_formatted_string_unsigned (buffer , length , result , decimal );
372388}
@@ -694,7 +710,7 @@ int mbed_minimal_formatted_string(char* buffer, size_t length, const char* forma
694710 }
695711 else
696712 {
697- mbed_minimal_formatted_string_hexadecimal (buffer , length , & result , value );
713+ mbed_minimal_formatted_string_hexadecimal (buffer , length , & result , value , next == 'X' );
698714 }
699715 }
700716#if MBED_CONF_MINIMAL_PRINTF_ENABLE_FLOATING_POINT
0 commit comments