From 5da8a80a1f3566013d460cab72574c457357064a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sat, 11 Feb 2017 22:36:20 -0800 Subject: [PATCH] Cleanup. --- src/crt.cpp | 4 ++ src/dtoa.cpp | 145 +++++++++++++++++++++------------------------------ 2 files changed, 62 insertions(+), 87 deletions(-) diff --git a/src/crt.cpp b/src/crt.cpp index f1edea3..fda52a0 100644 --- a/src/crt.cpp +++ b/src/crt.cpp @@ -343,6 +343,7 @@ namespace bx Param param; + // flags while (' ' == ch || '-' == ch || '+' == ch @@ -367,6 +368,7 @@ namespace bx param.fill = ' '; } + // width if ('*' == ch) { read(&reader, ch); @@ -388,6 +390,7 @@ namespace bx } } + // .precision if ('.' == ch) { read(&reader, ch); @@ -450,6 +453,7 @@ namespace bx read(&reader, ch); } + // specifier switch (toLower(ch) ) { case 'c': diff --git a/src/dtoa.cpp b/src/dtoa.cpp index dfdd61d..6b7280a 100644 --- a/src/dtoa.cpp +++ b/src/dtoa.cpp @@ -8,6 +8,8 @@ #include #include +#include + namespace bx { // https://github.com/miloyip/dtoa-benchmark @@ -464,7 +466,8 @@ namespace bx } } - int32_t toString(char* _dst, size_t _max, int32_t _value, uint32_t _base) + template + int32_t toStringSigned(char* _dst, size_t _max, Ty _value, uint32_t _base) { if (_base == 10 && _value < 0) @@ -474,7 +477,11 @@ namespace bx return 0; } - _max = toString(_dst + 1, _max - 1, uint32_t(-_value), _base); + _max = toString(_dst + 1 + , _max - 1 + , typename std::make_unsigned::type(-_value) + , _base + ); if (_max == 0) { return 0; @@ -484,106 +491,70 @@ namespace bx return int32_t(_max + 1); } - return toString(_dst, _max, uint32_t(_value), _base); + return toString(_dst + , _max + , typename std::make_unsigned::type(_value) + , _base + ); + } + + int32_t toString(char* _dst, size_t _max, int32_t _value, uint32_t _base) + { + return toStringSigned(_dst, _max, _value, _base); } int32_t toString(char* _dst, size_t _max, int64_t _value, uint32_t _base) { - if (_base == 10 - && _value < 0) + return toStringSigned(_dst, _max, _value, _base); + } + + template + int32_t toStringUnsigned(char* _dst, size_t _max, Ty _value, uint32_t _base) + { + char data[32]; + size_t len = 0; + + if (_base > 16 + || _base < 2) { - if (_max < 1) - { - return 0; - } - - _max = toString(_dst + 1, _max - 1, uint64_t(-_value), _base); - if (_max == 0) - { - return 0; - } - - *_dst = '-'; - return int32_t(_max + 1); + return 0; } - return toString(_dst, _max, uint64_t(_value), _base); + do + { + const Ty rem = _value % _base; + _value /= _base; + if (rem < 10) + { + data[len++] = char('0' + rem); + } + else + { + data[len++] = char('a' + rem - 10); + } + + } while (_value != 0); + + if (_max < len + 1) + { + return 0; + } + + reverse(data, len); + + memCopy(_dst, data, len); + _dst[len] = '\0'; + return int32_t(len); } int32_t toString(char* _dst, size_t _max, uint32_t _value, uint32_t _base) { - char data[32]; - size_t len = 0; - - if (_base > 16 - || _base < 2) - { - return 0; - } - - do - { - const uint32_t rem = _value % _base; - _value /= _base; - if (rem < 10) - { - data[len++] = char('0' + rem); - } - else - { - data[len++] = char('a' + rem - 10); - } - - } while (_value != 0); - - if (_max < len + 1) - { - return 0; - } - - reverse(data, len); - - memCopy(_dst, data, len); - _dst[len] = '\0'; - return int32_t(len); + return toStringUnsigned(_dst, _max, _value, _base); } int32_t toString(char* _dst, size_t _max, uint64_t _value, uint32_t _base) { - char data[32]; - size_t len = 0; - - if (_base > 16 - || _base < 2) - { - return 0; - } - - do - { - const uint64_t rem = _value % _base; - _value /= _base; - if (rem < 10) - { - data[len++] = char('0' + rem); - } - else - { - data[len++] = char('a' + rem - 10); - } - - } while (_value != 0); - - if (_max < len + 1) - { - return 0; - } - - reverse(data, len); - - memCopy(_dst, data, len); - _dst[len] = '\0'; - return int32_t(len); + return toStringUnsigned(_dst, _max, _value, _base); } } // namespace bx