summaryrefslogtreecommitdiff
path: root/stm/printf.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-03-10 13:19:55 +0000
committerDamien George <damien.p.george@gmail.com>2014-03-10 13:19:55 +0000
commit0a8458c353b60420f17050d819912df9b168d0cb (patch)
tree2543d369ab81180697aaf39040171208a93f0250 /stm/printf.c
parent0527f0c338ef8c085c5209981e167d85e03ae728 (diff)
parentca5a241e48b0cc392a555ad3dec5d008089bfd53 (diff)
Merge branch 'format-float' of github.com:dhylands/micropython into dhylands-format-float
Diffstat (limited to 'stm/printf.c')
-rw-r--r--stm/printf.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/stm/printf.c b/stm/printf.c
index abbc58b66..56a5d864c 100644
--- a/stm/printf.c
+++ b/stm/printf.c
@@ -11,6 +11,9 @@
#include "lcd.h"
#include "usart.h"
#include "usb.h"
+#if MICROPY_ENABLE_FLOAT
+#include "format-float.h"
+#endif
#define PF_FLAG_LEFT_ADJUST (0x01)
#define PF_FLAG_SHOW_SIGN (0x02)
@@ -210,29 +213,40 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) {
chrs += pfenv_print_int(pfenv, va_arg(args, int), 0, 16, 'A', flags, width);
break;
#if MICROPY_ENABLE_FLOAT
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'F':
case 'g':
+ case 'G':
{
- // This is a very hacky approach to printing floats. Micropython
- // uses %g when using print, and I just wanted to see somthing
- // usable. I expect that this will be replaced with something
- // more appropriate.
- char dot = '.';
- mp_float_t d = va_arg(args, double);
- int left = (int)d;
- int right = (int)((d - (mp_float_t)(int)d) * 1000000.0);
- if (right < 0) {
- if (left == 0) {
- chrs += pfenv_print_strn(pfenv, "-0", 2, flags, width);
- } else {
- chrs += pfenv_print_int(pfenv, left, 1, 10, 'a', flags, width);
- }
- chrs += pfenv_print_strn(pfenv, &dot, 1, flags, width);
- chrs += pfenv_print_int(pfenv, -right, 0, 10, 'a', PF_FLAG_ZERO_PAD, 6);
- } else {
- chrs += pfenv_print_int(pfenv, left, 1, 10, 'a', flags, width);
- chrs += pfenv_print_strn(pfenv, &dot, 1, flags, width);
- chrs += pfenv_print_int(pfenv, right, 0, 10, 'a', PF_FLAG_ZERO_PAD, 6);
+ char buf[32];
+ char sign = '\0';
+
+ if (flags & PF_FLAG_SHOW_SIGN) {
+ sign = '+';
+ }
+ else
+ if (flags & PF_FLAG_SPACE_SIGN) {
+ sign = ' ';
+ }
+ float f = va_arg(args, double);
+ int len = format_float(f, buf, sizeof(buf), *fmt, prec, sign);
+ char *s = buf;
+
+ // buf[0] < '0' returns true if the first character is space, + or -
+ // buf[1] < '9' matches a digit, and doesn't match when we get back +nan or +inf
+ if (buf[0] < '0' && buf[1] <= '9' && (flags & PF_FLAG_ZERO_PAD)) {
+ chrs += pfenv_print_strn(pfenv, &buf[0], 1, 0, 1);
+ s++;
+ width--;
+ len--;
+ }
+ if (*s < '0' || *s >= '9') {
+ // For inf or nan, we don't want to zero pad.
+ flags &= ~PF_FLAG_ZERO_PAD;
}
+ chrs += pfenv_print_strn(pfenv, s, len, flags, width);
break;
}
#endif