Module: wine Branch: master Commit: 85fa2ee53c781563bcc1199fb38501497734d7a4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=85fa2ee53c781563bcc1199fb3...
Author: Piotr Caban piotr@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)