Eric Pouech : msvcrt: Implemented _vc(w)printf.

Alexandre Julliard julliard at winehq.org
Mon Nov 8 11:46:25 CST 2010


Module: wine
Branch: master
Commit: 1eaae093e294fff3174f616d44b686af1be99965
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1eaae093e294fff3174f616d44b686af1be99965

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Sun Nov  7 19:11:38 2010 +0100

msvcrt: Implemented _vc(w)printf.

---

 dlls/msvcr100/msvcr100.spec |    6 +-
 dlls/msvcr70/msvcr70.spec   |    2 +-
 dlls/msvcr71/msvcr71.spec   |    2 +-
 dlls/msvcr80/msvcr80.spec   |    6 +-
 dlls/msvcr90/msvcr90.spec   |    6 +-
 dlls/msvcrt/console.c       |   95 ++++++++++++++++++++++++++++++++++---------
 dlls/msvcrt/msvcrt.spec     |    6 +-
 7 files changed, 89 insertions(+), 34 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 0a608b5..f172f7b 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -564,7 +564,7 @@
 @ cdecl _ctime64(ptr) msvcrt._ctime64
 @ stub _ctime64_s
 @ cdecl _cwait(ptr long long) msvcrt._cwait
-@ stub _cwprintf
+@ varargs _cwprintf(wstr) msvcrt._cwprintf
 @ stub _cwprintf_l
 @ stub _cwprintf_p
 @ stub _cwprintf_p_l
@@ -1216,13 +1216,13 @@
 @ cdecl _unlock_file(ptr) msvcrt._unlock_file
 @ cdecl _utime32(str ptr) msvcrt._utime32
 @ cdecl _utime64(str ptr) msvcrt._utime64
-@ stub _vcprintf
+@ cdecl _vcprintf(str ptr) msvcrt._vcprintf
 @ stub _vcprintf_l
 @ stub _vcprintf_p
 @ stub _vcprintf_p_l
 @ stub _vcprintf_s
 @ stub _vcprintf_s_l
-@ stub _vcwprintf
+@ cdecl _vcwprintf(wstr ptr) msvcrt._vcwprintf
 @ stub _vcwprintf_l
 @ stub _vcwprintf_p
 @ stub _vcwprintf_p_l
diff --git a/dlls/msvcr70/msvcr70.spec b/dlls/msvcr70/msvcr70.spec
index 307ae09..eaaf4f1 100644
--- a/dlls/msvcr70/msvcr70.spec
+++ b/dlls/msvcr70/msvcr70.spec
@@ -267,7 +267,7 @@
 @ cdecl _ctime64(ptr) msvcrt._ctime64
 @ extern _ctype msvcrt._ctype
 @ cdecl _cwait(ptr long long) msvcrt._cwait
-@ stub _cwprintf
+@ varargs _cwprintf(str) msvcrt._cwprintf
 @ varargs _cwscanf(wstr) msvcrt._cwscanf
 @ extern _daylight msvcrt._daylight
 @ extern _dstbias msvcrt._dstbias
diff --git a/dlls/msvcr71/msvcr71.spec b/dlls/msvcr71/msvcr71.spec
index fc8491d..e4f1a20 100644
--- a/dlls/msvcr71/msvcr71.spec
+++ b/dlls/msvcr71/msvcr71.spec
@@ -261,7 +261,7 @@
 @ varargs _cscanf(str) msvcrt._cscanf
 @ cdecl _ctime64(ptr) msvcrt._ctime64
 @ cdecl _cwait(ptr long long) msvcrt._cwait
-@ stub _cwprintf
+@ varargs _cwprintf(wstr) msvcrt._cwprintf
 @ varargs _cwscanf(wstr) msvcrt._cwscanf
 @ extern _daylight msvcrt._daylight
 @ extern _dstbias msvcrt._dstbias
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index d29fad1..f939329 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -403,7 +403,7 @@
 @ cdecl _ctime64(ptr) msvcrt._ctime64
 @ stub _ctime64_s
 @ cdecl _cwait(ptr long long) msvcrt._cwait
-@ stub _cwprintf
+@ varargs _cwprintf(wstr) msvcrt._cwprintf
 @ stub _cwprintf_l
 @ stub _cwprintf_p
 @ stub _cwprintf_p_l
@@ -1069,13 +1069,13 @@
 @ cdecl _unlock_file(ptr) msvcrt._unlock_file
 @ cdecl _utime32(str ptr) msvcrt._utime32
 @ cdecl _utime64(str ptr) msvcrt._utime64
-@ stub _vcprintf
+@ cdecl _vcprintf(str ptr) msvcrt._vcprintf
 @ stub _vcprintf_l
 @ stub _vcprintf_p
 @ stub _vcprintf_p_l
 @ stub _vcprintf_s
 @ stub _vcprintf_s_l
-@ stub _vcwprintf
+@ cdecl _vcwprintf(wstr ptr) msvcrt._vcwprintf
 @ stub _vcwprintf_l
 @ stub _vcwprintf_p
 @ stub _vcwprintf_p_l
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index cc822da..99e81fd 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -395,7 +395,7 @@
 @ cdecl _ctime64(ptr) msvcrt._ctime64
 @ stub _ctime64_s
 @ cdecl _cwait(ptr long long) msvcrt._cwait
-@ stub _cwprintf
+@ varargs _cwprintf(wstr) msvcrt._cwprintf
 @ stub _cwprintf_l
 @ stub _cwprintf_p
 @ stub _cwprintf_p_l
@@ -1056,13 +1056,13 @@
 @ cdecl _unlock_file(ptr) msvcrt._unlock_file
 @ cdecl _utime32(str ptr) msvcrt._utime32
 @ cdecl _utime64(str ptr) msvcrt._utime64
-@ stub _vcprintf
+@ cdecl _vcprintf(str ptr) msvcrt._vcprintf
 @ stub _vcprintf_l
 @ stub _vcprintf_p
 @ stub _vcprintf_p_l
 @ stub _vcprintf_s
 @ stub _vcprintf_s_l
-@ stub _vcwprintf
+@ cdecl _vcwprintf(wstr ptr) msvcrt._vcwprintf
 @ stub _vcwprintf_l
 @ stub _vcwprintf_p
 @ stub _vcwprintf_p_l
diff --git a/dlls/msvcrt/console.c b/dlls/msvcrt/console.c
index 0411eb8..e23ff3e 100644
--- a/dlls/msvcrt/console.c
+++ b/dlls/msvcrt/console.c
@@ -22,6 +22,7 @@
  */
 
 #include "msvcrt.h"
+#include "winnls.h"
 #include "wincon.h"
 #include "mtdll.h"
 #include "wine/debug.h"
@@ -299,35 +300,89 @@ int CDECL _kbhit(void)
 
 
 /*********************************************************************
+ *		_vcprintf (MSVCRT.@)
+ */
+int CDECL _vcprintf(const char* format, __ms_va_list valist)
+{
+  char buf[2048];
+  LPWSTR formatW = NULL;
+  DWORD sz;
+  pf_output out;
+  int retval;
+
+  out.unicode = FALSE;
+  out.buf.A = out.grow.A = buf;
+  out.used = 0;
+  out.len = sizeof(buf);
+
+  sz = MultiByteToWideChar( CP_ACP, 0, format, -1, NULL, 0 );
+  formatW = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
+  MultiByteToWideChar( CP_ACP, 0, format, -1, formatW, sz );
+
+  if ((retval = pf_vsnprintf( &out, formatW, NULL, FALSE, valist )) > 0)
+  {
+      LOCK_CONSOLE;
+      retval = _cputs( out.buf.A );
+      UNLOCK_CONSOLE;
+  }
+  HeapFree( GetProcessHeap(), 0, formatW );
+  if (out.buf.A != buf)
+    MSVCRT_free (out.buf.A);
+  return retval;
+}
+
+/*********************************************************************
  *		_cprintf (MSVCRT.@)
  */
 int CDECL _cprintf(const char* format, ...)
 {
-  char buf[2048], *mem = buf;
-  int written, resize = sizeof(buf), retval;
+  int retval;
   __ms_va_list valist;
 
   __ms_va_start( valist, format );
-  /* There are two conventions for snprintf failing:
-   * Return -1 if we truncated, or
-   * Return the number of bytes that would have been written
-   * The code below handles both cases
-   */
-  while ((written = MSVCRT_vsnprintf( mem, resize, format, valist )) == -1 ||
-          written > resize)
+  retval = _vcprintf(format, valist);
+  __ms_va_end(valist);
+
+  return retval;
+}
+
+
+/*********************************************************************
+ *		_vcwprintf (MSVCRT.@)
+ */
+int CDECL _vcwprintf(const MSVCRT_wchar_t* format, __ms_va_list valist)
+{
+  MSVCRT_wchar_t buf[2048];
+  pf_output out;
+  int retval;
+
+  out.unicode = TRUE;
+  out.buf.W = out.grow.W = buf;
+  out.used = 0;
+  out.len = sizeof(buf) / sizeof(buf[0]);
+
+  if ((retval = pf_vsnprintf( &out, format, NULL, FALSE, valist )) >= 0)
   {
-    resize = (written == -1 ? resize * 2 : written + 1);
-    if (mem != buf)
-      MSVCRT_free (mem);
-    if (!(mem = MSVCRT_malloc(resize)))
-      return MSVCRT_EOF;
-    __ms_va_start( valist, format );
+      LOCK_CONSOLE;
+      retval = _cputws( out.buf.W );
+      UNLOCK_CONSOLE;
   }
+  if (out.buf.W != buf)
+    MSVCRT_free (out.buf.W);
+  return retval;
+}
+
+/*********************************************************************
+ *		_cwprintf (MSVCRT.@)
+ */
+int CDECL _cwprintf(const MSVCRT_wchar_t* format, ...)
+{
+  int retval;
+  __ms_va_list valist;
+
+  __ms_va_start( valist, format );
+  retval = _vcwprintf(format, valist);
   __ms_va_end(valist);
-  LOCK_CONSOLE;
-  retval = _cputs( mem );
-  UNLOCK_CONSOLE;
-  if (mem != buf)
-    MSVCRT_free (mem);
+
   return retval;
 }
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 42c2469..4a531f4 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -361,7 +361,7 @@
 # stub _ctime64_s
 @ extern _ctype MSVCRT__ctype
 @ cdecl _cwait(ptr long long)
-# stub _cwprintf
+@ varargs _cwprintf(wstr)
 # stub _cwprintf_l
 # stub _cwprintf_p
 # stub _cwprintf_p_l
@@ -992,13 +992,13 @@
 @ cdecl _unlock_file(ptr) MSVCRT__unlock_file
 @ cdecl _utime32(str ptr)
 @ cdecl _utime64(str ptr)
-# stub _vcprintf
+@ cdecl _vcprintf(str ptr)
 # stub _vcprintf_l
 # stub _vcprintf_p
 # stub _vcprintf_p_l
 # stub _vcprintf_s
 # stub _vcprintf_s_l
-# stub _vcwprintf
+@ cdecl _vcwprintf(wstr ptr)
 # stub _vcwprintf_l
 # stub _vcwprintf_p
 # stub _vcwprintf_p_l




More information about the wine-cvs mailing list