[PATCH 0/4] MR11320: msxml3/xpath: Fix translate() function to actually return its result.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11320
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/xpath.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/dlls/msxml3/xpath.c b/dlls/msxml3/xpath.c index 2f5513d8a65..8bae459a739 100644 --- a/dlls/msxml3/xpath.c +++ b/dlls/msxml3/xpath.c @@ -6044,6 +6044,14 @@ static void xpath_builtin_concat(struct xpath_parser_context *ctxt, int nargs) xpath_push_value(ctxt, cur); } +static WCHAR * xpath_wcsstr(const WCHAR *str, const WCHAR *sub) +{ + if (!str || !sub) + return NULL; + + return wcsstr(str, sub); +} + static void xpath_builtin_contains(struct xpath_parser_context *ctxt, int nargs) { struct xpath_object *hay, *needle; @@ -6061,7 +6069,7 @@ static void xpath_builtin_contains(struct xpath_parser_context *ctxt, int nargs) if (hay && hay->type == _XPATH_STRING) { - match = wcsstr(hay->stringval, needle->stringval); + match = !!xpath_wcsstr(hay->stringval, needle->stringval); xpath_push_value(ctxt, xpath_new_boolean(ctxt, match)); xpath_object_release(ctxt->context, hay); xpath_object_release(ctxt->context, needle); @@ -6605,7 +6613,7 @@ static void xpath_builtin_substringbefore(struct xpath_parser_context *ctxt, int xpath_arg_cast_to_string(ctxt); str = xpath_pop_value(ctxt); - point = wcsstr(str->stringval, find->stringval); + point = xpath_wcsstr(str->stringval, find->stringval); if (point) { offset = point - str->stringval; @@ -6632,7 +6640,7 @@ static void xpath_builtin_substringafter(struct xpath_parser_context *ctxt, int xpath_arg_cast_to_string(ctxt); str = xpath_pop_value(ctxt); - point = wcsstr(str->stringval, find->stringval); + point = xpath_wcsstr(str->stringval, find->stringval); if (point) { offset = point - str->stringval + wcslen(find->stringval); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11320
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/xpath.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dlls/msxml3/xpath.c b/dlls/msxml3/xpath.c index 8bae459a739..f2cb685e5c9 100644 --- a/dlls/msxml3/xpath.c +++ b/dlls/msxml3/xpath.c @@ -2535,6 +2535,13 @@ static int xpath_equal_number_values(double arg1, double arg2) return ret; } +static bool xpath_strequal(const WCHAR *str1, const WCHAR *str2) +{ + if (str1 == str2) return true; + if (!str1 || !str2) return false; + return !wcscmp(str1, str2); +} + static bool xpath_equal_values_common(struct xpath_parser_context *ctxt, struct xpath_object *arg1, struct xpath_object *arg2) { @@ -2588,7 +2595,7 @@ static bool xpath_equal_values_common(struct xpath_parser_context *ctxt, ret = (arg2->boolval == ret); break; case XPATH_STRING: - ret = !wcscmp(arg1->stringval, arg2->stringval); + ret = xpath_strequal(arg1->stringval, arg2->stringval); break; case XPATH_NUMBER: xpath_push_value(ctxt, arg1); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11320
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/tests/domdoc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 5464a76aa38..17e7723ae06 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -5280,6 +5280,7 @@ static const struct query_test xpath_test[] = { "*/c", "E3.E1.E2.D1 E3.E2.E2.D1" }, { "*/d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" }, { "//a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" }, + { "//elem[translate(a, \"A\", \"a\") = \"a1 field\"]", "E1.E2.D1", true }, { "//b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" }, { "//c", "E3.E1.E2.D1 E3.E2.E2.D1" }, { "//d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11320
From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/msxml3/node.c | 4 +++- dlls/msxml3/tests/domdoc.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index e72ebc9132c..4c2fda32e75 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -4865,7 +4865,9 @@ WCHAR *xpath_translate_function(const WCHAR *to, const WCHAR *from, const WCHAR cptr++; } - if (buffer.status != S_OK) + string_append(&buffer, L"", 1); + + if (buffer._status != S_OK) string_buffer_cleanup(&buffer); return buffer.data; diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 17e7723ae06..9254914ca07 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -5280,7 +5280,7 @@ static const struct query_test xpath_test[] = { "*/c", "E3.E1.E2.D1 E3.E2.E2.D1" }, { "*/d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" }, { "//a", "E1.E1.E2.D1 E1.E2.E2.D1 E1.E4.E2.D1" }, - { "//elem[translate(a, \"A\", \"a\") = \"a1 field\"]", "E1.E2.D1", true }, + { "//elem[translate(a, \"A\", \"a\") = \"a1 field\"]", "E1.E2.D1" }, { "//b", "E2.E1.E2.D1 E2.E2.E2.D1 E2.E4.E2.D1" }, { "//c", "E3.E1.E2.D1 E3.E2.E2.D1" }, { "//d", "E4.E1.E2.D1 E4.E2.E2.D1 E4.E4.E2.D1" }, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11320
participants (2)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov)