From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/process.c | 6 +++--- dlls/ucrtbase/tests/file.c | 32 +++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/process.c b/dlls/msvcrt/process.c index 625c3da84b9..5b16178b335 100644 --- a/dlls/msvcrt/process.c +++ b/dlls/msvcrt/process.c @@ -316,7 +316,7 @@ static wchar_t *msvcrt_valisttos_aw(const char *arg0, va_list alist, wchar_t del
for (arg = arg0; arg; arg = va_arg( alist, char * )) { - unsigned int len = MultiByteToWideChar( CP_ACP, 0, arg, -1, NULL, 0 ); + unsigned int len = convert_acp_utf8_to_wcs( arg, NULL, 0 ); if (pos + len >= size) { size = max( 256, size * 2 ); @@ -328,7 +328,7 @@ static wchar_t *msvcrt_valisttos_aw(const char *arg0, va_list alist, wchar_t del } ret = new; } - pos += MultiByteToWideChar( CP_ACP, 0, arg, -1, ret + pos, size - pos ); + pos += convert_acp_utf8_to_wcs( arg, ret + pos, size - pos ); ret[pos - 1] = delim; } if (pos) @@ -711,7 +711,7 @@ intptr_t WINAPIV _spawnl(int flags, const char* name, const char* arg0, ...) wchar_t *nameW, *args; intptr_t ret;
- if (!(nameW = msvcrt_wstrdupa(name))) return -1; + if (!(nameW = wstrdupa_utf8(name))) return -1;
va_start(ap, arg0); args = msvcrt_valisttos_aw(arg0, ap, ' '); diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 7cada553303..ad64d1ea081 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -22,6 +22,7 @@ #include <direct.h> #include <stdarg.h> #include <locale.h> +#include <process.h> #include <share.h> #include <sys/stat.h>
@@ -231,7 +232,7 @@ static BOOL is_lossless_convertion(const char *str) return !strcmp(str, buf); }
-static void test_utf8(void) +static void test_utf8(const char *argv0) { const char file[] = "file\xc4\x99\xc5\x9b\xc4\x87.a"; const char dir[] = "dir\xc4\x99\xc5\x9b\xc4\x87"; @@ -242,9 +243,9 @@ static void test_utf8(void) struct _finddata64i32_t fdata64i32; struct _finddata32_t fdata32; struct _finddata64_t fdata64; + intptr_t hfind, hproc; WCHAR bufW[256], *pW; struct _stat64 stat; - intptr_t hfind; FILE *f; int ret;
@@ -454,14 +455,39 @@ static void test_utf8(void) ok(!ret, "_putenv returned %d, errno %d\n", ret, errno); }
+ hproc = _spawnl(_P_NOWAIT, argv0, argv0, "file", "utf8", file, NULL); + ok(hproc != -1, "_spawnl returned %Id, errno %d\n", hproc, errno); + wait_child_process((HANDLE)hproc); + CloseHandle((HANDLE)hproc); + setlocale(LC_ALL, "C"); }
+static void test_utf8_argument(void) +{ + const WCHAR *cmdline = GetCommandLineW(), *p; + + p = wcsrchr(cmdline, ' '); + ok(!!p, "cmdline = %s\n", debugstr_w(cmdline)); + todo_wine_if(GetACP() != CP_UTF8) + ok(!wcscmp(p + 1, L"file\x0119\x015b\x0107.a"), "cmdline = %s\n", debugstr_w(cmdline)); +} + START_TEST(file) { + int arg_c; + char** arg_v; + + arg_c = winetest_get_mainargs(&arg_v); + if(arg_c == 4 && !strcmp(arg_v[2], "utf8")) + { + test_utf8_argument(); + return; + } + test_std_stream_buffering(); test_iobuf_layout(); test_std_stream_open(); test_fopen(); - test_utf8(); + test_utf8(arg_v[0]); }