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

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
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 <stdio.h>
#include "windef.h" #include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "winternl.h" #include "winternl.h"
#include "wine/unicode.h"
static const unsigned short wctypes[256] = 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.@) * wcscpy (NTDLL.@)
*/ */
LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src ) LPWSTR __cdecl NTDLL_wcscpy( LPWSTR dst, LPCWSTR src )
{ {
return strcpyW( dst, src ); WCHAR *p = dst;
} while ((*p++ = *src++));
return dst;
/*********************************************************************
* wcscspn (NTDLL.@)
*/
INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
{
return strcspnW( str, reject );
} }
@ -201,7 +168,50 @@ INT __cdecl NTDLL_wcscspn( LPCWSTR str, LPCWSTR reject )
*/ */
INT __cdecl NTDLL_wcslen( LPCWSTR str ) 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 ) 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 ) 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 ) 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 ) 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 ) 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) if (!dst)
{ {
RtlUnicodeToMultiByteSize( &len, src, strlenW(src)*sizeof(WCHAR) ); RtlUnicodeToMultiByteSize( &len, src, NTDLL_wcslen(src) * sizeof(WCHAR) );
return len; return len;
} }
else else
{ {
if (n <= 0) return 0; 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; if (len < n) dst[len] = 0;
} }
return len; return len;