|
|
/*++
Copyright (c) 1998-1999 Microsoft Corporation All rights reserved.
Module Name:
dbgdev.cxx
Abstract:
Debug Device Interface class
Author:
Steve Kiraly (SteveKi) 10-Dec-1995
Revision History:
--*/ #include "precomp.hxx"
#pragma hdrstop
#include "dbgdev.hxx"
/*++
Routine Name:
TDebugDevice
Routine Description:
Constructor
Arguments:
pszConfiguration - pointer to colon separated configuration string.
Return Value:
Nothing
--*/ TDebugDevice:: TDebugDevice( IN LPCTSTR pszConfiguration, IN EDebugType eDebugType ) : _pszConfiguration( NULL ), _eCharType( kUnknown ), _eDebugType( eDebugType ), TDebugNodeDouble() { //
// If configuration data was provided.
//
if( pszConfiguration && _tcslen( pszConfiguration ) ) { _pszConfiguration = INTERNAL_NEW TCHAR [ _tcslen( pszConfiguration ) + 1];
//
// Copy the configuration data.
//
if( _pszConfiguration ) { _tcscpy( _pszConfiguration, pszConfiguration );
//
// Get the character type.
//
TIterator i( this );
for( i.First(); !i.IsDone(); i.Next() ) { //
// The first item is defined as the character type.
//
if( i.Index() == 1 ) { //
// Look for the ansi specifier.
//
_eCharType = !_tcsicmp( i.Current(), kstrAnsi ) ? kAnsi : kUnicode; break; } } } } }
/*++
Routine Name:
TDebugDevice
Routine Description:
Destructor releases the configuration string.
Arguments:
None.
Return Value:
Nothing
--*/ TDebugDevice:: ~TDebugDevice( VOID ) { INTERNAL_DELETE [] _pszConfiguration; }
/*++
Routine Name:
bValid
Routine Description:
Valid object indicator.
Arguments:
None.
Return Value:
Nothing
--*/ BOOL TDebugDevice:: bValid( VOID ) const { return TRUE; }
/*++
Routine Name:
eGetCharType
Routine Description:
Retrives the devices character type.
Arguments:
None.
Return Value:
Devices character type
--*/ TDebugDevice::ECharType TDebugDevice:: eGetCharType( VOID ) const { return _eCharType; }
/*++
Routine Name:
eGetDeviceType
Routine Description:
Retrives the device type.
Arguments:
None.
Return Value:
Debug Device Type
--*/ EDebugType TDebugDevice:: eGetDebugType( VOID ) const { return _eDebugType; }
/*++
Routine Name:
pszGetConfigurationString
Routine Description:
Retrives the raw devices configuration string.
Arguments:
None.
Return Value:
Pointer to device configuration string.
--*/ LPCTSTR TDebugDevice:: pszGetConfigurationString( VOID ) const { return _pszConfiguration; }
/*++
Routine Name:
MapStringTypeToDevice
Routine Description:
Map the device string to a device enumeration.
Arguments:
pszDeviceString - pointer to device type string.
Return Value:
Device type enumeration
--*/ UINT TDebugDevice:: MapStringTypeToDevice( IN LPCTSTR pszDeviceString ) const { DeviceMap aDeviceMap [] = { { kDbgNull, kstrDeviceNull}, { kDbgConsole, kstrConsole }, { kDbgDebugger, kstrDebugger }, { kDbgFile, kstrFile }, { kDbgBackTrace, kstrBacktrace } };
for( UINT i = 0; i < COUNTOF( aDeviceMap ); i++ ) { if( !_tcsicmp( aDeviceMap[i].Name, pszDeviceString ) ) { return aDeviceMap[i].Id; } }
return kDbgNull; }
/********************************************************************
Debug Iterator device class.
********************************************************************/
/*++
Routine Name:
TIterator
Routine Description:
Constructor
Arguments:
pszConfiguration - pointer to colon separated configuration string.
Return Value:
Nothing
--*/ TDebugDevice::TIterator:: TIterator( IN TDebugDevice *DbgDevice ) : _pStr( NULL ), _pCurrent( NULL ), _pEnd( NULL ), _bValid( FALSE ), _uIndex( 0 ) { //
// Make a copy of the configuration string for iteration.
// The configuration string is defined as a colon delimited
// string, the iterator needs a copy because it replaces the
// colons with nulls for isolating its pieces.
//
if( DbgDevice->_pszConfiguration && _tcslen( DbgDevice->_pszConfiguration ) ) { _pStr = INTERNAL_NEW TCHAR [ _tcslen(DbgDevice->_pszConfiguration) + 1 ];
if( _pStr ) { _tcscpy( _pStr, DbgDevice->_pszConfiguration ); _bValid = TRUE; } } }
/*++
Routine Name:
TIterator
Routine Description:
Destructor
Arguments:
None.
Return Value:
Nothing
--*/ TDebugDevice::TIterator:: ~TIterator( VOID ) { INTERNAL_DELETE [] _pStr; }
/*++
Routine Name:
bValid
Routine Description:
Indicates if this class is valid.
Arguments:
None.
Return Value:
TRUE valid, FALSE invalid.
--*/ BOOL TDebugDevice::TIterator:: bValid( VOID ) const { return _bValid; }
/*++
Routine Name:
First
Routine Description:
Starts the interator.
Arguments:
None.
Return Value:
Nothing
--*/ VOID TDebugDevice::TIterator:: First( VOID ) { if( !_bValid ) return; //
// If running iteration was reset with a first call
// Put back the colon.
//
if( _pEnd ) *_pEnd = _T(':');
//
// Reset index.
//
_uIndex = 1;
//
// Skip leading colons
//
for( _pCurrent = _pStr; *_pCurrent && *_pCurrent == _T(':'); _pCurrent++);
//
// Search for next colon.
//
for( _pEnd = _pCurrent; *_pEnd && *_pEnd != _T(':'); _pEnd++);
//
// Place the null to complete the string.
//
if( *_pEnd ) *_pEnd = NULL; else _pEnd = NULL;
}
/*++
Routine Name:
Next
Routine Description:
Advance to the next item.
Arguments:
None.
Return Value:
Nothing
--*/ VOID TDebugDevice::TIterator:: Next( VOID ) { if( !_bValid ) return;
//
// If iteration is pending put back the colon and advance
// to the next character.
//
if( _pEnd ) { *_pEnd = _T(':'); _pEnd++; } else { //
// End iteration, defined as _pCurrent == _pEnd == NULL
//
_pCurrent = _pEnd; return; }
//
// Update current.
//
_pCurrent = _pEnd;
//
// Skip leading colons
//
for( ; *_pCurrent && *_pCurrent == _T(':'); _pCurrent++);
//
// Advance to the end of the current item.
//
for( _pEnd = _pCurrent; *_pEnd && *_pEnd != _T(':'); _pEnd++);
//
// Replace colon with a null
//
if( *_pEnd ) *_pEnd = NULL; else _pEnd = NULL;
_uIndex++; }
/*++
Routine Name:
IsDone
Routine Description:
Indicates if there are any more items.
Arguments:
None.
Return Value:
TRUE no mote items, FALSE more items availabe.
--*/ BOOL TDebugDevice::TIterator:: IsDone( VOID ) const { if( !_bValid ) return TRUE;
if( _pCurrent == NULL && _pEnd == NULL ) return TRUE;
return FALSE;
}
/*++
Routine Name:
Current
Routine Description:
Returns pointer to current item.
Arguments:
None.
Return Value:
Pointer to item. NULL if no more items, or error.
--*/ LPCTSTR TDebugDevice::TIterator:: Current( VOID ) const { if( !_bValid ) return NULL;
return _pCurrent; }
/*++
Routine Name:
Index
Routine Description:
Returns current item index.
Arguments:
None.
Return Value:
Index starting with 1 to N
--*/ UINT TDebugDevice::TIterator:: Index( VOID ) const { if( !_bValid ) return 0;
return _uIndex; }
|