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

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Alexandre Julliard 2020-03-11 09:30:49 +01:00
parent 295660b985
commit 982f99d3d9
1 changed files with 70 additions and 46 deletions

View File

@ -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] =
{
@ -151,48 +152,14 @@ LPWSTR __cdecl NTDLL__wcsupr( LPWSTR str )
}
/***********************************************************************
* wcscat (NTDLL.@)
*/
LPWSTR __cdecl NTDLL_wcscat( LPWSTR dst, LPCWSTR src )
{
return strcatW( dst, src );
}
/*********************************************************************
* wcschr (NTDLL.@)
*/
LPWSTR __cdecl NTDLL_wcschr( LPCWSTR str, WCHAR ch )
{
return strchrW( str, ch );
}
/*********************************************************************
* wcscmp (NTDLL.@)
*/
INT __cdecl NTDLL_wcscmp( LPCWSTR str1, LPCWSTR str2 )
{
return strcmpW( str1, str2 );
}
/***********************************************************************
* wcscpy (NTDLL.@)
*/
LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src )
{
return strcpyW( dst, src );
}
/*********************************************************************
* wcscspn (NTDLL.@)
*/
INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
{
return strcspnW( str, reject );
WCHAR *p = dst;
while ((*p++ = *src++));
return dst;
}
@ -201,7 +168,50 @@ INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
*/
INT __cdecl NTDLL_wcslen( LPCWSTR str )
{
return strlenW( str );
const WCHAR *s = str;
while (*s) s++;
return s - str;
}
/***********************************************************************
* wcscat (NTDLL.@)
*/
LPWSTR __cdecl NTDLL_wcscat( LPWSTR dst, LPCWSTR src )
{
NTDLL_wcscpy( dst + NTDLL_wcslen(dst), src );
return dst;
}
/*********************************************************************
* wcschr (NTDLL.@)
*/
LPWSTR __cdecl NTDLL_wcschr( LPCWSTR str, WCHAR ch )
{
do { if (*str == ch) return (WCHAR *)(ULONG_PTR)str; } while (*str++);
return NULL;
}
/*********************************************************************
* wcscmp (NTDLL.@)
*/
INT __cdecl NTDLL_wcscmp( LPCWSTR str1, LPCWSTR str2 )
{
while (*str1 && (*str1 == *str2)) { str1++; str2++; }
return *str1 - *str2;
}
/*********************************************************************
* wcscspn (NTDLL.@)
*/
INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
{
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;