Commit b3fcb0f2 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcr110: Copy utf16 strings in _Gettnames.

parent 859261f4
...@@ -171,6 +171,7 @@ static int (__cdecl *p__dpcomp)(double x, double y); ...@@ -171,6 +171,7 @@ static int (__cdecl *p__dpcomp)(double x, double y);
static wchar_t** (CDECL *p____lc_locale_name_func)(void); static wchar_t** (CDECL *p____lc_locale_name_func)(void);
static unsigned int (CDECL *p__GetConcurrency)(void); static unsigned int (CDECL *p__GetConcurrency)(void);
static void* (CDECL *p__W_Gettnames)(void); static void* (CDECL *p__W_Gettnames)(void);
static void* (CDECL *p__Gettnames)(void);
static void (CDECL *p_free)(void*); static void (CDECL *p_free)(void*);
static float (CDECL *p_strtof)(const char *, char **); static float (CDECL *p_strtof)(const char *, char **);
static int (CDECL *p__finite)(double); static int (CDECL *p__finite)(double);
...@@ -242,6 +243,7 @@ static BOOL init(void) ...@@ -242,6 +243,7 @@ static BOOL init(void)
p____lc_locale_name_func = (void*)GetProcAddress(module, "___lc_locale_name_func"); p____lc_locale_name_func = (void*)GetProcAddress(module, "___lc_locale_name_func");
p__GetConcurrency = (void*)GetProcAddress(module,"?_GetConcurrency@details@Concurrency@@YAIXZ"); p__GetConcurrency = (void*)GetProcAddress(module,"?_GetConcurrency@details@Concurrency@@YAIXZ");
p__W_Gettnames = (void*)GetProcAddress(module, "_W_Gettnames"); p__W_Gettnames = (void*)GetProcAddress(module, "_W_Gettnames");
p__Gettnames = (void*)GetProcAddress(module, "_Gettnames");
p_free = (void*)GetProcAddress(module, "free"); p_free = (void*)GetProcAddress(module, "free");
p_strtof = (void*)GetProcAddress(module, "strtof"); p_strtof = (void*)GetProcAddress(module, "strtof");
p__finite = (void*)GetProcAddress(module, "_finite"); p__finite = (void*)GetProcAddress(module, "_finite");
...@@ -531,7 +533,7 @@ static void test__GetConcurrency(void) ...@@ -531,7 +533,7 @@ static void test__GetConcurrency(void)
ok(c == si.dwNumberOfProcessors, "expected %u, got %u\n", si.dwNumberOfProcessors, c); ok(c == si.dwNumberOfProcessors, "expected %u, got %u\n", si.dwNumberOfProcessors, c);
} }
static void test__W_Gettnames(void) static void test_gettnames(void* (CDECL *p_gettnames)(void))
{ {
static const char *str[] = { static const char *str[] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
...@@ -557,7 +559,7 @@ static void test__W_Gettnames(void) ...@@ -557,7 +559,7 @@ static void test__W_Gettnames(void)
if(!p_setlocale(LC_ALL, "english")) if(!p_setlocale(LC_ALL, "english"))
return; return;
ret = p__W_Gettnames(); ret = p_gettnames();
size = ret->str[0]-(char*)ret; size = ret->str[0]-(char*)ret;
if(sizeof(void*) == 8) if(sizeof(void*) == 8)
ok(size==0x2c0, "structure size: %x\n", size); ok(size==0x2c0, "structure size: %x\n", size);
...@@ -572,6 +574,10 @@ static void test__W_Gettnames(void) ...@@ -572,6 +574,10 @@ static void test__W_Gettnames(void)
ok(!lstrcmpW(ret->wstr[i], buf), "ret->wstr[%d] = %s, expected %s\n", ok(!lstrcmpW(ret->wstr[i], buf), "ret->wstr[%d] = %s, expected %s\n",
i, wine_dbgstr_w(ret->wstr[i]), wine_dbgstr_w(buf)); i, wine_dbgstr_w(ret->wstr[i]), wine_dbgstr_w(buf));
} }
ok(ret->str[42] + strlen(ret->str[42])+1 == (char*)ret->wstr[0],
"ret->str[42] = %p len = %d, ret->wstr[0] = %p\n",
ret->str[42], strlen(ret->str[42]), ret->wstr[0]);
p_free(ret); p_free(ret);
p_setlocale(LC_ALL, "C"); p_setlocale(LC_ALL, "C");
...@@ -1111,7 +1117,8 @@ START_TEST(msvcr120) ...@@ -1111,7 +1117,8 @@ START_TEST(msvcr120)
test__dpcomp(); test__dpcomp();
test____lc_locale_name_func(); test____lc_locale_name_func();
test__GetConcurrency(); test__GetConcurrency();
test__W_Gettnames(); test_gettnames(p__W_Gettnames);
test_gettnames(p__Gettnames);
test__strtof(); test__strtof();
test_remainder(); test_remainder();
test_critical_section(); test_critical_section();
......
...@@ -804,6 +804,10 @@ void* CDECL _Gettnames(void) ...@@ -804,6 +804,10 @@ void* CDECL _Gettnames(void)
for(i=0; i<ARRAY_SIZE(cur->str.str); i++) for(i=0; i<ARRAY_SIZE(cur->str.str); i++)
size += strlen(cur->str.str[i])+1; size += strlen(cur->str.str[i])+1;
#if _MSVCR_VER >= 110
for(i=0; i<ARRAY_SIZE(cur->wstr.wstr); i++)
size += (wcslen(cur->wstr.wstr[i]) + 1) * sizeof(wchar_t);
#endif
ret = malloc(size); ret = malloc(size);
if(!ret) if(!ret)
...@@ -817,6 +821,14 @@ void* CDECL _Gettnames(void) ...@@ -817,6 +821,14 @@ void* CDECL _Gettnames(void)
ret->str.str[i] = &ret->data[size]; ret->str.str[i] = &ret->data[size];
size += len; size += len;
} }
#if _MSVCR_VER >= 110
for(i=0; i<ARRAY_SIZE(cur->wstr.wstr); i++) {
len = (wcslen(cur->wstr.wstr[i]) + 1) * sizeof(wchar_t);
memcpy(&ret->data[size], cur->wstr.wstr[i], len);
ret->wstr.wstr[i] = (wchar_t*)&ret->data[size];
size += len;
}
#endif
return ret; return ret;
} }
......
...@@ -733,6 +733,10 @@ static void test__Gettnames(void) ...@@ -733,6 +733,10 @@ static void test__Gettnames(void)
ok(!strcmp(ret->str[i], buf), "ret->str[%i] = %s, expected %s\n", i, ret->str[i], buf); ok(!strcmp(ret->str[i], buf), "ret->str[%i] = %s, expected %s\n", i, ret->str[i], buf);
} }
ok(ret->wstr[0] != NULL, "ret->wstr[0] = NULL\n");
ok(ret->str[42] + strlen(ret->str[42])+1 != (char*)ret->wstr[0],
"ret->str[42] = %p len = %d, ret->wstr[0] = %p\n",
ret->str[42], strlen(ret->str[42]), ret->wstr[0]);
free(ret); free(ret);
if(!setlocale(LC_TIME, "german")) if(!setlocale(LC_TIME, "german"))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment