Eryk Wieliczko : msvcrt: Implement vfprintf_s and vfwprintf_s.

Alexandre Julliard julliard at winehq.org
Thu Nov 25 11:18:54 CST 2010


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

Author: Eryk Wieliczko <ewdevel at gmail.com>
Date:   Wed Nov 24 21:12:35 2010 +0100

msvcrt: Implement vfprintf_s and vfwprintf_s.

---

 dlls/msvcr100/msvcr100.spec |    4 +-
 dlls/msvcr80/msvcr80.spec   |    4 +-
 dlls/msvcr90/msvcr90.spec   |    4 +-
 dlls/msvcrt/file.c          |   72 +++++++++++++++++++++++++++++++++++++++++--
 dlls/msvcrt/msvcrt.spec     |    4 +-
 include/msvcrt/stdio.h      |    2 +
 include/msvcrt/wchar.h      |    1 +
 7 files changed, 80 insertions(+), 11 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 2382e20..1c8dc12 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1617,9 +1617,9 @@
 @ cdecl ungetc(long ptr) msvcrt.ungetc
 @ cdecl ungetwc(long ptr) msvcrt.ungetwc
 @ cdecl vfprintf(ptr str ptr) msvcrt.vfprintf
-@ stub vfprintf_s
+@ cdecl vfprintf_s(ptr str ptr) msvcrt.vfprintf_s
 @ cdecl vfwprintf(ptr wstr ptr) msvcrt.vfwprintf
-@ stub vfwprintf_s
+@ cdecl vfwprintf_s(ptr wstr ptr) msvcrt.vfwprintf_s
 @ cdecl vprintf(str ptr) msvcrt.vprintf
 @ stub vprintf_s
 @ cdecl vsprintf(ptr str ptr) msvcrt.vsprintf
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 5e52a28..3bee113 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1471,9 +1471,9 @@
 @ cdecl ungetc(long ptr) msvcrt.ungetc
 @ cdecl ungetwc(long ptr) msvcrt.ungetwc
 @ cdecl vfprintf(ptr str ptr) msvcrt.vfprintf
-@ stub vfprintf_s
+@ cdecl vfprintf_s(ptr str ptr) msvcrt.vfprintf_s
 @ cdecl vfwprintf(ptr wstr ptr) msvcrt.vfwprintf
-@ stub vfwprintf_s
+@ cdecl vfwprintf_s(ptr wstr ptr) msvcrt.vfwprintf_s
 @ cdecl vprintf(str ptr) msvcrt.vprintf
 @ stub vprintf_s
 @ cdecl vsprintf(ptr str ptr) msvcrt.vsprintf
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 6b2d664..536db47 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1455,9 +1455,9 @@
 @ cdecl ungetc(long ptr) msvcrt.ungetc
 @ cdecl ungetwc(long ptr) msvcrt.ungetwc
 @ cdecl vfprintf(ptr str ptr) msvcrt.vfprintf
-@ stub vfprintf_s
+@ cdecl vfprintf_s(ptr str ptr) msvcrt.vfprintf_s
 @ cdecl vfwprintf(ptr wstr ptr) msvcrt.vfwprintf
-@ stub vfwprintf_s
+@ cdecl vfwprintf_s(ptr wstr ptr) msvcrt.vfwprintf_s
 @ cdecl vprintf(str ptr) msvcrt.vprintf
 @ stub vprintf_s
 @ cdecl vsprintf(ptr str ptr) msvcrt.vsprintf
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 91cd448..0c60bdc 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -3362,10 +3362,46 @@ int CDECL MSVCRT_vfprintf(MSVCRT_FILE* file, const char *format, __ms_va_list va
 }
 
 /*********************************************************************
+ *		vfprintf_s (MSVCRT.@)
+ */
+int CDECL MSVCRT_vfprintf_s(MSVCRT_FILE* file, const char *format, __ms_va_list valist)
+{
+  char buf[2048];
+  LPWSTR formatW = NULL;
+  DWORD sz;
+  pf_output out;
+  int written, retval;
+
+  if( !MSVCRT_CHECK_PMT( file != NULL ) )
+  {
+    *MSVCRT__errno() = MSVCRT_EINVAL;
+    return -1;
+  }
+
+  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 ((written = pf_vsnprintf( &out, formatW, NULL, TRUE, valist )) >= 0)
+  {
+      retval = MSVCRT_fwrite(out.buf.A, sizeof(*out.buf.A), written, file);
+  }
+  else retval = -1;
+
+  HeapFree( GetProcessHeap(), 0, formatW );
+
+  if (out.buf.A != out.grow.A)
+    MSVCRT_free (out.buf.A);
+  return retval;
+}
+
+/*********************************************************************
  *		vfwprintf (MSVCRT.@)
- * FIXME:
- * Is final char included in written (then resize is too big) or not
- * (then we must test for equality too)?
  */
 int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
 {
@@ -3389,6 +3425,36 @@ int CDECL MSVCRT_vfwprintf(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms
 }
 
 /*********************************************************************
+ *		vfwprintf_s (MSVCRT.@)
+ */
+int CDECL MSVCRT_vfwprintf_s(MSVCRT_FILE* file, const MSVCRT_wchar_t *format, __ms_va_list valist)
+{
+  MSVCRT_wchar_t buf[2048];
+  pf_output out;
+  int written, retval;
+
+  if( !MSVCRT_CHECK_PMT( file != NULL ) )
+  {
+    *MSVCRT__errno() = MSVCRT_EINVAL;
+    return -1;
+  }
+
+  out.unicode = TRUE;
+  out.buf.W = out.grow.W = buf;
+  out.used = 0;
+  out.len = sizeof(buf) / sizeof(buf[0]);
+
+  if ((written = pf_vsnprintf( &out, format, NULL, TRUE, valist )) >= 0)
+  {
+      retval = MSVCRT_fwrite(out.buf.W, sizeof(*out.buf.W), written, file);
+  }
+  else retval = -1;
+  if (out.buf.W != out.grow.W)
+    MSVCRT_free (out.buf.W);
+  return retval;
+}
+
+/*********************************************************************
  *		vprintf (MSVCRT.@)
  */
 int CDECL MSVCRT_vprintf(const char *format, __ms_va_list valist)
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 11d0a49..b6d1f10 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1422,9 +1422,9 @@
 @ cdecl ungetwc(long ptr) MSVCRT_ungetwc
 # stub utime
 @ cdecl vfprintf(ptr str ptr) MSVCRT_vfprintf
-# stub vfprintf_s
+@ cdecl vfprintf_s(ptr str ptr) MSVCRT_vfprintf_s
 @ cdecl vfwprintf(ptr wstr ptr) MSVCRT_vfwprintf
-# stub vfwprintf_s
+@ cdecl vfwprintf_s(ptr wstr ptr) MSVCRT_vfwprintf_s
 @ cdecl vprintf(str ptr) MSVCRT_vprintf
 # stub vprintf_s
 # stub vsnprintf
diff --git a/include/msvcrt/stdio.h b/include/msvcrt/stdio.h
index a190f5d..e27c8ca 100644
--- a/include/msvcrt/stdio.h
+++ b/include/msvcrt/stdio.h
@@ -166,6 +166,7 @@ FILE*  __cdecl tmpfile(void);
 char*  __cdecl tmpnam(char*);
 int    __cdecl ungetc(int,FILE*);
 int    __cdecl vfprintf(FILE*,const char*,__ms_va_list);
+int    __cdecl vfprintf_s(FILE*,const char*,__ms_va_list);
 int    __cdecl vprintf(const char*,__ms_va_list);
 int    __cdecl vsprintf(char*,const char*,__ms_va_list);
 int    __cdecl vsprintf_s(char*,size_t,const char*,__ms_va_list);
@@ -212,6 +213,7 @@ int      __cdecl swscanf(const wchar_t*,const wchar_t*,...);
 int      __cdecl swscanf_s(const wchar_t*,const wchar_t*,...);
 wint_t   __cdecl ungetwc(wint_t,FILE*);
 int      __cdecl vfwprintf(FILE*,const wchar_t*,__ms_va_list);
+int      __cdecl vfwprintf_s(FILE*,const wchar_t*,__ms_va_list);
 int      __cdecl vswprintf(wchar_t*,const wchar_t*,__ms_va_list);
 int      __cdecl vswprintf_s(wchar_t*,size_t,const wchar_t*,__ms_va_list);
 int      __cdecl vwprintf(const wchar_t*,__ms_va_list);
diff --git a/include/msvcrt/wchar.h b/include/msvcrt/wchar.h
index c5ab25f..7c495f0 100644
--- a/include/msvcrt/wchar.h
+++ b/include/msvcrt/wchar.h
@@ -310,6 +310,7 @@ int      __cdecl swscanf(const wchar_t*,const wchar_t*,...);
 int      __cdecl swscanf_s(const wchar_t*,const wchar_t*,...);
 wint_t   __cdecl ungetwc(wint_t,FILE*);
 int      __cdecl vfwprintf(FILE*,const wchar_t*,__ms_va_list);
+int      __cdecl vfwprintf_s(FILE*,const wchar_t*,__ms_va_list);
 int      __cdecl vswprintf(wchar_t*,const wchar_t*,__ms_va_list);
 int      __cdecl vswprintf_s(wchar_t*,size_t,const wchar_t*,__ms_va_list);
 int      __cdecl vwprintf(const wchar_t*,__ms_va_list);




More information about the wine-cvs mailing list