223 lines
5.3 KiB
C
223 lines
5.3 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1994 - 1995.
|
||
|
//
|
||
|
// File: uastrfnc.cpp
|
||
|
//
|
||
|
// Contents: Unaligned UNICODE lstr functions for MIPS, PPC, ALPHA
|
||
|
//
|
||
|
// Classes:
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: 1-11-95 davepl Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
// NOTE (DavePl) None of these pay any heed to locale!
|
||
|
|
||
|
#include "priv.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#ifdef ALIGNMENT_MACHINE
|
||
|
|
||
|
#ifdef UNIX
|
||
|
#define _alloca alloca
|
||
|
#endif /* UNIX */
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ualstrcpynW
|
||
|
//
|
||
|
// Synopsis: UNALIGNED UNICODE version of lstrcpyn
|
||
|
//
|
||
|
// Arguments: [lpString1] -- dest string
|
||
|
// [lpString2] -- source string
|
||
|
// [iMaxLength] -- max chars to copy
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History: 1-11-95 davepl NT Port
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
UNALIGNED WCHAR * ualstrcpynW(UNALIGNED WCHAR * lpString1,
|
||
|
UNALIGNED const WCHAR * lpString2,
|
||
|
int iMaxLength)
|
||
|
{
|
||
|
UNALIGNED WCHAR * src;
|
||
|
UNALIGNED WCHAR * dst;
|
||
|
|
||
|
src = (UNALIGNED WCHAR *)lpString2;
|
||
|
dst = lpString1;
|
||
|
|
||
|
while(iMaxLength && *src)
|
||
|
{
|
||
|
*dst++ = *src++;
|
||
|
iMaxLength--;
|
||
|
}
|
||
|
|
||
|
if ( iMaxLength )
|
||
|
{
|
||
|
*dst = '\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dst--;
|
||
|
*dst = '\0';
|
||
|
}
|
||
|
return dst;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ualstrcmpiW
|
||
|
//
|
||
|
// Synopsis: UNALIGNED UNICODE wrap of lstrcmpi
|
||
|
//
|
||
|
// Arguments: [dst] -- first string
|
||
|
// [src] -- string to comapre to
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History: 1-11-95 davepl Created
|
||
|
// 4-20-98 scotthan localized, bug 141655
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
int ualstrcmpiW (UNALIGNED const WCHAR * dst, UNALIGNED const WCHAR * src)
|
||
|
{
|
||
|
WCHAR *pwszDst, *pwszSrc;
|
||
|
int cb ;
|
||
|
|
||
|
// Make aligned copies on the stack if appropriate...
|
||
|
// PERF - not the most inefficient tact (scotthan)
|
||
|
// note: _alloca should always succeed, unless out of stack
|
||
|
if( IS_ALIGNED( dst ) )
|
||
|
pwszDst = (WCHAR*)dst ;
|
||
|
else
|
||
|
{
|
||
|
cb = (ualstrlenW( dst ) + 1) * sizeof(WCHAR) ;
|
||
|
pwszDst = (WCHAR*)_alloca( cb ) ;
|
||
|
CopyMemory( pwszDst, dst, cb ) ;
|
||
|
}
|
||
|
|
||
|
if( IS_ALIGNED( src ) )
|
||
|
pwszSrc = (WCHAR*)src ;
|
||
|
else
|
||
|
{
|
||
|
cb = (ualstrlenW( src ) + 1) * sizeof(WCHAR) ;
|
||
|
pwszSrc = (WCHAR*)_alloca( cb ) ;
|
||
|
CopyMemory( pwszSrc, src, cb ) ;
|
||
|
}
|
||
|
|
||
|
// Call the aligned method.
|
||
|
// Note: if this ever runs on Win95, we should call StrCmpIW instead.
|
||
|
return lstrcmpiW( pwszDst, pwszSrc ) ;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ualstrcmpW
|
||
|
//
|
||
|
// Synopsis: UNALIGNED UNICODE wrap of lstrcmp
|
||
|
//
|
||
|
// Arguments: [dst] -- first string
|
||
|
// [src] -- string to comapre to
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History: 1-11-95 davepl Created
|
||
|
// 4-29-98 scotthan localized, bug 164091
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
int ualstrcmpW (UNALIGNED const WCHAR * src, UNALIGNED const WCHAR * dst)
|
||
|
{
|
||
|
WCHAR *pwszDst, *pwszSrc;
|
||
|
int cb ;
|
||
|
|
||
|
// Make aligned copies on the stack if appropriate...
|
||
|
// PERF - not the most inefficient tact (scotthan)
|
||
|
// note: _alloca should always succeed, unless out of stack
|
||
|
if( IS_ALIGNED( dst ) )
|
||
|
pwszDst = (WCHAR*)dst ;
|
||
|
else
|
||
|
{
|
||
|
cb = (ualstrlenW( dst ) + 1) * sizeof(WCHAR) ;
|
||
|
pwszDst = (WCHAR*)_alloca( cb ) ;
|
||
|
CopyMemory( pwszDst, dst, cb ) ;
|
||
|
}
|
||
|
|
||
|
if( IS_ALIGNED( src ) )
|
||
|
pwszSrc = (WCHAR*)src ;
|
||
|
else
|
||
|
{
|
||
|
cb = (ualstrlenW( src ) + 1) * sizeof(WCHAR) ;
|
||
|
pwszSrc = (WCHAR*)_alloca( cb ) ;
|
||
|
CopyMemory( pwszSrc, src, cb ) ;
|
||
|
}
|
||
|
|
||
|
// Call the aligned method.
|
||
|
// Note: if this ever runs on Win95, we should call StrCmpW instead.
|
||
|
return lstrcmpW( pwszDst, pwszSrc ) ;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ualstrlenW
|
||
|
//
|
||
|
// Synopsis: UNALIGNED UNICODE version of lstrlen
|
||
|
//
|
||
|
// Arguments: [wcs] -- string to return length of
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History: 1-11-95 davepl NT Port
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
size_t ualstrlenW (UNALIGNED const WCHAR * wcs)
|
||
|
{
|
||
|
UNALIGNED const WCHAR *eos = wcs;
|
||
|
|
||
|
while( *eos++ )
|
||
|
{
|
||
|
NULL;
|
||
|
}
|
||
|
|
||
|
return( (size_t) (eos - wcs - 1) );
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: ualstrcpyW
|
||
|
//
|
||
|
// Synopsis: UNALIGNED UNICODE version of lstrcpy
|
||
|
//
|
||
|
// Arguments: [dst] -- string to copy to
|
||
|
// [src] -- string to copy from
|
||
|
//
|
||
|
// Returns:
|
||
|
//
|
||
|
// History: 1-11-95 davepl NT Port
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
UNALIGNED WCHAR * ualstrcpyW(UNALIGNED WCHAR * dst, UNALIGNED const WCHAR * src)
|
||
|
{
|
||
|
UNALIGNED WCHAR * cp = dst;
|
||
|
|
||
|
while( *cp++ = *src++ )
|
||
|
NULL ;
|
||
|
|
||
|
return( dst );
|
||
|
}
|
||
|
|
||
|
#endif // ALIGNMENT_MACHINE
|