Skip to content

Commit 96b5c1d

Browse files
authored
Fixed floating point support (ARMmbed#24)
This PR adds: * Support for hexadecimal printing in lower case * Fixes to floating point printing (leading zeros in decimal part)
1 parent fe6bdca commit 96b5c1d

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

features/minimal-printf/TESTS/minimal-printf/compliance/main.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,10 @@ static control_t test_printf_x(const size_t call_count)
298298
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
299299
#endif
300300

301+
result_minimal = mbed_printf("x: %x\r\n", 11259375);
302+
result_baseline = printf("x: %x\r\n", 11259375);
303+
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
304+
301305
return CaseNext;
302306
}
303307

@@ -629,12 +633,21 @@ static control_t test_printf_f(const size_t call_count)
629633

630634
double pi = 3.14159265359;
631635

636+
637+
result_minimal = mbed_printf("f: %f\r\n", 3.0089);
638+
result_baseline = printf("f: %f\r\n", 3.0089);
639+
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
640+
641+
result_minimal = mbed_printf("f: %f\r\n", 7.0);
642+
result_baseline = printf("f: %f\r\n", 7.0);
643+
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
644+
632645
result_minimal = mbed_printf("f: %f\r\n", -1 * pi);
633646
result_baseline = printf("f: %f\r\n", -1 * pi);
634647
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
635648

636-
result_minimal = mbed_printf("f: %f\r\n", 0);
637-
result_baseline = printf("f: %f\r\n", 0);
649+
result_minimal = mbed_printf("f: %f\r\n", 0.0);
650+
result_baseline = printf("f: %f\r\n", 0.0);
638651
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
639652

640653
result_minimal = mbed_printf("f: %f\r\n", pi);
@@ -656,13 +669,23 @@ static control_t test_snprintf_f(const size_t call_count)
656669

657670
double pi = 3.14159265359;
658671

672+
result_minimal = mbed_snprintf(buffer_minimal, sizeof(buffer_minimal), "f: %f\r\n", 3.0089);
673+
result_baseline = snprintf(buffer_baseline, sizeof(buffer_baseline), "f: %f\r\n", 3.0089);
674+
TEST_ASSERT_EQUAL_STRING(buffer_baseline, buffer_minimal);
675+
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
676+
677+
result_minimal = mbed_snprintf(buffer_minimal, sizeof(buffer_minimal), "f: %f\r\n", 7.0);
678+
result_baseline = snprintf(buffer_baseline, sizeof(buffer_baseline), "f: %f\r\n", 7.0);
679+
TEST_ASSERT_EQUAL_STRING(buffer_baseline, buffer_minimal);
680+
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
681+
659682
result_minimal = mbed_snprintf(buffer_minimal, sizeof(buffer_minimal), "f: %f\r\n", -1 * pi);
660683
result_baseline = snprintf(buffer_baseline, sizeof(buffer_baseline), "f: %f\r\n", -1 * pi);
661684
TEST_ASSERT_EQUAL_STRING(buffer_baseline, buffer_minimal);
662685
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
663686

664-
result_minimal = mbed_snprintf(buffer_minimal, sizeof(buffer_minimal), "f: %f\r\n", 0);
665-
result_baseline = snprintf(buffer_baseline, sizeof(buffer_baseline), "f: %f\r\n", 0);
687+
result_minimal = mbed_snprintf(buffer_minimal, sizeof(buffer_minimal), "f: %f\r\n", 0.0);
688+
result_baseline = snprintf(buffer_baseline, sizeof(buffer_baseline), "f: %f\r\n", 0.0);
666689
TEST_ASSERT_EQUAL_STRING(buffer_baseline, buffer_minimal);
667690
TEST_ASSERT_EQUAL_INT(result_baseline, result_minimal);
668691

features/minimal-printf/mbed_printf_implementation.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ typedef enum {
155155
*/
156156
static void mbed_minimal_formatted_string_signed(char* buffer, size_t length, int* result, MBED_SIGNED_STORAGE value);
157157
static 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);
159159
static void mbed_minimal_formatted_string_void_pointer(char* buffer, size_t length, int* result, const void* value);
160160
static void mbed_minimal_formatted_string_character(char* buffer, size_t length, int* result, char character);
161161
static 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

Comments
 (0)