Format %C and %S uses opposite wideness as format %c and %s.
So %S in printf uses wchar_t* string and in wprintf uses char* string.
Format %C and %S can be changed by l or h modifiers, like %c and %s.
So for example %hC uses char type in both printf and wprintf calls
and for example %lS uses wchar_t* string in both swprintf and sprintf.
This change fixes the mingw_pformat function to correctly process %C and %S
formats with optional l and h modifiers. This also aligns mingw-w64 support
with crtdll, msvcrt and UCRT *printf functions.
---
mingw-w64-crt/stdio/mingw_pformat.c | 28 ++++++++++++++++++++++------
1 file changed, 22 insertions(+), 6 deletions(-)
diff --git a/mingw-w64-crt/stdio/mingw_pformat.c
b/mingw-w64-crt/stdio/mingw_pformat.c
index 3470c06c592e..c8bff4b539be 100644
--- a/mingw-w64-crt/stdio/mingw_pformat.c
+++ b/mingw-w64-crt/stdio/mingw_pformat.c
@@ -2466,10 +2466,18 @@ __pformat (int flags, void *dest, int max, const
APICHAR *fmt, va_list argv)
case 'C':
/*
- * Equivalent to `%lc'; set `length' accordingly,
- * and simply fall through.
+ * If the explicit length modifier is not set
+ * then it is opposite of the default length
+ * modifier used by `%c`.
*/
- length = PFORMAT_LENGTH_LONG;
+ if( length == PFORMAT_LENGTH_INT )
+ {
+ #ifndef __BUILD_WIDEAPI
+ length = PFORMAT_LENGTH_LONG;
+ #else
+ length = PFORMAT_LENGTH_SHORT;
+ #endif
+ }
/* fallthrough */
@@ -2512,10 +2520,18 @@ __pformat (int flags, void *dest, int max, const
APICHAR *fmt, va_list argv)
case 'S':
/*
- * Equivalent to `%ls'; set `length' accordingly,
- * and simply fall through.
+ * If the explicit length modifier is not set
+ * then it is opposite of the default length
+ * modifier used by `%s`.
*/
- length = PFORMAT_LENGTH_LONG;
+ if( length == PFORMAT_LENGTH_INT )
+ {
+ #ifndef __BUILD_WIDEAPI
+ length = PFORMAT_LENGTH_LONG;
+ #else
+ length = PFORMAT_LENGTH_SHORT;
+ #endif
+ }
/* fallthrough */
--
2.20.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public