[PATCH 10/14] [Msvcrt*]: implemented _vc(w)printf

Eric Pouech eric.pouech at orange.fr
Tue Nov 2 16:03:34 CDT 2010




A+
---

 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       |   76 ++++++++++++++++++++++++++++++++++++++++---
 dlls/msvcrt/msvcrt.spec     |    6 ++-
 7 files changed, 84 insertions(+), 20 deletions(-)


diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index beb538f..b9157a3 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 @@
 @ stub _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 52156b7..9c03a1a 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 33db3a6..32d7330 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 c07cb58..850c560 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 @@
 @ stub _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 f0e2af0..66f9a19 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 @@
 @ stub _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..c6e1c96 100644
--- a/dlls/msvcrt/console.c
+++ b/dlls/msvcrt/console.c
@@ -299,15 +299,14 @@ int CDECL _kbhit(void)
 
 
 /*********************************************************************
- *		_cprintf (MSVCRT.@)
+ *		_vcprintf (MSVCRT.@)
  */
-int CDECL _cprintf(const char* format, ...)
+int CDECL _vcprintf(const char* format, __ms_va_list xvalist)
 {
   char buf[2048], *mem = buf;
   int written, resize = sizeof(buf), retval;
-  __ms_va_list valist;
+  __ms_va_list  valist = xvalist;
 
-  __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
@@ -321,9 +320,9 @@ int CDECL _cprintf(const char* format, ...)
       MSVCRT_free (mem);
     if (!(mem = MSVCRT_malloc(resize)))
       return MSVCRT_EOF;
-    __ms_va_start( valist, format );
+    valist = xvalist;
   }
-  __ms_va_end(valist);
+
   LOCK_CONSOLE;
   retval = _cputs( mem );
   UNLOCK_CONSOLE;
@@ -331,3 +330,68 @@ int CDECL _cprintf(const char* format, ...)
     MSVCRT_free (mem);
   return retval;
 }
+
+/*********************************************************************
+ *		_cprintf (MSVCRT.@)
+ */
+int CDECL _cprintf(const char* format, ...)
+{
+  int retval;
+  __ms_va_list valist;
+
+  __ms_va_start( valist, format );
+  retval = _vcprintf(format, valist);
+  __ms_va_end(valist);
+
+  return retval;
+}
+
+
+/*********************************************************************
+ *		_vcwprintf (MSVCRT.@)
+ */
+int CDECL _vcwprintf(const MSVCRT_wchar_t* format, __ms_va_list xvalist)
+{
+  MSVCRT_wchar_t buf[2048], *mem = buf;
+  int written, resize = sizeof(buf), retval;
+  __ms_va_list  valist = xvalist;
+
+  /* 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_vsnwprintf( mem, resize, format, valist )) == -1 ||
+          written > resize)
+  {
+    resize = (written == -1 ? resize * 2 : written + 1);
+    if (mem != buf)
+      MSVCRT_free (mem);
+    if (!(mem = MSVCRT_malloc(resize * sizeof(MSVCRT_wchar_t))))
+      return MSVCRT_EOF;
+    valist = xvalist;
+  }
+
+  LOCK_CONSOLE;
+  retval = _cputws( mem );
+  UNLOCK_CONSOLE;
+  if (mem != buf)
+    MSVCRT_free (mem);
+  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);
+
+  return retval;
+}
+
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index dc49be8..562c98b 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
@@ -986,13 +986,13 @@
 @ cdecl _unlock(long)
 @ 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-patches mailing list