msvcrt: Implement opening Unicode files with no BOM in _wsopen_dispatch.
Spotted by Alistair Leslie-Hughes. Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
00a024725e
commit
b0ab1b7602
|
@ -2174,17 +2174,15 @@ static int check_bom(HANDLE h, int oflags, BOOL seek)
|
||||||
char bom[sizeof(utf8_bom)];
|
char bom[sizeof(utf8_bom)];
|
||||||
DWORD r;
|
DWORD r;
|
||||||
|
|
||||||
oflags &= ~(MSVCRT__O_WTEXT|MSVCRT__O_U16TEXT|MSVCRT__O_U8TEXT);
|
|
||||||
|
|
||||||
if (!ReadFile(h, bom, sizeof(utf8_bom), &r, NULL))
|
if (!ReadFile(h, bom, sizeof(utf8_bom), &r, NULL))
|
||||||
return oflags;
|
return oflags;
|
||||||
|
|
||||||
if (r==sizeof(utf8_bom) && !memcmp(bom, utf8_bom, sizeof(utf8_bom))) {
|
if (r==sizeof(utf8_bom) && !memcmp(bom, utf8_bom, sizeof(utf8_bom))) {
|
||||||
oflags |= MSVCRT__O_U8TEXT;
|
oflags = (oflags & ~(MSVCRT__O_WTEXT | MSVCRT__O_U16TEXT)) | MSVCRT__O_U8TEXT;
|
||||||
}else if (r>=sizeof(utf16_bom) && !memcmp(bom, utf16_bom, sizeof(utf16_bom))) {
|
}else if (r>=sizeof(utf16_bom) && !memcmp(bom, utf16_bom, sizeof(utf16_bom))) {
|
||||||
if (seek && r>2)
|
if (seek && r>2)
|
||||||
SetFilePointer(h, 2, NULL, FILE_BEGIN);
|
SetFilePointer(h, 2, NULL, FILE_BEGIN);
|
||||||
oflags |= MSVCRT__O_U16TEXT;
|
oflags = (oflags & ~(MSVCRT__O_WTEXT | MSVCRT__O_U8TEXT)) | MSVCRT__O_U16TEXT;
|
||||||
}else if (seek) {
|
}else if (seek) {
|
||||||
SetFilePointer(h, 0, NULL, FILE_BEGIN);
|
SetFilePointer(h, 0, NULL, FILE_BEGIN);
|
||||||
}
|
}
|
||||||
|
@ -2284,8 +2282,6 @@ int CDECL MSVCRT__wsopen_dispatch( const MSVCRT_wchar_t* path, int oflags, int s
|
||||||
oflags = check_bom(hand, oflags, FALSE);
|
oflags = check_bom(hand, oflags, FALSE);
|
||||||
CloseHandle(hand);
|
CloseHandle(hand);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
oflags &= ~(MSVCRT__O_WTEXT|MSVCRT__O_U16TEXT|MSVCRT__O_U8TEXT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hand = CreateFileW(path, access, sharing, &sa, creation, attrib, 0);
|
hand = CreateFileW(path, access, sharing, &sa, creation, attrib, 0);
|
||||||
|
|
|
@ -971,6 +971,38 @@ static void test_fgetwc_unicode(void)
|
||||||
ok(ch == WEOF, "got %04hx, expected WEOF (unicode)\n", ch);
|
ok(ch == WEOF, "got %04hx, expected WEOF (unicode)\n", ch);
|
||||||
fclose(tempfh);
|
fclose(tempfh);
|
||||||
|
|
||||||
|
tempfh = fopen(tempfile, "r,ccs=utf-8");
|
||||||
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
|
for (i = 1; i < ARRAY_SIZE(wchar_text); i++)
|
||||||
|
{
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == wchar_text[i],
|
||||||
|
"got %04hx, expected %04x (unicode[%d])\n", ch, wchar_text[i], i-1);
|
||||||
|
}
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == WEOF, "got %04hx, expected WEOF (unicode)\n", ch);
|
||||||
|
fclose(tempfh);
|
||||||
|
|
||||||
|
tempfh = fopen(tempfile, "a,ccs=utf-16le");
|
||||||
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
|
ch = fputwc('a', tempfh);
|
||||||
|
ok(ch == 'a', "fputwc returned %x\n", ch);
|
||||||
|
fclose(tempfh);
|
||||||
|
|
||||||
|
tempfh = fopen(tempfile, "a+,ccs=utf-8");
|
||||||
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
|
for (i = 1; i < ARRAY_SIZE(wchar_text); i++)
|
||||||
|
{
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == wchar_text[i],
|
||||||
|
"got %04hx, expected %04x (unicode[%d])\n", ch, wchar_text[i], i-1);
|
||||||
|
}
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == 'a', "got %04x, expected 'a'\n", ch);
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == WEOF, "got %04hx, expected WEOF (unicode)\n", ch);
|
||||||
|
fclose(tempfh);
|
||||||
|
|
||||||
tempfh = fopen(tempfile, "wb");
|
tempfh = fopen(tempfile, "wb");
|
||||||
ok(tempfh != NULL, "can't open tempfile\n");
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
ret = WideCharToMultiByte(CP_UTF8, 0, wchar_text, ARRAY_SIZE(wchar_text),
|
ret = WideCharToMultiByte(CP_UTF8, 0, wchar_text, ARRAY_SIZE(wchar_text),
|
||||||
|
@ -990,6 +1022,23 @@ static void test_fgetwc_unicode(void)
|
||||||
ch = fgetwc(tempfh);
|
ch = fgetwc(tempfh);
|
||||||
ok(ch == WEOF, "got %04hx, expected WEOF (utf8)\n", ch);
|
ok(ch == WEOF, "got %04hx, expected WEOF (utf8)\n", ch);
|
||||||
fclose(tempfh);
|
fclose(tempfh);
|
||||||
|
|
||||||
|
tempfh = fopen(tempfile, "wb");
|
||||||
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
|
fwrite(wchar_text+1, 1, sizeof(wchar_text)-1, tempfh);
|
||||||
|
fclose(tempfh);
|
||||||
|
|
||||||
|
tempfh = fopen(tempfile, "rt,ccs=utf-16le");
|
||||||
|
ok(tempfh != NULL, "can't open tempfile\n");
|
||||||
|
for (i = 1; i < ARRAY_SIZE(wchar_text); i++)
|
||||||
|
{
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == wchar_text[i],
|
||||||
|
"got %04hx, expected %04x (unicode[%d])\n", ch, wchar_text[i], i-1);
|
||||||
|
}
|
||||||
|
ch = fgetwc(tempfh);
|
||||||
|
ok(ch == WEOF, "got %04hx, expected WEOF (unicode)\n", ch);
|
||||||
|
fclose(tempfh);
|
||||||
unlink(temppath);
|
unlink(temppath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue