From 79474c6b164fb66a8d348bfa57613f9dbf5af4e8 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 28 May 2015 14:22:12 +0000
Subject: [PATCH] py: Remove unnecessary extra handling of padding of nan/inf.

C's printf will pad nan/inf differently to CPython.  Our implementation
originally conformed to C, now it conforms to CPython's way.

Tests for this are also added in this patch.
---
 py/mpprint.c                        | 16 +++-------------
 py/mpprint.h                        |  3 +--
 py/objstr.c                         |  1 -
 tests/float/string_format.py        |  4 ++++
 tests/float/string_format_modulo.py |  4 ++++
 5 files changed, 12 insertions(+), 16 deletions(-)

diff --git a/py/mpprint.c b/py/mpprint.c
index 51c16f4e3..6da6614b7 100644
--- a/py/mpprint.c
+++ b/py/mpprint.c
@@ -363,21 +363,11 @@ int mp_print_float(const mp_print_t *print, mp_float_t f, char fmt, int flags, c
     if ((flags & PF_FLAG_PAD_AFTER_SIGN) && buf[0] < '0') {
         // We have a sign character
         s++;
-        if (*s <= '9' || (flags & PF_FLAG_PAD_NAN_INF)) {
-            // We have a number, or we have a inf/nan and PAD_NAN_INF is set
-            // With '{:06e}'.format(float('-inf')) you get '-00inf'
-            chrs += mp_print_strn(print, &buf[0], 1, 0, 0, 1);
-            width--;
-            len--;
-        }
+        chrs += mp_print_strn(print, &buf[0], 1, 0, 0, 1);
+        width--;
+        len--;
     }
 
-    if (*s > 'A' && (flags & PF_FLAG_PAD_NAN_INF) == 0) {
-        // We have one of the inf or nan variants, suppress zero fill.
-        // With printf, if you use: printf("%06e", -inf) then you get "  -inf"
-        // so suppress the zero fill.
-        fill = ' ';
-    }
     chrs += mp_print_strn(print, s, len, flags, fill, width);
 
     return chrs;
diff --git a/py/mpprint.h b/py/mpprint.h
index ceea3b978..1770fcffe 100644
--- a/py/mpprint.h
+++ b/py/mpprint.h
@@ -37,8 +37,7 @@
 #define PF_FLAG_PAD_AFTER_SIGN    (0x040)
 #define PF_FLAG_CENTER_ADJUST     (0x080)
 #define PF_FLAG_ADD_PERCENT       (0x100)
-#define PF_FLAG_PAD_NAN_INF       (0x200)
-#define PF_FLAG_SHOW_OCTAL_LETTER (0x400)
+#define PF_FLAG_SHOW_OCTAL_LETTER (0x200)
 
 typedef void (*mp_print_strn_t)(void *data, const char *str, mp_uint_t len);
 
diff --git a/py/objstr.c b/py/objstr.c
index 0246262a5..d11f097fc 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -1200,7 +1200,6 @@ mp_obj_t mp_obj_str_format(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwa
                 type = 'g';
             }
 
-            flags |= PF_FLAG_PAD_NAN_INF; // '{:06e}'.format(float('-inf')) should give '-00inf'
             switch (type) {
 #if MICROPY_PY_BUILTINS_FLOAT
                 case 'e':
diff --git a/tests/float/string_format.py b/tests/float/string_format.py
index b5ff68b8c..265efedec 100644
--- a/tests/float/string_format.py
+++ b/tests/float/string_format.py
@@ -23,6 +23,10 @@ test("{:10.4F}", -123.456)
 test("{:10.4G}", 123.456)
 test("{:10.4G}", -123.456)
 
+test("{:06e}", float("inf"))
+test("{:06e}", float("-inf"))
+test("{:06e}", float("nan"))
+
 # The following fails right now
 #test("{:10.1}", 0.0)
 
diff --git a/tests/float/string_format_modulo.py b/tests/float/string_format_modulo.py
index ddca0b555..11df9abbd 100644
--- a/tests/float/string_format_modulo.py
+++ b/tests/float/string_format_modulo.py
@@ -17,3 +17,7 @@ print("%f" % 1.23456)
 print("%F" % 1.23456)
 print("%g" % 1.23456)
 print("%G" % 1.23456)
+
+print("%06e" % float("inf"))
+print("%06e" % float("-inf"))
+print("%06e" % float("nan"))
-- 
GitLab