Skip to content

Commit c224f7d

Browse files
authored
Adding back private implementation of printf (#3026)
1 parent 25db559 commit c224f7d

File tree

17 files changed

+1643
-19
lines changed

17 files changed

+1643
-19
lines changed

CMake/Modules/FindNF_CoreCLR.cmake

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/targets/${RTOS}/_include
2222
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/CLR/Diagnostics)
2323
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/CLR/Debugger)
2424
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/CLR/Helpers/NanoRingBuffer)
25+
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/CLR/Helpers/nanoprintf)
2526
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/CLR/Helpers/Base64)
2627
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/nanoFramework.Runtime.Events)
2728
list(APPEND NF_CoreCLR_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/src/nanoFramework.Runtime.Native)
@@ -142,6 +143,7 @@ set(NF_CoreCLR_SRCS
142143
Messaging_stub.cpp
143144

144145
# Helpers
146+
nanoprintf.c
145147
nanoRingBuffer.c
146148
Info_Safeprintf.cpp
147149

@@ -266,6 +268,7 @@ foreach(SRC_FILE ${NF_CoreCLR_SRCS})
266268
${CMAKE_SOURCE_DIR}/src/CLR/Messaging
267269

268270
# Helpers
271+
${CMAKE_SOURCE_DIR}/src/CLR/Helpers/nanoprintf
269272
${CMAKE_SOURCE_DIR}/src/CLR/Helpers/NanoRingBuffer
270273
${CMAKE_SOURCE_DIR}/src/CLR/Helpers/Base64
271274
${CMAKE_SOURCE_DIR}/src/CLR/Diagnostics

src/CLR/CorLib/CorLib.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@
1414
#include "corlib_native.h"
1515
#include "nanoCRT.h"
1616

17+
#ifndef VIRTUAL_DEVICE
18+
#include <nanoprintf.h>
19+
#endif // VIRTUAL_DEVICE
20+
1721
#endif // NANOCLR_CORLIB_NATIVE_H

src/CLR/CorLib/CorLib.vcxproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@
152152
<WarningLevel>Level3</WarningLevel>
153153
<Optimization>Disabled</Optimization>
154154
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
155-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
155+
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\..\CLR\Helpers\nanoprintf;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
156156
</ClCompile>
157157
<Link>
158158
<SubSystem>Windows</SubSystem>
@@ -165,7 +165,7 @@
165165
<WarningLevel>Level3</WarningLevel>
166166
<Optimization>Disabled</Optimization>
167167
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
168-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
168+
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\..\CLR\Helpers\nanoprintf;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
169169
</ClCompile>
170170
<Link>
171171
<SubSystem>Windows</SubSystem>
@@ -180,7 +180,7 @@
180180
<FunctionLevelLinking>true</FunctionLevelLinking>
181181
<IntrinsicFunctions>true</IntrinsicFunctions>
182182
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
183-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
183+
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\..\CLR\Helpers\nanoprintf;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
184184
</ClCompile>
185185
<Link>
186186
<SubSystem>Windows</SubSystem>
@@ -197,7 +197,7 @@
197197
<FunctionLevelLinking>true</FunctionLevelLinking>
198198
<IntrinsicFunctions>true</IntrinsicFunctions>
199199
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
200-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
200+
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\..\CLR\Helpers\nanoprintf;..\Include;..\..\HAL\Include;..\..\PAL\Include;..\..\CLR\Helpers\Base64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
201201
</ClCompile>
202202
<Link>
203203
<SubSystem>Windows</SubSystem>
@@ -208,4 +208,4 @@
208208
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
209209
<ImportGroup Label="ExtensionTargets">
210210
</ImportGroup>
211-
</Project>
211+
</Project>

src/CLR/CorLib/corlib_native_System_Number.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
//
1+
//
22
// Copyright (c) .NET Foundation and Contributors
33
// Portions Copyright (c) Microsoft Corporation. All rights reserved.
44
// See LICENSE file in the project root for full license information.
55
//
66
#include "CorLib.h"
7+
#include <nanoprintf.h>
78

89
// must be big enough to fit the biggest number
910
// decorated with negative signs, group separators, etc.
@@ -360,11 +361,22 @@ int Library_corlib_native_System_Number::Format_G(
360361
defaultPrecision = 9;
361362
break;
362363
case DATATYPE_R8:
364+
{
363365
// from .NET documentation:
364366
// When used with a Double value, the "G17" format specifier ensures that the original Double value
365367
// successfully round-trips.
366368
defaultPrecision = 17;
369+
370+
CLR_DOUBLE_TEMP_CAST number = (CLR_DOUBLE_TEMP_CAST)value->NumericByRef().r8;
371+
372+
// check if number is an integer
373+
if (number == (CLR_INT64_TEMP_CAST)number)
374+
{
375+
// this is an integer, set precision to a value achievable by the library
376+
defaultPrecision = 15;
377+
}
367378
break;
379+
}
368380
default:
369381
break;
370382
}

src/CLR/Core/Core.vcxproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
</ProjectConfiguration>
2020
</ItemGroup>
2121
<ItemGroup>
22+
<ClCompile Include="..\Helpers\nanoprintf\nanoprintf.c" />
2223
<ClCompile Include="Cache.cpp" />
2324
<ClCompile Include="Checks.cpp" />
2425
<ClCompile Include="CLR_RT_DblLinkedList.cpp" />
@@ -217,4 +218,4 @@
217218
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
218219
<ImportGroup Label="ExtensionTargets">
219220
</ImportGroup>
220-
</Project>
221+
</Project>

src/CLR/Core/Core.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@
132132
<ClCompile Include="CLR_RT_HeapBlock_Queue.cpp">
133133
<Filter>Source Files</Filter>
134134
</ClCompile>
135+
<ClCompile Include="..\Helpers\nanoprintf\nanoprintf.c">
136+
<Filter>Source Files</Filter>
137+
</ClCompile>
135138
<ClCompile Include="nanoSupport_CRC32.c">
136139
<Filter>Source Files</Filter>
137140
</ClCompile>

src/CLR/Diagnostics/Diagnostics.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@
1111
// #include <core.h>
1212

1313
#include <corlib_native.h>
14+
#ifndef VIRTUAL_DEVICE
15+
#include <nanoprintf.h>
16+
#endif // VIRTUAL_DEVICE
1417
// #include <spot_net_native.h>

src/CLR/Diagnostics/Diagnostics.vcxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105
<WarningLevel>Level3</WarningLevel>
106106
<Optimization>Disabled</Optimization>
107107
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
108-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
108+
<AdditionalIncludeDirectories>..\Helpers\nanoprintf;..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
109109
</ClCompile>
110110
<Link>
111111
<SubSystem>Windows</SubSystem>
@@ -118,7 +118,7 @@
118118
<WarningLevel>Level3</WarningLevel>
119119
<Optimization>Disabled</Optimization>
120120
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
121-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
121+
<AdditionalIncludeDirectories>..\Helpers\nanoprintf;..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
122122
</ClCompile>
123123
<Link>
124124
<SubSystem>Windows</SubSystem>
@@ -133,7 +133,7 @@
133133
<FunctionLevelLinking>true</FunctionLevelLinking>
134134
<IntrinsicFunctions>true</IntrinsicFunctions>
135135
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
136-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
136+
<AdditionalIncludeDirectories>..\Helpers\nanoprintf;..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
137137
</ClCompile>
138138
<Link>
139139
<SubSystem>Windows</SubSystem>
@@ -150,7 +150,7 @@
150150
<FunctionLevelLinking>true</FunctionLevelLinking>
151151
<IntrinsicFunctions>true</IntrinsicFunctions>
152152
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
153-
<AdditionalIncludeDirectories>..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
153+
<AdditionalIncludeDirectories>..\Helpers\nanoprintf;..\..\..\targets\win32\Include;..\Include;..\CorLib;..\..\HAL\Include;..\..\PAL\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
154154
</ClCompile>
155155
<Link>
156156
<SubSystem>Windows</SubSystem>

src/CLR/Diagnostics/Info_Safeprintf.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,19 @@
55
//
66

77
#include <nanoCLR_Types.h>
8+
#include <nanoprintf.h>
89

910
bool CLR_SafeSprintfV(char *&szBuffer, size_t &iBuffer, const char *format, va_list arg)
1011
{
1112
NATIVE_PROFILE_CLR_DIAGNOSTICS();
1213

13-
size_t chars = vsnprintf(szBuffer, iBuffer, format, arg);
14-
bool fRes = (chars < iBuffer);
14+
int chars = vsnprintf(szBuffer, iBuffer, format, arg);
15+
bool fRes = (chars >= 0);
1516

16-
if (!fRes)
17-
{
18-
// If the buffer was too small, set chars to iBuffer - 1 to ensure null-termination
19-
chars = iBuffer - 1;
20-
}
17+
if (fRes == false)
18+
chars = (int)iBuffer;
2119

2220
szBuffer += chars;
23-
// Null-terminate the buffer
2421
szBuffer[0] = 0;
2522
iBuffer -= chars;
2623

0 commit comments

Comments
 (0)