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