https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f1132155d97a43c4c3141…
commit f1132155d97a43c4c31413e42bf6ea619530149e
Author:     Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Sun Mar 13 17:17:39 2022 +0100
Commit:     Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sun Mar 20 19:28:22 2022 +0100
    [SDK][CRT] Add _CRT_NON_CONFORMING_SWPRINTFS support
    This allows us to easier port wine changes, where swprintf with a size is used a lot
---
 CMakeLists.txt                                   |  6 +++-
 modules/rostests/winetests/msvcrt/CMakeLists.txt |  2 +-
 modules/rostests/winetests/msvcrt/printf.c       |  2 ++
 sdk/include/crt/stdio.h                          | 43 +++++++++++++++++++-----
 sdk/include/crt/wchar.h                          | 43 +++++++++++++++++++-----
 5 files changed, 76 insertions(+), 20 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 899960ab68e..7dfcb64a841 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -68,7 +68,11 @@ include(sdk/cmake/config.cmake)
 # Compiler flags handling
 include(sdk/cmake/compilerflags.cmake)
-add_definitions(-D__REACTOS__)
+add_definitions(
+    -D__REACTOS__
+    # swprintf without count argument is used in most of the codebase
+    -D_CRT_NON_CONFORMING_SWPRINTFS
+)
 # There doesn't seem to be a standard for __FILE__ being relative or absolute, so
detect it at runtime.
 file(RELATIVE_PATH _PATH_PREFIX ${REACTOS_BINARY_DIR} ${REACTOS_SOURCE_DIR})
diff --git a/modules/rostests/winetests/msvcrt/CMakeLists.txt
b/modules/rostests/winetests/msvcrt/CMakeLists.txt
index 2c4e7d581b0..f05f14bd28a 100644
--- a/modules/rostests/winetests/msvcrt/CMakeLists.txt
+++ b/modules/rostests/winetests/msvcrt/CMakeLists.txt
@@ -9,13 +9,13 @@ list(APPEND SOURCE
     heap.c
     locale.c
     misc.c
-    printf.c
     scanf.c
     signal.c
     string.c
     time.c)
 list(APPEND PCH_SKIP_SOURCE
+    printf.c    # _CRT_NON_CONFORMING_SWPRINTFS
     testlist.c)
 add_executable(msvcrt_winetest
diff --git a/modules/rostests/winetests/msvcrt/printf.c
b/modules/rostests/winetests/msvcrt/printf.c
index d8a82a0bc82..4bf55afc1ff 100644
--- a/modules/rostests/winetests/msvcrt/printf.c
+++ b/modules/rostests/winetests/msvcrt/printf.c
@@ -23,7 +23,9 @@
 /* With Visual Studio >= 2005,  swprintf() takes an extra parameter unless
  * the following macro is defined.
  */
+#ifndef _CRT_NON_CONFORMING_SWPRINTFS
 #define _CRT_NON_CONFORMING_SWPRINTFS
+#endif
 #include <stdio.h>
 #include <errno.h>
diff --git a/sdk/include/crt/stdio.h b/sdk/include/crt/stdio.h
index 6d181a541b2..e67c3df6351 100644
--- a/sdk/include/crt/stdio.h
+++ b/sdk/include/crt/stdio.h
@@ -885,6 +885,7 @@ extern _CRTIMP int _commode;
     _In_z_ _Printf_format_string_ const wchar_t *_Format,
     va_list _ArgList);
+#if defined __cplusplus || defined _CRT_NON_CONFORMING_SWPRINTFS
   _Check_return_opt_
   _CRTIMP
   int
@@ -901,6 +902,7 @@ extern _CRTIMP int _commode;
     _Out_ wchar_t*,
     const wchar_t*,
     va_list);
+#endif
   _Check_return_opt_
   _CRTIMP
@@ -948,15 +950,38 @@ extern _CRTIMP int _commode;
 #include <vadefs.h>
 #endif
-#if 0 //this is for MSVCRT80 and higher, which we don't use nor implement
-#ifdef _CRT_NON_CONFORMING_SWPRINTFS
-#ifndef __cplusplus
-#define swprintf _swprintf
-#define vswprintf _vswprintf
-#define _swprintf_l __swprintf_l
-#define _vswprintf_l __vswprintf_l
-#endif
-#endif
+#ifndef _CRT_NON_CONFORMING_SWPRINTFS
+  _Check_return_opt_
+  static inline
+  int
+  __cdecl
+  swprintf(
+      _Out_writes_z_(_SizeInWords) wchar_t* _DstBuf,
+      _In_ size_t _SizeInWords,
+      _In_z_ _Printf_format_string_ const wchar_t* _Format,
+      ...)
+  {
+      int ret;
+      va_list args;
+
+      va_start(args, _Format);
+      ret = _vsnwprintf(_DstBuf, _SizeInWords, _Format, args);
+      va_end(args);
+      return ret;
+  }
+
+  _Check_return_opt_
+  static inline
+  int
+  __cdecl
+  vswprintf(
+      _Out_writes_z_(_SizeInWords) wchar_t* _DstBuf,
+      _In_ size_t _SizeInWords,
+      _In_z_ _Printf_format_string_ const wchar_t* _Format,
+      va_list _ArgList)
+  {
+      return _vsnwprintf(_DstBuf, _SizeInWords, _Format, _ArgList);
+  }
 #endif
   _Check_return_
diff --git a/sdk/include/crt/wchar.h b/sdk/include/crt/wchar.h
index 6c0f148b343..c6cd0d7ba92 100644
--- a/sdk/include/crt/wchar.h
+++ b/sdk/include/crt/wchar.h
@@ -1072,6 +1072,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
     _In_z_ _Printf_format_string_ const wchar_t *_Format,
     va_list _ArgList);
+#if defined __cplusplus || defined _CRT_NON_CONFORMING_SWPRINTFS
   _CRTIMP
   int
   __cdecl
@@ -1087,6 +1088,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
     _Out_ wchar_t*,
     const wchar_t*,
     va_list);
+#endif
   _Check_return_opt_
   _CRTIMP
@@ -1378,15 +1380,38 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
   _CRTIMP int __cdecl __swprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t
_Plocinfo,...);
   _CRTIMP int __cdecl __vswprintf_l(wchar_t *_Dest,const wchar_t *_Format,_locale_t
_Plocinfo,va_list _Args);
-#if 0 //this is for MSVCRT80 and higher, which we don't use nor implement
-#ifdef _CRT_NON_CONFORMING_SWPRINTFS
-#ifndef __cplusplus
-#define swprintf _swprintf
-#define vswprintf _vswprintf
-#define _swprintf_l __swprintf_l
-#define _vswprintf_l __vswprintf_l
-#endif
-#endif
+#ifndef _CRT_NON_CONFORMING_SWPRINTFS
+  _Check_return_opt_
+  static inline
+  int
+  __cdecl
+  swprintf(
+      _Out_writes_z_(_SizeInWords) wchar_t* _DstBuf,
+      _In_ size_t _SizeInWords,
+      _In_z_ _Printf_format_string_ const wchar_t* _Format,
+      ...)
+  {
+      int ret;
+      va_list args;
+
+      va_start(args, _Format);
+      ret = _vsnwprintf(_DstBuf, _SizeInWords, _Format, args);
+      va_end(args);
+      return ret;
+  }
+
+  _Check_return_opt_
+  static inline
+  int
+  __cdecl
+  vswprintf(
+      _Out_writes_z_(_SizeInWords) wchar_t* _DstBuf,
+      _In_ size_t _SizeInWords,
+      _In_z_ _Printf_format_string_ const wchar_t* _Format,
+      va_list _ArgList)
+  {
+      return _vsnwprintf(_DstBuf, _SizeInWords, _Format, _ArgList);
+  }
 #endif
   _Check_return_