diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 21367a9081c..02ecbfc9e89 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 d084047aa54..5814fb2c0c8 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 2ed5aeb4a16..81b0f4b8164 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 1f073d320bd..a7070dfbec6 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 7c5a19f001a..4ebb0e08bc4 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,13 +833,70 @@ 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 ); return r; } +/********************************************************************* + * _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(sizeOfBuffersizeOfBuffer) { + 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.@) */