Piotr Caban : msvcrt: Added _vsnprintf* implementation.

Alexandre Julliard julliard at winehq.org
Mon Apr 19 11:51:16 CDT 2010


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Apr 19 10:57:40 2010 +0200

msvcrt: Added _vsnprintf* implementation.

---

 dlls/msvcr80/msvcr80.spec |   10 +++---
 dlls/msvcr90/msvcr90.spec |   10 +++---
 dlls/msvcrt/msvcrt.h      |    4 ++-
 dlls/msvcrt/msvcrt.spec   |   10 +++---
 dlls/msvcrt/wcs.c         |   65 ++++++++++++++++++++++++++++++++++++++++++---
 5 files changed, 79 insertions(+), 20 deletions(-)

diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 21367a9..02ecbfc 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1048,11 +1048,11 @@
 @ stub _vscwprintf_p
 @ stub _vscwprintf_p_l
 @ cdecl _vsnprintf(ptr long str ptr) msvcrt._vsnprintf
-@ stub _vsnprintf_c
-@ stub _vsnprintf_c_l
-@ stub _vsnprintf_l
-@ stub _vsnprintf_s
-@ stub _vsnprintf_s_l
+@ cdecl _vsnprintf_c(ptr long str ptr) msvcrt._vsnprintf
+@ cdecl _vsnprintf_c_l(ptr long str ptr ptr) msvcrt._vsnprintf_l
+@ cdecl _vsnprintf_l(ptr long str ptr ptr) msvcrt._vsnprintf_l
+@ cdecl _vsnprintf_s(ptr long long str ptr) msvcrt._vsnprintf_s
+@ cdecl _vsnprintf_s_l(ptr long long str ptr ptr) msvcrt._vsnprintf_s_l
 @ cdecl _vsnwprintf(ptr long wstr ptr) msvcrt._vsnwprintf
 @ stub _vsnwprintf_l
 @ stub _vsnwprintf_s
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index d084047..5814fb2 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1035,11 +1035,11 @@
 @ stub _vscwprintf_p
 @ stub _vscwprintf_p_l
 @ cdecl _vsnprintf(ptr long str ptr) msvcrt._vsnprintf
-@ stub _vsnprintf_c
-@ stub _vsnprintf_c_l
-@ stub _vsnprintf_l
-@ stub _vsnprintf_s
-@ stub _vsnprintf_s_l
+@ cdecl _vsnprintf_c(ptr long str ptr) msvcrt._vsnprintf
+@ cdecl _vsnprintf_c_l(ptr long str ptr ptr) msvcrt._vsnprintf_l
+@ cdecl _vsnprintf_l(ptr long str ptr ptr) msvcrt._vsnprintf_l
+@ cdecl _vsnprintf_s(ptr long long str ptr) msvcrt._vsnprintf_s
+@ cdecl _vsnprintf_s_l(ptr long long str ptr ptr) msvcrt._vsnprintf_s_l
 @ cdecl _vsnwprintf(ptr long wstr ptr) msvcrt._vsnwprintf
 @ stub _vsnwprintf_l
 @ stub _vsnwprintf_s
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 2ed5aeb..81b0f4b 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -707,6 +707,8 @@ typedef void (__cdecl *MSVCRT___sighandler_t)(int);
 #define _MB_CP_ANSI     -3
 #define _MB_CP_LOCALE   -4
 
+#define _TRUNCATE ((MSVCRT_size_t)-1)
+
 void  __cdecl    MSVCRT_free(void*);
 void* __cdecl    MSVCRT_malloc(MSVCRT_size_t);
 void* __cdecl    MSVCRT_calloc(MSVCRT_size_t,MSVCRT_size_t);
@@ -735,7 +737,7 @@ MSVCRT___time32_t __cdecl MSVCRT__time32(MSVCRT___time32_t*);
 MSVCRT___time64_t __cdecl MSVCRT__time64(MSVCRT___time64_t*);
 MSVCRT_FILE*   __cdecl MSVCRT__fdopen(int, const char *);
 MSVCRT_FILE*   __cdecl MSVCRT__wfdopen(int, const MSVCRT_wchar_t *);
-int            __cdecl MSVCRT_vsnprintf(char *str, unsigned int len, const char *format, __ms_va_list valist);
+int            __cdecl MSVCRT_vsnprintf(char *str, MSVCRT_size_t len, const char *format, __ms_va_list valist);
 int            __cdecl MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, unsigned int len,
                                        const MSVCRT_wchar_t *format, __ms_va_list valist );
 int            __cdecl MSVCRT_raise(int sig);
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 1f073d3..a7070df 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -977,11 +977,11 @@
 # stub _vscwprintf_l
 # stub _vscwprintf_p_l
 @ cdecl _vsnprintf(ptr long str ptr) MSVCRT_vsnprintf
-# stub _vsnprintf_c
-# stub _vsnprintf_c_l
-# stub _vsnprintf_l
-# stub _vsnprintf_s
-# stub _vsnprintf_s_l
+@ cdecl _vsnprintf_c(ptr long str ptr) MSVCRT_vsnprintf
+@ cdecl _vsnprintf_c_l(ptr long str ptr ptr) MSVCRT_vsnprintf_l
+@ cdecl _vsnprintf_l(ptr long str ptr ptr) MSVCRT_vsnprintf_l
+@ cdecl _vsnprintf_s(ptr long long str ptr) MSVCRT_vsnprintf_s
+@ cdecl _vsnprintf_s_l(ptr long long str ptr ptr) MSVCRT_vsnprintf_s_l
 @ cdecl _vsnwprintf(ptr long wstr ptr) MSVCRT_vsnwprintf
 # stub _vsnwprintf_l
 # stub _vsnwprintf_s
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 7c5a19f..4ebb0e0 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -814,10 +814,10 @@ static int pf_vsnprintf( pf_output *out, const WCHAR *format,
 }
 
 /*********************************************************************
- *		_vsnprintf (MSVCRT.@)
+ * vsnprintf_internal (INTERNAL)
  */
-int CDECL MSVCRT_vsnprintf( char *str, unsigned int len,
-                            const char *format, __ms_va_list valist )
+static inline int vsnprintf_internal( char *str, MSVCRT_size_t len, const char *format,
+        MSVCRT__locale_t locale, BOOL valid, __ms_va_list valist )
 {
     DWORD sz;
     LPWSTR formatW = NULL;
@@ -833,7 +833,7 @@ int CDECL MSVCRT_vsnprintf( char *str, unsigned int len,
     formatW = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
     MultiByteToWideChar( CP_ACP, 0, format, -1, formatW, sz );
 
-    r = pf_vsnprintf( &out, formatW, NULL, FALSE, valist );
+    r = pf_vsnprintf( &out, formatW, locale, valid, valist );
 
     HeapFree( GetProcessHeap(), 0, formatW );
 
@@ -841,6 +841,63 @@ int CDECL MSVCRT_vsnprintf( char *str, unsigned int len,
 }
 
 /*********************************************************************
+ *              _vsnprintf (MSVCRT.@)
+ */
+int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,
+                            const char *format, __ms_va_list valist )
+{
+    return vsnprintf_internal(str, len, format, NULL, FALSE, valist);
+}
+
+/*********************************************************************
+*		_vsnprintf_l (MSVCRT.@)
+ */
+int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format,
+                            MSVCRT__locale_t locale, __ms_va_list valist )
+{
+    return vsnprintf_internal(str, len, format, locale, FALSE, valist);
+}
+
+/*********************************************************************
+ *		_vsnprintf_s_l (MSVCRT.@)
+ */
+int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,
+        MSVCRT_size_t count, const char *format,
+        MSVCRT__locale_t locale, __ms_va_list valist )
+{
+    int len, ret;
+
+    if(sizeOfBuffer<count+1 || count==-1)
+        len = sizeOfBuffer;
+    else
+        len = count+1;
+
+    ret = vsnprintf_internal(str, len, format, locale, TRUE, valist);
+
+    if(ret<0 || ret==len) {
+        if(count!=_TRUNCATE && count>sizeOfBuffer) {
+            MSVCRT__invalid_parameter( NULL, NULL, NULL, 0, 0 );
+            *MSVCRT__errno() = MSVCRT_ERANGE;
+            memset(str, 0, sizeOfBuffer);
+        } else
+            str[len-1] = '\0';
+
+        return -1;
+    }
+
+    return ret;
+}
+
+/*********************************************************************
+ *              _vsnprintf_s (MSVCRT.@)
+ */
+int CDECL MSVCRT_vsnprintf_s( char *str, MSVCRT_size_t sizeOfBuffer,
+        MSVCRT_size_t count, const char *format, __ms_va_list valist )
+{
+    return MSVCRT_vsnprintf_s_l(str,sizeOfBuffer, count, format, NULL, valist);
+}
+
+/*********************************************************************
  *		vsprintf (MSVCRT.@)
  */
 int CDECL MSVCRT_vsprintf( char *str, const char *format, __ms_va_list valist)




More information about the wine-cvs mailing list