[PATCH v2] kernel32: Implement FindNLSStringEx. Tests included.

Sergio Gómez Del Real sdelreal at codeweavers.com
Mon Mar 12 09:39:16 CDT 2018


On 12/03/18 06:03, Nikolay Sivov wrote:

> On 3/12/2018 12:25 PM, Huw Davies wrote:
>>> +                           LPARAM sort_handle)
>>> +{
>>> +
>>> +    DWORD mask = flags;
>>> +
>>> +    TRACE("%s %x %s %d %s %d %p %p %p %ld\n", wine_dbgstr_w(localename), flags,
>>> +          wine_dbgstr_w(src), src_size, wine_dbgstr_w(value), value_size, found,
>>> +          version_info, reserved, sort_handle);
>>> +    FIXME("strings should be normalized once NormalizeString() is implemented\n");
>> I don't think we want the noise that this FIXME would generate.  Just add a comment.
> Actually it might be possible that CompareString() handles decomposed
> case on its own, I haven't tested that.
>

Yeah, you are right Nikolai; I just tested on Windows and it seems that 
CompareString() shares the same comparison semantics with 
FindNLSStringEx(). On Wine it fails, however, so I guess I'd code 
FindNLSStringEx() assuming a working CompareString(), and then see what 
is missing there.
I actually had it like this in my first patch, relying on CompareString 
(assuming the shared semantics). I wanted to normalize first in this v2 
patch so that the substring search would be worst case o(n) instead of 
o(n.m). However, reading the Unicode standard, it seems that I can make 
some assumptions about the maximum expansion factor in decomposition 
(when assuming canonical decomposition).

/"There is also a Unicode Consortium stability policy that canonical 
mappings are always limited in all versions of Unicode, so that no 
string when decomposed with NFC expands to more than 3× in length 
(measured in code units). This is true whether the text is in UTF-8, 
UTF-16, or UTF-32. This guarantee also allows for certain optimizations 
in processing, especially in determining buffer sizes"

/Although it seems that the worst case possible is a 18x expansion 
factor when using normalization form NFKC, it looks like these functions 
only test for canonical equivalence, so I guess it would be ok to assume 
a worst case of 3x for the length to keep things o(n).

Does this sound right to you?
//
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20180312/e5fc81bd/attachment-0001.html>


More information about the wine-devel mailing list