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