Module: wine Branch: master Commit: 5437c72fe19cf99e22e63c924c78bf9b7c195096 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5437c72fe19cf99e22e63c924c...
Author: Eric Pouech eric.pouech@orange.fr Date: Tue Nov 2 22:03:53 2010 +0100
msvcrt: Implemented (_)wcserror_s.
---
dlls/msvcr100/msvcr100.spec | 4 +- dlls/msvcr80/msvcr80.spec | 4 +- dlls/msvcr90/msvcr90.spec | 4 +- dlls/msvcrt/errno.c | 66 ++++++++++++++++++++++++++++++++---------- dlls/msvcrt/msvcrt.spec | 4 +- 5 files changed, 58 insertions(+), 24 deletions(-)
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec index 8789861..4b5300f 100644 --- a/dlls/msvcr100/msvcr100.spec +++ b/dlls/msvcr100/msvcr100.spec @@ -483,7 +483,7 @@ @ stub __vswprintf_l @ extern __wargv msvcrt.__wargv @ cdecl __wcserror(wstr) msvcrt.__wcserror -@ stub __wcserror_s +@ cdecl __wcserror_s(ptr long wstr) msvcrt.__wcserror_s @ stub __wcsncnt @ cdecl __wgetmainargs(ptr ptr ptr long ptr) msvcrt.__wgetmainargs @ extern __winitenv msvcrt.__winitenv @@ -1285,7 +1285,7 @@ @ stub _wcscoll_l @ cdecl _wcsdup(wstr) msvcrt._wcsdup @ cdecl _wcserror(long) msvcrt._wcserror -@ stub _wcserror_s +@ cdecl _wcserror_s(ptr long long) msvcrt._wcserror_s @ stub _wcsftime_l @ cdecl _wcsicmp(wstr wstr) msvcrt._wcsicmp @ stub _wcsicmp_l diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index 1ca1b19..639c14d 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -307,7 +307,7 @@ @ stub __vswprintf_l @ extern __wargv msvcrt.__wargv @ cdecl __wcserror(wstr) msvcrt.__wcserror -@ stub __wcserror_s +@ cdecl __wcserror_s(ptr long wstr) msvcrt.__wcserror_s @ stub __wcsncnt @ cdecl __wgetmainargs(ptr ptr ptr long ptr) msvcrt.__wgetmainargs @ extern __winitenv msvcrt.__winitenv @@ -1138,7 +1138,7 @@ @ stub _wcscoll_l @ cdecl _wcsdup(wstr) msvcrt._wcsdup @ cdecl _wcserror(long) msvcrt._wcserror -@ stub _wcserror_s +@ cdecl _wcserror_s(ptr long long) msvcrt._wcserror_s @ stub _wcsftime_l @ cdecl _wcsicmp(wstr wstr) msvcrt._wcsicmp @ stub _wcsicmp_l diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index 8d38a07..19a0ec9 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -299,7 +299,7 @@ @ stub __vswprintf_l @ extern __wargv msvcrt.__wargv @ cdecl __wcserror(wstr) msvcrt.__wcserror -@ stub __wcserror_s +@ cdecl __wcserror_s(ptr long wstr) msvcrt.__wcserror_s @ stub __wcsncnt @ cdecl __wgetmainargs(ptr ptr ptr long ptr) msvcrt.__wgetmainargs @ extern __winitenv msvcrt.__winitenv @@ -1125,7 +1125,7 @@ @ stub _wcscoll_l @ cdecl _wcsdup(wstr) msvcrt._wcsdup @ cdecl _wcserror(long) msvcrt._wcserror -@ stub _wcserror_s +@ cdecl _wcserror_s(ptr long long) msvcrt._wcserror_s @ stub _wcsftime_l @ cdecl _wcsicmp(wstr wstr) msvcrt._wcsicmp @ stub _wcsicmp_l diff --git a/dlls/msvcrt/errno.c b/dlls/msvcrt/errno.c index 0457869..70a895c 100644 --- a/dlls/msvcrt/errno.c +++ b/dlls/msvcrt/errno.c @@ -328,6 +328,21 @@ void CDECL MSVCRT_perror(const char* str) }
/********************************************************************* + * _wcserror_s (MSVCRT.@) + */ +int CDECL _wcserror_s(MSVCRT_wchar_t* buffer, MSVCRT_size_t nc, int err) +{ + if (!MSVCRT_CHECK_PMT(buffer != NULL) || !MSVCRT_CHECK_PMT(nc > 0)) + { + _set_errno(MSVCRT_EINVAL); + return MSVCRT_EINVAL; + } + if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr; + MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, buffer, nc); + return 0; +} + +/********************************************************************* * _wcserror (MSVCRT.@) */ MSVCRT_wchar_t* CDECL _wcserror(int err) @@ -336,38 +351,57 @@ MSVCRT_wchar_t* CDECL _wcserror(int err)
if (!data->wcserror_buffer) if (!(data->wcserror_buffer = MSVCRT_malloc(256 * sizeof(MSVCRT_wchar_t)))) return NULL; - - if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr; - MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, data->wcserror_buffer, 256); + _wcserror_s(data->wcserror_buffer, 256, err); return data->wcserror_buffer; }
/********************************************************************** - * __wcserror (MSVCRT.@) + * __wcserror_s (MSVCRT.@) */ -MSVCRT_wchar_t* CDECL __wcserror(const MSVCRT_wchar_t* str) +int CDECL __wcserror_s(MSVCRT_wchar_t* buffer, MSVCRT_size_t nc, const MSVCRT_wchar_t* str) { - thread_data_t *data = msvcrt_get_thread_data(); int err; static const WCHAR colonW[] = {':', ' ', '\0'}; static const WCHAR nlW[] = {'\n', '\0'}; size_t len;
- if (!data->wcserror_buffer) - if (!(data->wcserror_buffer = MSVCRT_malloc(256 * sizeof(MSVCRT_wchar_t)))) return NULL; - - err = data->thread_errno; + err = *MSVCRT__errno(); if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr;
+ len = MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, NULL, 0) + 1 /* \n */; + if (str && *str) len += lstrlenW(str) + 2 /* ': ' */; + if (len > nc) + { + MSVCRT_INVALID_PMT("buffer[nc] is too small"); + _set_errno(MSVCRT_ERANGE); + return MSVCRT_ERANGE; + } if (str && *str) { - lstrcpyW(data->wcserror_buffer, str); - lstrcatW(data->wcserror_buffer, colonW); + lstrcpyW(buffer, str); + lstrcatW(buffer, colonW); } - else data->wcserror_buffer[0] = '\0'; - len = lstrlenW(data->wcserror_buffer); - MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, data->wcserror_buffer + len, 256 - len); - lstrcatW(data->wcserror_buffer, nlW); + else buffer[0] = '\0'; + len = lstrlenW(buffer); + MultiByteToWideChar(CP_ACP, 0, MSVCRT__sys_errlist[err], -1, buffer + len, 256 - len); + lstrcatW(buffer, nlW); + + return 0; +} + +/********************************************************************** + * __wcserror (MSVCRT.@) + */ +MSVCRT_wchar_t* CDECL __wcserror(const MSVCRT_wchar_t* str) +{ + thread_data_t *data = msvcrt_get_thread_data(); + int err; + + if (!data->wcserror_buffer) + if (!(data->wcserror_buffer = MSVCRT_malloc(256 * sizeof(MSVCRT_wchar_t)))) return NULL; + + err = __wcserror_s(data->wcserror_buffer, 256, str); + if (err) FIXME("bad wcserror call (%d)\n", err);
return data->wcserror_buffer; } diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index d1a5c59..10a8870 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -264,7 +264,7 @@ @ extern __unguarded_readlc_active MSVCRT___unguarded_readlc_active @ extern __wargv MSVCRT___wargv @ cdecl __wcserror(wstr) -# stub __wcserror_s +@ cdecl __wcserror_s(ptr long wstr) # stub __wcsncnt @ cdecl __wgetmainargs(ptr ptr ptr long ptr) @ extern __winitenv MSVCRT___winitenv @@ -1058,7 +1058,7 @@ @ cdecl _wcsdup(wstr) # stub _wcsdup_dbg @ cdecl _wcserror(long) -# stub _wcserror_s +@ cdecl _wcserror_s(ptr long long) # stub _wcsftime_l @ cdecl _wcsicmp(wstr wstr) ntdll._wcsicmp # stub _wcsicmp_l