Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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_
|