http://bugs.winehq.org/show_bug.cgi?id=34176
Bug #: 34176 Summary: Kernel32:CompareStringW strange behavior ? Product: Wine Version: 1.6 Platform: x86-64 OS/Version: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: kernel32 AssignedTo: wine-bugs@winehq.org ReportedBy: wine.manette@manette.be Classification: Unclassified
Created attachment 45460 --> http://bugs.winehq.org/attachment.cgi?id=45460 Sorce and compiled executable for wineTest.exe + winedbg log.txt
Hi all, I'm running wine 1.6 (i386) under Debian 7.1 (x86_64). When running a console program of mine (Delphi XE2 compiled under Windows Vista) I'm observing an important behavior difference under wine than nativevely.
I narrowed down the symptom to a string comparison of some sort. Source file below is a code snippet to reproduce the problem (source is UTF-8, Delphi is utf-8 / WideString, WideChar aware).
Here is the (correct/expected) result when program is run natively under Windows Vista:
G:__Project-2\Code\wineTest>wineTest * TEST-001: TRUE * TEST-002: TRUE * TEST-003: TRUE * TEST-004: TRUE TRUE * TEST-005: TRUE TRUE * TEST-003: TRUE TRUE
Here is the same program output when run from Wine:
root@Bilbo-100:~# wine wineTest.exe Wine cannot find the ncurses library (libncurses.so.5). fixme:thread:GetThreadUILanguage : stub, returning default language. fixme:thread:GetThreadPreferredUILanguages 56, 0x33d8f8, (nil) 0x33d920 fixme:thread:GetThreadPreferredUILanguages 56, 0x33d8f8, (nil) 0x33d920 * TEST-001: TRUE * TEST-002: TRUE * TEST-003: TRUE * TEST-004: TRUE FALSE * TEST-005: TRUE FALSE * TEST-003: TRUE FALSE
For what I understood the TStringList IndexOf method may use Windows API's CompareStringW function (http://source.winehq.org/WineAPI/CompareStringW.html)
Is this a configuration problem (locale ?) May this be a bug or implementation problem ?
I can provide the corrsponding binary wineTest.exe
//////////////////////////////////////////////////
Using winedbg I could crosscheck that CompareStringW for two different strings result in equality (CSTR_LESS_THAN = 1, CSTR_EQUAL = 2, CSTR_GREATER_THAN = 3). Maybe this is because of locale setting or flags setup ?
root@Bilbo-100:~# WINEDEBUG=+relay,+snoop wine wineTest.exe &> log.txt
root@Bilbo-100:~# grep CompareStringW log.txt 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"m\00b2",00000002,00449890 L"m\00b2",00000002) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"m\00b2",00000002,004498bc L"m2",00000002) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"m\00b3",00000002,004498f8 L"m\00b3",00000002) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"m\00b3",00000002,0044990c L"m3",00000002) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"\00e9\00e9\00e9",00000003,00449920 L"\00e9\00e9\00e9",00000003) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0 0009:Call KERNEL32.CompareStringW(00000400,00000001,00549cac L"\00e9\00e9\00e9",00000003,00449934 L"eee",00000003) ret=004187d0 0009:Ret KERNEL32.CompareStringW() retval=00000002 ret=004187d0
///////////////////////////////////////////////////
program wineTest;
{$APPTYPE CONSOLE}
Uses Classes;
var
sl : TStringList;
begin
Write(ErrOutput, '* TEST-001: '); if not('m²'='m2') then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
Write(ErrOutput, '* TEST-002: '); if not('m³'='m3') then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
Write(ErrOutput, '* TEST-003: '); if not('ééé'='eee') then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
sl := TStringList.Create;
Write(ErrOutput, '* TEST-004: '); sl.Clear; sl.Add('m²'); if not(sl.IndexOf('m²')<0) then Write(ErrOutput, 'TRUE') else Write(ErrOutput, 'FALSE'); Write(ErrOutput, ' '); if sl.IndexOf('m2')<0 then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
Write(ErrOutput, '* TEST-005: '); sl.Clear; sl.Add('m³'); if not(sl.IndexOf('m³')<0) then Write(ErrOutput, 'TRUE') else Write(ErrOutput, 'FALSE'); Write(ErrOutput, ' '); if sl.IndexOf('m3')<0 then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
Write(ErrOutput, '* TEST-003: '); sl.Clear; sl.Add('ééé'); if not(sl.IndexOf('ééé')<0) then Write(ErrOutput, 'TRUE') else Write(ErrOutput, 'FALSE'); Write(ErrOutput, ' '); if sl.IndexOf('eee')<0 then Writeln(ErrOutput, 'TRUE') else Writeln(ErrOutput, 'FALSE');
end.