305 lines
5.2 KiB
C
305 lines
5.2 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1990 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
alignstr.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements a number of UNICODE string routines. These
|
||
|
routines are equivalent to the corresponding C runtime routines
|
||
|
with the exception that they can handle unaligned parameters.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Forrest Foltz (forrestf) 1-Jan-2000
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include "basedll.h"
|
||
|
|
||
|
#if !defined(_X86_)
|
||
|
|
||
|
//
|
||
|
// These routines are not intended to be called directly from source,
|
||
|
// rather they are worker functions designed to be called from corresponding
|
||
|
// inlines in alignstr.h.
|
||
|
//
|
||
|
// alignstr.h will never reference these routines on an x86 platform.
|
||
|
//
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// PUWSTR
|
||
|
// __cdecl
|
||
|
// uaw_wcschr(
|
||
|
// IN PCUWSTR String,
|
||
|
// IN WCHAR Character
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Searches String for the first occurence of Character.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// String - Supplies an unaligned pointer to the null-terminated UNICODE
|
||
|
// string to search.
|
||
|
//
|
||
|
// Character - Supplies the UNICODE character to search for.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Returns an unaligned pointer to the first matching character within String
|
||
|
// if found, or NULL if no match was located.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
PUWSTR
|
||
|
__cdecl
|
||
|
uaw_wcschr(
|
||
|
IN PCUWSTR String,
|
||
|
IN WCHAR Character
|
||
|
)
|
||
|
{
|
||
|
PUWSTR pch;
|
||
|
|
||
|
//
|
||
|
// Search the whole string looking for the first matching character.
|
||
|
// Note that the search INCLUDES the terminating null character.
|
||
|
//
|
||
|
|
||
|
pch = (PUWSTR)String;
|
||
|
while (TRUE) {
|
||
|
|
||
|
if (*pch == Character) {
|
||
|
return pch;
|
||
|
}
|
||
|
|
||
|
if (*pch == 0) {
|
||
|
return NULL;
|
||
|
}
|
||
|
pch++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// PUWSTR
|
||
|
// __cdecl
|
||
|
// uaw_wcscpy(
|
||
|
// IN PUWSTR Destination,
|
||
|
// IN PCUWSTR Source
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Copies a null-terminated UNICODE string.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Destination - Supplies a possibly unaligned pointer to the destination
|
||
|
// of the copy.
|
||
|
//
|
||
|
// Source - Supplies a possibly unaligned pointer to the UNICODE string
|
||
|
// to be copied.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Returns a possibly unaligned pointer to the destination of the copy.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
PUWSTR
|
||
|
_cdecl
|
||
|
uaw_wcscpy(
|
||
|
IN PUWSTR Destination,
|
||
|
IN PCUWSTR Source
|
||
|
)
|
||
|
{
|
||
|
PCUWSTR src;
|
||
|
PUWSTR dst;
|
||
|
|
||
|
src = Source;
|
||
|
dst = Destination;
|
||
|
|
||
|
while (TRUE) {
|
||
|
|
||
|
*dst = *src;
|
||
|
if (*src == 0) {
|
||
|
return Destination;
|
||
|
}
|
||
|
|
||
|
dst++;
|
||
|
src++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// size_t
|
||
|
// __cdecl
|
||
|
// uaw_wcslen(
|
||
|
// IN PCUWSTR String
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Determines the number of characters within a null-terminated UNICODE
|
||
|
// string, excluding the null-terminator.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// String - Supplies an unaligned pointer to the null-terminated UNICODE
|
||
|
// string.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Returns the number of characters within String.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
size_t
|
||
|
__cdecl
|
||
|
uaw_wcslen(
|
||
|
IN PCUWSTR String
|
||
|
)
|
||
|
{
|
||
|
PCUWSTR pch;
|
||
|
|
||
|
pch = String;
|
||
|
while (*pch != 0) {
|
||
|
pch++;
|
||
|
}
|
||
|
return pch - String;
|
||
|
}
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// PUWSTR
|
||
|
// __cdecl
|
||
|
// uaw_wcsrchr(
|
||
|
// IN PCUWSTR String,
|
||
|
// IN WCHAR Character
|
||
|
// )
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Searches String for the last occurence of Character.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// String - Supplies an unaligned pointer to the null-terminated UNICODE
|
||
|
// string to search.
|
||
|
//
|
||
|
// Character - Supplies the UNICODE character to search for.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Returns an unaligned pointer to the last matching character within String
|
||
|
// if found, or NULL if no match was located.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
PUWSTR
|
||
|
__cdecl
|
||
|
uaw_wcsrchr(
|
||
|
IN PCUWSTR String,
|
||
|
IN WCHAR Character
|
||
|
)
|
||
|
{
|
||
|
PCUWSTR pch;
|
||
|
PUWSTR lastMatch;
|
||
|
|
||
|
lastMatch = NULL;
|
||
|
pch = String;
|
||
|
|
||
|
//
|
||
|
// Search the whole string looking for the last matching character.
|
||
|
// Note that the search INCLUDES the terminating null character.
|
||
|
//
|
||
|
|
||
|
while (TRUE) {
|
||
|
if (*pch == Character) {
|
||
|
|
||
|
//
|
||
|
// Found either the first match or a new match closer to the end,
|
||
|
// record its position.
|
||
|
//
|
||
|
|
||
|
lastMatch = (PUWSTR)pch;
|
||
|
}
|
||
|
|
||
|
if (*pch == 0) {
|
||
|
return lastMatch;
|
||
|
}
|
||
|
pch++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
APIENTRY
|
||
|
uaw_lstrcmpW(
|
||
|
PCUWSTR String1,
|
||
|
PCUWSTR String2
|
||
|
)
|
||
|
{
|
||
|
PCWSTR alignedString1;
|
||
|
PCWSTR alignedString2;
|
||
|
|
||
|
//
|
||
|
// Create aligned copies of these strings and pass to the real
|
||
|
// function.
|
||
|
//
|
||
|
|
||
|
WSTR_ALIGNED_STACK_COPY( &alignedString1, String1 );
|
||
|
WSTR_ALIGNED_STACK_COPY( &alignedString2, String2 );
|
||
|
|
||
|
return lstrcmpW( alignedString1, alignedString2 );
|
||
|
}
|
||
|
|
||
|
int
|
||
|
APIENTRY
|
||
|
uaw_lstrcmpiW(
|
||
|
PCUWSTR String1,
|
||
|
PCUWSTR String2
|
||
|
)
|
||
|
{
|
||
|
PCWSTR alignedString1;
|
||
|
PCWSTR alignedString2;
|
||
|
|
||
|
//
|
||
|
// Create aligned copies of these strings and pass to the real
|
||
|
// function.
|
||
|
//
|
||
|
|
||
|
WSTR_ALIGNED_STACK_COPY( &alignedString1, String1 );
|
||
|
WSTR_ALIGNED_STACK_COPY( &alignedString2, String2 );
|
||
|
|
||
|
return lstrcmpiW( alignedString1, alignedString2 );
|
||
|
}
|
||
|
|
||
|
int
|
||
|
APIENTRY
|
||
|
uaw_lstrlenW(
|
||
|
LPCUWSTR lpString
|
||
|
)
|
||
|
{
|
||
|
if (!lpString)
|
||
|
return 0;
|
||
|
__try {
|
||
|
return uaw_wcslen(lpString);
|
||
|
}
|
||
|
__except (EXCEPTION_EXECUTE_HANDLER) {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // _X86_
|