From 237f85b84631985c54b1dc2ebf5f2ddf340088cd Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 5 Jun 2020 07:23:46 -0700 Subject: [PATCH] Added 'A' address format specifier --- BeefLibs/corlib/src/NumberFormatter.bf | 40 ++++++++++++++++++++++---- BeefLibs/corlib/src/Pointer.bf | 4 +-- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/BeefLibs/corlib/src/NumberFormatter.bf b/BeefLibs/corlib/src/NumberFormatter.bf index b5019d3c..dda8b4cc 100644 --- a/BeefLibs/corlib/src/NumberFormatter.bf +++ b/BeefLibs/corlib/src/NumberFormatter.bf @@ -1297,7 +1297,7 @@ namespace System _defPrecision = defPrecision; _positive = value >= 0; - if (value == 0 || _specifier == 'X') { + if (value == 0 || _specifier == 'X' || _specifier == 'A') { InitHex ((uint64)value); return; } @@ -1314,7 +1314,7 @@ namespace System _defPrecision = defPrecision; _positive = true; - if (value == 0 || _specifier == 'X') { + if (value == 0 || _specifier == 'X' || _specifier == 'A') { InitHex (value); return; } @@ -1330,7 +1330,7 @@ namespace System _defPrecision = Int64DefPrecision; _positive = value >= 0; - if (value == 0 || _specifier == 'X') { + if (value == 0 || _specifier == 'X' || _specifier == 'A') { InitHex ((uint64)value); return; } @@ -1347,7 +1347,7 @@ namespace System _defPrecision = UInt64DefPrecision; _positive = true; - if (value == 0 || _specifier == 'X') { + if (value == 0 || _specifier == 'X' || _specifier == 'A') { InitHex ((uint64)value); return; } @@ -1809,7 +1809,10 @@ namespace System private void IntegerToString (StringView format, IFormatProvider fp, String outString) { NumberFormatInfo nfi = GetNumberFormatInstance (fp); - switch (_specifier) { + switch (_specifier) + { + case 'A': + FormatAddress(outString); case 'C': FormatCurrency (_precision, nfi, outString); case 'D': @@ -2042,6 +2045,33 @@ namespace System outString.Append(_cbuf, 0, _ind); } + private void FormatAddress(String outString) + { + char8* digits = _specifierIsUpper ? &DigitUpperTable : &DigitLowerTable; + + const int bufLen = 18; + char8* strChars = scope:: char8[bufLen]* (?); + int32 curLen = 0; + uint64 valLeft = _val1 | ((uint64)_val2 << 32); + while (valLeft > 0) + { + if (curLen == 8) + strChars[bufLen - curLen++ - 1] = '\''; + strChars[bufLen - curLen++ - 1] = digits[(int)(valLeft & 0xF)]; + valLeft >>= 4; + } + + while (curLen < 10) + { + if (curLen == 8) + strChars[bufLen - curLen++ - 1] = '\''; + strChars[bufLen - curLen++ - 1] = '0'; + } + + char8* char8Ptr = &strChars[bufLen - curLen]; + outString.Append(char8Ptr, curLen); + } + void FormatFixedPoint (int32 precision, NumberFormatInfo nfi, String outString) { var precision; diff --git a/BeefLibs/corlib/src/Pointer.bf b/BeefLibs/corlib/src/Pointer.bf index 7a9493c5..a5c95c74 100644 --- a/BeefLibs/corlib/src/Pointer.bf +++ b/BeefLibs/corlib/src/Pointer.bf @@ -18,7 +18,7 @@ namespace System public override void ToString(String strBuffer) { - strBuffer.AppendF("0x{0:P}", (uint)(void*)mVal); + strBuffer.AppendF("0x{0:A}", (uint)(void*)mVal); } } @@ -35,7 +35,7 @@ namespace System { strBuffer.Append("("); typeof(T).GetFullName(strBuffer); - strBuffer.AppendF("*)0x{0:P}", (uint)(void*)mVal); + strBuffer.AppendF("*)0x{0:A}", (uint)(void*)mVal); } } }