Alexandre Julliard : ntdll: Avoid using memchrW().

Alexandre Julliard julliard at winehq.org
Mon Mar 30 16:24:26 CDT 2020


Module: wine
Branch: master
Commit: 186f189107972b739311f95a4ba3833838349b32
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=186f189107972b739311f95a4ba3833838349b32

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar 30 12:09:44 2020 +0200

ntdll: Avoid using memchrW().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/actctx.c    | 15 +++++++++------
 dlls/ntdll/directory.c |  9 ++++++---
 dlls/ntdll/env.c       | 18 ++++++++----------
 3 files changed, 23 insertions(+), 19 deletions(-)

diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index d5f376f224..cd17c6c135 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -1272,6 +1272,7 @@ static xmlstr_t find_xmlns( xmlbuf_t *xmlbuf, const xmlstr_t *name )
 static BOOL next_xml_attr(xmlbuf_t *xmlbuf, struct xml_attr *attr, BOOL *end)
 {
     const WCHAR* ptr;
+    WCHAR quote;
 
     if (xmlbuf->error) return FALSE;
 
@@ -1319,11 +1320,12 @@ static BOOL next_xml_attr(xmlbuf_t *xmlbuf, struct xml_attr *attr, BOOL *end)
 
     if (ptr == xmlbuf->end || (*ptr != '"' && *ptr != '\'')) return set_error( xmlbuf );
 
-    attr->value.ptr = ++ptr;
+    quote = *ptr++;
+    attr->value.ptr = ptr;
     if (ptr == xmlbuf->end) return set_error( xmlbuf );
 
-    ptr = memchrW(ptr, ptr[-1], xmlbuf->end - ptr);
-    if (!ptr)
+    while (ptr < xmlbuf->end && *ptr != quote) ptr++;
+    if (ptr == xmlbuf->end)
     {
         xmlbuf->ptr = xmlbuf->end;
         return set_error( xmlbuf );
@@ -1369,8 +1371,8 @@ static BOOL next_xml_elem( xmlbuf_t *xmlbuf, struct xml_elem *elem, const struct
 
     for (;;)
     {
-        ptr = memchrW(xmlbuf->ptr, '<', xmlbuf->end - xmlbuf->ptr);
-        if (!ptr)
+        for (ptr = xmlbuf->ptr; ptr < xmlbuf->end; ptr++) if (*ptr == '<') break;
+        if (ptr == xmlbuf->end)
         {
             xmlbuf->ptr = xmlbuf->end;
             return set_error( xmlbuf );
@@ -1447,7 +1449,8 @@ static BOOL parse_text_content(xmlbuf_t* xmlbuf, xmlstr_t* content)
 
     if (xmlbuf->error) return FALSE;
 
-    if (!(ptr = memchrW(xmlbuf->ptr, '<', xmlbuf->end - xmlbuf->ptr))) return set_error( xmlbuf );
+    for (ptr = xmlbuf->ptr; ptr < xmlbuf->end; ptr++) if (*ptr == '<') break;
+    if (ptr == xmlbuf->end) return set_error( xmlbuf );
 
     content->ptr = xmlbuf->ptr;
     content->len = ptr - xmlbuf->ptr;
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index 80777da149..d025a37241 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -305,9 +305,12 @@ static inline unsigned int dir_info_size( FILE_INFORMATION_CLASS class, unsigned
 
 static inline BOOL has_wildcard( const UNICODE_STRING *mask )
 {
-    return (!mask ||
-            memchrW( mask->Buffer, '*', mask->Length / sizeof(WCHAR) ) ||
-            memchrW( mask->Buffer, '?', mask->Length / sizeof(WCHAR) ));
+    int i;
+
+    if (!mask) return TRUE;
+    for (i = 0; i < mask->Length / sizeof(WCHAR); i++)
+        if (mask->Buffer[i] == '*' || mask->Buffer[i] == '?') return TRUE;
+    return FALSE;
 }
 
 /* get space from the current directory data buffer, allocating a new one if necessary */
diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c
index 833da58f35..28be49d0b1 100644
--- a/dlls/ntdll/env.c
+++ b/dlls/ntdll/env.c
@@ -1081,7 +1081,7 @@ NTSTATUS WINAPI RtlExpandEnvironmentStrings( const WCHAR *renv, WCHAR *src, SIZE
                                              WCHAR *dst, SIZE_T count, SIZE_T *plen )
 {
     SIZE_T len, total_size = 1;  /* 1 for terminating '\0' */
-    LPCWSTR env, p, var;
+    LPCWSTR env, var;
 
     if (!renv)
     {
@@ -1094,27 +1094,26 @@ NTSTATUS WINAPI RtlExpandEnvironmentStrings( const WCHAR *renv, WCHAR *src, SIZE
     {
         if (*src != '%')
         {
-            if ((p = memchrW( src, '%', src_len ))) len = p - src;
-            else len = src_len;
+            for (len = 0; len < src_len; len++) if (src[len] == '%') break;
             var = src;
             src += len;
             src_len -= len;
         }
         else  /* we are at the start of a variable */
         {
-            if ((p = memchrW( src + 1, '%', src_len - 1 )))
+            for (len = 1; len < src_len; len++) if (src[len] == '%') break;
+            if (len < src_len)
             {
-                len = p - src - 1;  /* Length of the variable name */
-                if ((var = ENV_FindVariable( env, src + 1, len )))
+                if ((var = ENV_FindVariable( env, src + 1, len - 1 )))
                 {
-                    src += len + 2;  /* Skip the variable name */
-                    src_len -= len + 2;
+                    src += len + 1;  /* Skip the variable name */
+                    src_len -= len + 1;
                     len = strlenW(var);
                 }
                 else
                 {
                     var = src;  /* Copy original name instead */
-                    len += 2;
+                    len++;
                     src += len;
                     src_len -= len;
                 }
@@ -1122,7 +1121,6 @@ NTSTATUS WINAPI RtlExpandEnvironmentStrings( const WCHAR *renv, WCHAR *src, SIZE
             else  /* unfinished variable name, ignore it */
             {
                 var = src;
-                len = src_len;  /* Copy whole string */
                 src += len;
                 src_len = 0;
             }




More information about the wine-cvs mailing list