[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