Further investigation reveals another problem in lstrcmpiA: MSDN documents 
this function as executing what it describes as a "word sort", which results 
in the words "co-op" and "coop" sorting to the same place. This is almost a 
correct description of what happens (if the strings come out to be the same 
after the word sort it appears that it does a regular comparison as well). 
The attached files demonstrate the divergence of wine in this regard as well 
as the original regression.


#include <windows.h>
#include <stdio.h>

char *test_strings1[] =
{
	"_",
	"A",
	"a",
	"z",
	"Z",
	0
};

char *test_strings2[] =
{
	"coop",
	"co-op",
	"co-op a",
	"coop a",
	"co-op b",
	"coop b",
	0
};


void
test_string(char *pch, char **test_strings)
{
	char **ppch = test_strings;

	while (*ppch)
	{
		printf("%s\t%s\t%d\n", pch, *ppch, lstrcmpiA(pch, *ppch));
		++ppch;
	}
}

void
do_test(char **test_strings)
{
	char **ppch = test_strings;

	while (*ppch)
		test_string(*ppch++, test_strings);
}

int
main(int argc, char **argv)
{
	do_test(test_strings1);
	do_test(test_strings2);

	return 0;
}
_       _       0
_       A       -1
_       a       -1
_       z       -1
_       Z       -1
A       _       1
A       A       0
A       a       0
A       z       -1
A       Z       -1
a       _       1
a       A       0
a       a       0
a       z       -1
a       Z       -1
z       _       1
z       A       1
z       a       1
z       z       0
z       Z       0
Z       _       1
Z       A       1
Z       a       1
Z       z       0
Z       Z       0
coop    coop    0
coop    co-op   -1
coop    co-op a -1
coop    coop a  -1
coop    co-op b -1
coop    coop b  -1
co-op   coop    1
co-op   co-op   0
co-op   co-op a -1
co-op   coop a  -1
co-op   co-op b -1
co-op   coop b  -1
co-op a coop    1
co-op a co-op   1
co-op a co-op a 0
co-op a coop a  1
co-op a co-op b -1
co-op a coop b  -1
coop a  coop    1
coop a  co-op   1
coop a  co-op a -1
coop a  coop a  0
coop a  co-op b -1
coop a  coop b  -1
co-op b coop    1
co-op b co-op   1
co-op b co-op a 1
co-op b coop a  1
co-op b co-op b 0
co-op b coop b  1
coop b  coop    1
coop b  co-op   1
coop b  co-op a 1
coop b  coop a  1
coop b  co-op b -1
coop b  coop b  0
_       _       0
_       A       1
_       a       1
_       z       1
_       Z       1
A       _       -1
A       A       0
A       a       0
A       z       -1
A       Z       -1
a       _       -1
a       A       0
a       a       0
a       z       -1
a       Z       -1
z       _       -1
z       A       1
z       a       1
z       z       0
z       Z       0
Z       _       -1
Z       A       1
Z       a       1
Z       z       0
Z       Z       0
coop    coop    0
coop    co-op   1
coop    co-op a 1
coop    coop a  -1
coop    co-op b 1
coop    coop b  -1
co-op   coop    -1
co-op   co-op   0
co-op   co-op a -1
co-op   coop a  -1
co-op   co-op b -1
co-op   coop b  -1
co-op a coop    -1
co-op a co-op   1
co-op a co-op a 0
co-op a coop a  -1
co-op a co-op b -1
co-op a coop b  -1
coop a  coop    1
coop a  co-op   1
coop a  co-op a 1
coop a  coop a  0
coop a  co-op b 1
coop a  coop b  -1
co-op b coop    -1
co-op b co-op   1
co-op b co-op a 1
co-op b coop a  -1
co-op b co-op b 0
co-op b coop b  -1
coop b  coop    1
coop b  co-op   1
coop b  co-op a 1
coop b  coop a  1
coop b  co-op b 1
coop b  coop b  0

Reply via email to