Alexandre Julliard : ntdll: Reimplement remaining string functions to avoid depending on wine/unicode.h.

Alexandre Julliard julliard at winehq.org
Wed Mar 11 17:38:30 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 11 09:30:49 2020 +0100

ntdll: Reimplement remaining string functions to avoid depending on wine/unicode.h.

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

---

 dlls/ntdll/wcstring.c | 84 +++++++++++++++++++++++++++++++++------------------
 1 file changed, 54 insertions(+), 30 deletions(-)

diff --git a/dlls/ntdll/wcstring.c b/dlls/ntdll/wcstring.c
index 01c4bd0296..858c6fc538 100644
--- a/dlls/ntdll/wcstring.c
+++ b/dlls/ntdll/wcstring.c
@@ -29,8 +29,9 @@
 #include <stdio.h>
 
 #include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
 #include "winternl.h"
-#include "wine/unicode.h"
 
 static const unsigned short wctypes[256] =
 {
@@ -152,56 +153,65 @@ LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
 
 
 /***********************************************************************
- *           wcscat    (NTDLL.@)
+ *           wcscpy    (NTDLL.@)
  */
-LPWSTR __cdecl NTDLL_wcscat( LPWSTR dst, LPCWSTR src )
+LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src )
 {
-    return strcatW( dst, src );
+    WCHAR *p = dst;
+    while ((*p++ = *src++));
+    return dst;
 }
 
 
-/*********************************************************************
- *           wcschr    (NTDLL.@)
+/***********************************************************************
+ *           wcslen    (NTDLL.@)
  */
-LPWSTR __cdecl NTDLL_wcschr( LPCWSTR str, WCHAR ch )
+INT __cdecl NTDLL_wcslen( LPCWSTR str )
 {
-    return strchrW( str, ch );
+    const WCHAR *s = str;
+    while (*s) s++;
+    return s - str;
 }
 
 
-/*********************************************************************
- *           wcscmp    (NTDLL.@)
+/***********************************************************************
+ *           wcscat    (NTDLL.@)
  */
-INT __cdecl NTDLL_wcscmp( LPCWSTR str1, LPCWSTR str2 )
+LPWSTR __cdecl NTDLL_wcscat( LPWSTR dst, LPCWSTR src )
 {
-    return strcmpW( str1, str2 );
+    NTDLL_wcscpy( dst + NTDLL_wcslen(dst), src );
+    return dst;
 }
 
 
-/***********************************************************************
- *           wcscpy    (NTDLL.@)
+/*********************************************************************
+ *           wcschr    (NTDLL.@)
  */
-LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src )
+LPWSTR __cdecl NTDLL_wcschr( LPCWSTR str, WCHAR ch )
 {
-    return strcpyW( dst, src );
+    do { if (*str == ch) return (WCHAR *)(ULONG_PTR)str; } while (*str++);
+    return NULL;
 }
 
 
 /*********************************************************************
- *           wcscspn    (NTDLL.@)
+ *           wcscmp    (NTDLL.@)
  */
-INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
+INT __cdecl NTDLL_wcscmp( LPCWSTR str1, LPCWSTR str2 )
 {
-    return strcspnW( str, reject );
+    while (*str1 && (*str1 == *str2)) { str1++; str2++; }
+    return *str1 - *str2;
 }
 
 
-/***********************************************************************
- *           wcslen    (NTDLL.@)
+/*********************************************************************
+ *           wcscspn    (NTDLL.@)
  */
-INT __cdecl NTDLL_wcslen( LPCWSTR str )
+INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
 {
-    return strlenW( str );
+    const WCHAR *ptr;
+    for (ptr = str; *ptr; ptr++) if (NTDLL_wcschr( reject, *ptr )) break;
+    return ptr - str;
 }
 
 
@@ -223,7 +233,9 @@ LPWSTR __cdecl NTDLL_wcsncat( LPWSTR s1, LPCWSTR s2, INT n )
  */
 INT __cdecl NTDLL_wcsncmp( LPCWSTR str1, LPCWSTR str2, INT n )
 {
-    return strncmpW( str1, str2, n );
+    if (n <= 0) return 0;
+    while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
+    return *str1 - *str2;
 }
 
 
@@ -244,7 +256,8 @@ LPWSTR __cdecl NTDLL_wcsncpy( LPWSTR s1, LPCWSTR s2, INT n )
  */
 LPWSTR __cdecl NTDLL_wcspbrk( LPCWSTR str, LPCWSTR accept )
 {
-    return strpbrkW( str, accept );
+    for ( ; *str; str++) if (NTDLL_wcschr( accept, *str )) return (WCHAR *)(ULONG_PTR)str;
+    return NULL;
 }
 
 
@@ -253,7 +266,9 @@ LPWSTR __cdecl NTDLL_wcspbrk( LPCWSTR str, LPCWSTR accept )
  */
 LPWSTR __cdecl NTDLL_wcsrchr( LPWSTR str, WCHAR ch )
 {
-    return strrchrW( str, ch );
+    WCHAR *ret = NULL;
+    do { if (*str == ch) ret = (WCHAR *)(ULONG_PTR)str; } while (*str++);
+    return ret;
 }
 
 
@@ -262,7 +277,9 @@ LPWSTR __cdecl NTDLL_wcsrchr( LPWSTR str, WCHAR ch )
  */
 INT __cdecl NTDLL_wcsspn( LPCWSTR str, LPCWSTR accept )
 {
-    return strspnW( str, accept );
+    const WCHAR *ptr;
+    for (ptr = str; *ptr; ptr++) if (!NTDLL_wcschr( accept, *ptr )) break;
+    return ptr - str;
 }
 
 
@@ -271,7 +288,14 @@ INT __cdecl NTDLL_wcsspn( LPCWSTR str, LPCWSTR accept )
  */
 LPWSTR __cdecl NTDLL_wcsstr( LPCWSTR str, LPCWSTR sub )
 {
-    return strstrW( str, sub );
+    while (*str)
+    {
+        const WCHAR *p1 = str, *p2 = sub;
+        while (*p1 && *p2 && *p1 == *p2) { p1++; p2++; }
+        if (!*p2) return (WCHAR *)str;
+        str++;
+    }
+    return NULL;
 }
 
 
@@ -305,13 +329,13 @@ INT __cdecl NTDLL_wcstombs( LPSTR dst, LPCWSTR src, INT n )
 
     if (!dst)
     {
-        RtlUnicodeToMultiByteSize( &len, src, strlenW(src)*sizeof(WCHAR) );
+        RtlUnicodeToMultiByteSize( &len, src, NTDLL_wcslen(src) * sizeof(WCHAR) );
         return len;
     }
     else
     {
         if (n <= 0) return 0;
-        RtlUnicodeToMultiByteN( dst, n, &len, src, strlenW(src)*sizeof(WCHAR) );
+        RtlUnicodeToMultiByteN( dst, n, &len, src, NTDLL_wcslen(src) * sizeof(WCHAR) );
         if (len < n) dst[len] = 0;
     }
     return len;




More information about the wine-cvs mailing list