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.
 
 
 
 
 
 

201 lines
4.9 KiB

/**********************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1997 **/
/**********************************************************************/
/*
string.cxx
This module contains a light weight string class
FILE HISTORY:
4/8/97 michth created
*/
//
// Normal includes only for this module to be active
//
#include "precomp.hxx"
#include "aucommon.hxx"
/*******************************************************************
NAME: MLSZAU::STR
SYNOPSIS: Construct a string object
ENTRY: Optional object initializer
NOTES: If the object is not valid (i.e. !IsValid()) then GetLastError
should be called.
The object is guaranteed to construct successfully if nothing
or NULL is passed as the initializer.
********************************************************************/
// Inlined in stringau.hxx
VOID
MLSZAU::AuxInit( const LPSTR pInit,
DWORD cbLen )
{
BOOL fRet;
if ( pInit )
{
INT cbCopy;
if (cbLen != 0) {
DBG_ASSERT(cbLen >= 2);
DBG_ASSERT(pInit[cbLen -1] == '\0');
DBG_ASSERT(pInit[cbLen -2] == '\0');
cbCopy = cbLen;
}
else {
LPSTR pszIndex;
for (pszIndex = pInit;
*pszIndex != '\0' || *(pszIndex + 1) != '\0';
pszIndex++) {
}
cbCopy = ((DWORD)(pszIndex - pInit)) + 2;
}
fRet = m_bufAnsi.Resize( cbCopy );
if ( fRet ) {
CopyMemory( m_bufAnsi.QueryPtr(), pInit, cbCopy );
m_cbMultiByteLen = (cbCopy)/sizeof(CHAR);
m_bUnicode = FALSE;
m_bInSync = FALSE;
} else {
m_bIsValid = FALSE;
}
} else {
Reset();
}
return;
} // MLSZAU::AuxInit()
VOID
MLSZAU::AuxInit( const LPWSTR pInit,
DWORD cchLen )
{
BOOL fRet;
if ( pInit )
{
INT cbCopy;
if (cchLen != 0) {
DBG_ASSERT(cchLen >= 2);
DBG_ASSERT(pInit[cchLen -1] == (WCHAR)'\0');
DBG_ASSERT(pInit[cchLen -2] == (WCHAR)'\0');
cbCopy = cchLen * sizeof(WCHAR);
}
else {
LPWSTR pszIndex;
for (pszIndex = pInit;
*pszIndex != '\0' || *(pszIndex + 1) != '\0';
pszIndex++) {
}
cbCopy = ((DIFF(pszIndex - pInit)) + 2) * sizeof(WCHAR);
}
fRet = m_bufUnicode.Resize( cbCopy );
if ( fRet ) {
CopyMemory( m_bufUnicode.QueryPtr(), pInit, cbCopy );
m_cchUnicodeLen = (cbCopy)/sizeof(WCHAR);
m_bUnicode = TRUE;
m_bInSync = FALSE;
} else {
m_bIsValid = FALSE;
}
} else {
Reset();
}
return;
} // MLSZAU::AuxInit()
LPTSTR
MLSZAU::QueryStr(BOOL bUnicode)
{
//
// This routine can fail.
// On failure, return a valid UNICODE or ANSI string
// so clients don't trap.
//
LPTSTR pszReturn = NULL;
int iNewStrLen;
if (m_bIsValid) {
if ((bUnicode != m_bUnicode) &&
(!m_bInSync) &&
((m_bUnicode && (m_cchUnicodeLen != 0)) ||
(!m_bUnicode && (m_cbMultiByteLen != 0)))) {
//
// Need to Convert First
//
if (bUnicode) {
//
// Convert current string to UNICODE
//
// Conversion routines assume a real string and
// add 1 to length for trailing \0 so subtract
// one from total length.
//
iNewStrLen = ConvertMultiByteToUnicode((LPSTR)m_bufAnsi.QueryPtr(), &m_bufUnicode, m_cbMultiByteLen - 1);
if (STR_CONVERSION_SUCCEEDED(iNewStrLen)) {
m_cchUnicodeLen = iNewStrLen+1;
m_bInSync = TRUE;
}
else {
m_bIsValid = FALSE;
}
}
else {
//
// Convert current string to Ansi
//
iNewStrLen = ConvertUnicodeToMultiByte((LPWSTR)m_bufUnicode.QueryPtr(), &m_bufAnsi, m_cchUnicodeLen - 1);
if (STR_CONVERSION_SUCCEEDED(iNewStrLen)) {
m_cbMultiByteLen = iNewStrLen+1;
m_bInSync = TRUE;
}
else {
m_bIsValid = FALSE;
}
}
}
if (m_bIsValid) {
if (bUnicode) {
pszReturn = (LPTSTR)m_bufUnicode.QueryPtr();
}
else {
pszReturn = (LPTSTR)m_bufAnsi.QueryPtr();
}
}
}
return pszReturn;
}