[PATCH 13/14] [Msvcrt*]: implemented (_)wcserror_s
Eric Pouech
eric.pouech at orange.fr
Tue Nov 2 16:03:53 CDT 2010
A+
---
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 dddd65b..ca51bae 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 8abae56..3408417 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 4813f88..23aca33 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 f4a198d..172408a 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
@@ -1054,7 +1054,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
More information about the wine-patches
mailing list