I've made sample patch + speed up for wide output to file for 'ls' conversion specifications (only one call to __ms_fwprintf function).

Now works extended sample:

#define __USE_MINGW_ANSI_STDIO 1
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>

int main( void )
{
  char *nonTerminated = malloc (1);
  wchar_t *nonTerminatedW = malloc (2);
  nonTerminated[0] = 'a';
  nonTerminatedW[0] = 'b';

  printf ("%.1s\n", nonTerminated);
  printf ("%.1ls\n", nonTerminatedW);
  wprintf (L"%.1s\n", nonTerminated);
  wprintf (L"%.1ls\n", nonTerminatedW);

  _setmode(_fileno(stdout), _O_U8TEXT);
  wprintf(L"%8.1ls%-33ls%lc", nonTerminatedW, L" and TerminatedW", '!');

  free (nonTerminated);
  free (nonTerminatedW);

  return 0;
}


W dniu 2016-05-02 o 19:50, Hannes Domani pisze:

In this example any of the (w)printf()'s now call strlen()/wcslen(), even 
though the precision is limited to 1 character:


#define __USE_MINGW_ANSI_STDIO 1
#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   char *nonTerminated = malloc (1);
   wchar_t *nonTerminatedW = malloc (2);
   nonTerminated[0] = 'a';
   nonTerminatedW[0] = 'b';

   printf ("%.1s\n", nonTerminated);
   printf ("%.1ls\n", nonTerminatedW);
   wprintf (L"%.1s\n", nonTerminated);
   wprintf (L"%.1ls\n", nonTerminatedW);

   free (nonTerminated);
   free (nonTerminatedW);

   return 0;
}


------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z


_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

diff --git a/mingw-w64-crt/lib32/msvcr100.def.in 
b/mingw-w64-crt/lib32/msvcr100.def.in
index a1d7447..d103a2b 100644
--- a/mingw-w64-crt/lib32/msvcr100.def.in
+++ b/mingw-w64-crt/lib32/msvcr100.def.in
@@ -1724,6 +1724,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr110.def.in 
b/mingw-w64-crt/lib32/msvcr110.def.in
index f9f0294..7296955 100644
--- a/mingw-w64-crt/lib32/msvcr110.def.in
+++ b/mingw-w64-crt/lib32/msvcr110.def.in
@@ -1857,6 +1857,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr120.def.in 
b/mingw-w64-crt/lib32/msvcr120.def.in
index c3158eb..57122cb 100644
--- a/mingw-w64-crt/lib32/msvcr120.def.in
+++ b/mingw-w64-crt/lib32/msvcr120.def.in
@@ -2018,6 +2018,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr120_app.def.in 
b/mingw-w64-crt/lib32/msvcr120_app.def.in
index 579edb3..b29eaf9 100644
--- a/mingw-w64-crt/lib32/msvcr120_app.def.in
+++ b/mingw-w64-crt/lib32/msvcr120_app.def.in
@@ -1374,6 +1374,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr120d.def.in 
b/mingw-w64-crt/lib32/msvcr120d.def.in
index f676867..194a0d2 100644
--- a/mingw-w64-crt/lib32/msvcr120d.def.in
+++ b/mingw-w64-crt/lib32/msvcr120d.def.in
@@ -2085,6 +2085,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr80.def.in 
b/mingw-w64-crt/lib32/msvcr80.def.in
index f3408b9..79cd7dd 100644
--- a/mingw-w64-crt/lib32/msvcr80.def.in
+++ b/mingw-w64-crt/lib32/msvcr80.def.in
@@ -587,6 +587,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwrite
 fwscanf
 getc
diff --git a/mingw-w64-crt/lib32/msvcr90.def.in 
b/mingw-w64-crt/lib32/msvcr90.def.in
index 394d7f5..861ce56 100644
--- a/mingw-w64-crt/lib32/msvcr90.def.in
+++ b/mingw-w64-crt/lib32/msvcr90.def.in
@@ -1358,6 +1358,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcr90d.def.in 
b/mingw-w64-crt/lib32/msvcr90d.def.in
index 8846e13..419c65c 100644
--- a/mingw-w64-crt/lib32/msvcr90d.def.in
+++ b/mingw-w64-crt/lib32/msvcr90d.def.in
@@ -1430,6 +1430,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib32/msvcrt.def.in 
b/mingw-w64-crt/lib32/msvcrt.def.in
index 71bdf56..6cc95a0 100644
--- a/mingw-w64-crt/lib32/msvcrt.def.in
+++ b/mingw-w64-crt/lib32/msvcrt.def.in
@@ -585,6 +585,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwrite
 fwscanf
 getc
diff --git a/mingw-w64-crt/lib64/msvcr100.def.in 
b/mingw-w64-crt/lib64/msvcr100.def.in
index a3ba8cd..b3be302 100644
--- a/mingw-w64-crt/lib64/msvcr100.def.in
+++ b/mingw-w64-crt/lib64/msvcr100.def.in
@@ -1679,6 +1679,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr110.def.in 
b/mingw-w64-crt/lib64/msvcr110.def.in
index 6e8a487..5986892 100644
--- a/mingw-w64-crt/lib64/msvcr110.def.in
+++ b/mingw-w64-crt/lib64/msvcr110.def.in
@@ -1803,6 +1803,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr120.def.in 
b/mingw-w64-crt/lib64/msvcr120.def.in
index 8784981..7afa0da 100644
--- a/mingw-w64-crt/lib64/msvcr120.def.in
+++ b/mingw-w64-crt/lib64/msvcr120.def.in
@@ -1967,6 +1967,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr120_app.def.in 
b/mingw-w64-crt/lib64/msvcr120_app.def.in
index 8c60b42..53b2f7b 100644
--- a/mingw-w64-crt/lib64/msvcr120_app.def.in
+++ b/mingw-w64-crt/lib64/msvcr120_app.def.in
@@ -1326,6 +1326,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr120d.def.in 
b/mingw-w64-crt/lib64/msvcr120d.def.in
index 2aab635..f5304d4 100644
--- a/mingw-w64-crt/lib64/msvcr120d.def.in
+++ b/mingw-w64-crt/lib64/msvcr120d.def.in
@@ -2032,6 +2032,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr80.def.in 
b/mingw-w64-crt/lib64/msvcr80.def.in
index 18b8d2d..c84be87 100644
--- a/mingw-w64-crt/lib64/msvcr80.def.in
+++ b/mingw-w64-crt/lib64/msvcr80.def.in
@@ -713,6 +713,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwrite
 fwscanf
 getc
diff --git a/mingw-w64-crt/lib64/msvcr90.def.in 
b/mingw-w64-crt/lib64/msvcr90.def.in
index 7b74907..f18166a 100644
--- a/mingw-w64-crt/lib64/msvcr90.def.in
+++ b/mingw-w64-crt/lib64/msvcr90.def.in
@@ -1299,6 +1299,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcr90d.def.in 
b/mingw-w64-crt/lib64/msvcr90d.def.in
index 4649135..0775538 100644
--- a/mingw-w64-crt/lib64/msvcr90d.def.in
+++ b/mingw-w64-crt/lib64/msvcr90d.def.in
@@ -1365,6 +1365,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/lib64/msvcrt.def.in 
b/mingw-w64-crt/lib64/msvcrt.def.in
index 946c200..0873041 100644
--- a/mingw-w64-crt/lib64/msvcrt.def.in
+++ b/mingw-w64-crt/lib64/msvcrt.def.in
@@ -1084,6 +1084,7 @@ fseek
 fsetpos
 ftell
 fwprintf
+__ms_fwprintf == fwprintf
 fwprintf_s
 fwrite
 fwscanf
diff --git a/mingw-w64-crt/stdio/mingw_pformat.c 
b/mingw-w64-crt/stdio/mingw_pformat.c
index c9808f9..9871f3a 100644
--- a/mingw-w64-crt/stdio/mingw_pformat.c
+++ b/mingw-w64-crt/stdio/mingw_pformat.c
@@ -563,12 +563,61 @@ void __pformat_puts( const char *s, __pformat_t *stream )
    * (after first verifying that the input pointer is not NULL).
    */
   if( s == NULL ) s = "(null)";
-  __pformat_putchars( s, strlen( s ), stream );
+
+  if( stream->precision >= 0)
+    __pformat_putchars( s, strnlen( s, stream->precision ), stream );
+  else
+    __pformat_putchars( s, strlen( s ), stream );
 }
 
 static
 void __pformat_wputchars( const wchar_t *s, int count, __pformat_t *stream )
 {
+#ifdef __BUILD_WIDEAPI
+  int len;
+
+  if( (stream->precision >= 0) && (count > stream->precision) )
+    count = stream->precision;
+
+  if( (stream->flags & PFORMAT_TO_FILE) && (stream->flags & PFORMAT_NOLIMIT) )
+  {
+    int __cdecl __ms_fwprintf(FILE *, const wchar_t *, ...);
+
+    if( stream->width > count )
+    {
+      if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
+        len = __ms_fwprintf( (FILE *)(stream->dest), L"%*.*s", stream->width, 
count, s );
+      else
+        len = __ms_fwprintf( (FILE *)(stream->dest), L"%-*.*s", stream->width, 
count, s );
+    }
+    else
+    {
+      len = __ms_fwprintf( (FILE *)(stream->dest), L"%.*s", count, s );
+    }
+    if( len > 0 )
+      stream->count += len;
+    return;
+  }
+
+  if( stream->width > count )
+    stream->width -= count;
+  else
+    stream->width = PFORMAT_IGNORE;
+
+  if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+    while( stream->width-- )
+      __pformat_putc( '\x20', stream );
+
+  len = count;
+  while(len-- > 0 && *s != 0)
+  {
+      __pformat_putc(*s++, stream);
+  }
+
+  while( stream->width-- > 0 )
+    __pformat_putc( '\x20', stream );
+
+#else
   /* Handler for `%C'(`%lc') and `%S'(`%ls') conversion specifications;
    * (this is a wide character variant of `__pformat_putchars()').
    *
@@ -613,27 +662,20 @@ void __pformat_wputchars( const wchar_t *s, int count, 
__pformat_t *stream )
   /* Emit the data, converting each character from the wide
    * to the multibyte domain as we go...
    */
-#ifdef __BUILD_WIDEAPI
-  len = count;
-  while(len-- > 0 && *s != 0)
-  {
-      __pformat_putc(*s++, stream);
-  }
-  count = len;
-#else
   while( (count-- > 0) && ((len = wcrtomb( buf, *s++, &state )) > 0) )
   {
     char *p = buf;
     while( len-- > 0 )
       __pformat_putc( *p++, stream );
   }
-#endif
+
   /* If we still haven't consumed the entire specified field width,
    * we must be doing flush left justification; any residual width
    * must be filled with blanks, to the right of the output value.
    */
   while( stream->width-- > 0 )
     __pformat_putc( '\x20', stream );
+#endif
 }
 
 static
@@ -653,7 +695,11 @@ void __pformat_wcputs( const wchar_t *s, __pformat_t 
*stream )
    * (after first verifying that the input pointer is not NULL).
    */
   if( s == NULL ) s = L"(null)";
-  __pformat_wputchars( s, wcslen( s ), stream );
+
+  if( stream->precision >= 0)
+    __pformat_wputchars( s, wcsnlen( s, stream->precision ), stream );
+  else
+    __pformat_wputchars( s, wcslen( s ), stream );
 }
 
 static
------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to