[PATCH v2] kernel32: Implement FindNLSStringEx. Tests included.
Sergio Gómez Del Real
sdelreal at codeweavers.com
Mon Mar 12 10:54:51 CDT 2018
On 12/03/18 10:52, Sergio Gómez Del Real wrote:
> On 12/03/18 10:36, Huw Davies wrote:
>
>> On Mon, Mar 12, 2018 at 10:31:31AM -0500, Sergio Gómez Del Real wrote:
>>> On 12/03/18 10:13, Huw Davies wrote:
>>>
>>>> On Mon, Mar 12, 2018 at 09:39:16AM -0500, Sergio Gómez Del Real wrote:
>>>>> 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).
>>>> If CompareStringEx handles the normailization, then you'd call it in
>>>> pretty much the same way as you do in the current patch (though you'd
>>>> loop right through to the end, not stopping value_size from the end).
>>>> The tricky bit would be getting the 'found' length. For that you'd
>>>> probably use an internal version of CompareStringEx that returned
>>>> this info.
>>>>
>>>> For now, I'd stick with the fixme comment.
>>>>
>>>> Huw.
>>> Hi, Huw,
>>> Maybe I'm not following well, but in the current patch I'm always calling
>>> CompareStringEx() with the same string length for both strings (value_size).
>>> Being this the case, I'm not sure if CompareStringEx() would succeed when it
>>> needs to, even if it did normalization.
>> Grrr, right. This is why you'd do the normailization before calling
>> CompareStringEx().
>>
>> Huw.
>
> I'm not really sure what assumptions I can make to avoid an o(n.m),
> since both of the strings can be presented with characters in any
> (pre)composed form... I don't know if the trouble trying to find a way
> to upper-bound the search with a length (3x? 5x?) would be worth
> considering that it seems to be the normal case that we don't get too
> long strings to compare, and relatively little use of the function
> itself. Would brute-force o(n.m) be /too/ bad?
>
That is, it seems that the substring search for Unicode strings can get
arbitrarily complex, so as to make o(n.m) unavoidable.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20180312/8dffd7ee/attachment.html>
More information about the wine-devel
mailing list