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