Module: wine Branch: master Commit: 982f99d3d9740a3d0c7f390e9e614e9d67ec48cf URL: https://source.winehq.org/git/wine.git/?a=commit;h=982f99d3d9740a3d0c7f390e9...
Author: Alexandre Julliard julliard@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@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;