From f80a602783338ebd573b3c5dec793ff560a33708 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 8 Dec 2014 01:43:44 -0800 Subject: [PATCH] Least stack-usage self-contained ftostr32np() This is the optimal code for a self-contained formatter, although the original code is crafty in being smaller and simpler, and can be evaluated as using the original output as a scratch pad for state, making the final formatter more straightforward. While this code is longer, all code-paths are minimal. --- Marlin/ultralcd.cpp | 49 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index fbfa859c58..9bd0d548dd 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -1445,16 +1445,49 @@ char *ftostr12ns(const float &x) // convert float to space-padded string with -_23.4_ format char *ftostr32np(const float &x) { - char *c = ftostr32(x); - if (c[0] == '0' || c[0] == '-') { - if (c[0] == '0') c[0] = ' '; - if (c[1] == '0') c[1] = ' '; + long xx = abs(x * 100); + uint8_t dig; + + if (x < 0) { // negative val = -_0 + conv[0] = '-'; + dig = (xx / 1000) % 10; + conv[1] = dig ? '0' + dig : ' '; } - if (c[5] == '0') { - c[5] = ' '; - if (c[4] == '0') c[4] = c[3] = ' '; + else { // positive val = __0 + dig = (xx / 10000) % 10; + if (dig) { + conv[0] = '0' + dig; + conv[1] = '0' + (xx / 1000) % 10; + } + else { + conv[0] = ' '; + dig = (xx / 1000) % 10; + conv[1] = dig ? '0' + dig : ' '; + } } - return c; + + conv[2] = '0' + (xx / 100) % 10; // lsd always + + dig = xx % 10; + if (dig) { // 2 decimal places + conv[5] = '0' + dig; + dig = (xx / 10) % 10; + conv[4] = '0' + dig; + conv[3] = '.'; + } + else { // 1 or 0 decimal place + dig = (xx / 10) % 10; + if (dig) { + conv[4] = '0' + dig; + conv[3] = '.'; + } + else { + conv[3] = conv[4] = ' '; + } + conv[5] = ' '; + } + conv[6] = '\0'; + return conv; } char *itostr31(const int &xx)