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