184 lines
5.0 KiB
C
184 lines
5.0 KiB
C
/****************************************************
|
|
|
|
BreakPoints for AI Debugger
|
|
|
|
implementation file
|
|
David Reizer December 1997
|
|
|
|
*****************************************************/
|
|
|
|
#include "AIUseCPA.h"
|
|
#include "StrIntel.h"
|
|
#include "EnumOper.h"
|
|
|
|
#include "AID_Erm.h"
|
|
|
|
#include "BreakPts.h"
|
|
|
|
|
|
#if defined(ACTIVE_AIDEBUG)
|
|
|
|
#define M_bIsBreakableOperator(_eId)\
|
|
( ((_eId) == eOperator_Affect) ||\
|
|
((_eId) == eOperator_PlusAffect) ||\
|
|
((_eId) == eOperator_MinusAffect) ||\
|
|
((_eId) == eOperator_MulAffect) ||\
|
|
((_eId) == eOperator_DivAffect) ||\
|
|
((_eId) == eOperator_VectorPlusVector) ||\
|
|
((_eId) == eOperator_VectorMinusVector) ||\
|
|
((_eId) == eOperator_VectorMulScalar) ||\
|
|
((_eId) == eOperator_VectorDivScalar) ||\
|
|
((_eId) == eOperator_SetVectorX) ||\
|
|
((_eId) == eOperator_SetVectorY) ||\
|
|
((_eId) == eOperator_SetVectorZ) )
|
|
|
|
/***
|
|
**** Return True if the Node accepts a breakpoint
|
|
***/
|
|
ACP_tdxBool fn_bIsBreakableNode( tdstNodeInterpret *_pstNode )
|
|
{
|
|
tdeTypeInterpret eType;
|
|
tdeOperatorId eId;
|
|
|
|
if( _pstNode == NULL )
|
|
{
|
|
Erm_M_UpdateLastError( AIDebug,
|
|
C_ucErmDefaultChannel,
|
|
E_uwAIDebugWarningNullPointer,
|
|
C_lErmNoDebugData,
|
|
C_ucErmOpenInfoWindow,
|
|
C_ucAllowStopForDebug,
|
|
NULL );
|
|
return FALSE;
|
|
}
|
|
|
|
eType = M_GetTypeInterpret(_pstNode);
|
|
eId = M_eOperatorIdInterpret(_pstNode);
|
|
|
|
return( (eType == E_ti_KeyWord) ||
|
|
(eType == E_ti_Procedure) ||
|
|
(eType == E_ti_MetaAction) ||
|
|
((eType == E_ti_Operator) && M_bIsBreakableOperator(eId)) );
|
|
}
|
|
|
|
|
|
/***
|
|
**** Find the tree containing a given node
|
|
***/
|
|
tdstTreeInterpret * fn_pstFindTreeWithNode( tdstScriptAI *_pstScript, unsigned long _ulNb, tdstNodeInterpret *_pstNode )
|
|
{
|
|
tdstComport *pstComport = NULL;
|
|
tdstTreeInterpret * pstTree = NULL;
|
|
int i = 0;
|
|
|
|
/*** first get the comport ***/
|
|
pstComport = M_GetScriptAIComportN( _pstScript, _ulNb );
|
|
if( pstComport == NULL )
|
|
{
|
|
Erm_M_UpdateLastError( AIDebug,
|
|
C_ucErmDefaultChannel,
|
|
E_uwAIDebugWarningNullPointer,
|
|
C_lErmNoDebugData,
|
|
C_ucErmOpenInfoWindow,
|
|
C_ucAllowStopForDebug,
|
|
"The comport is null" );
|
|
return NULL;
|
|
}
|
|
|
|
/*** Search in schedule ***/
|
|
pstTree = M_GetComportSchedule( pstComport );
|
|
if( pstTree == NULL )
|
|
{
|
|
Erm_M_UpdateLastError( AIDebug,
|
|
C_ucErmDefaultChannel,
|
|
E_uwAIDebugWarningNullPointer,
|
|
C_lErmNoDebugData,
|
|
C_ucErmOpenInfoWindow,
|
|
C_ucAllowStopForDebug,
|
|
"The schedule is null" );
|
|
}
|
|
else
|
|
if( ( M_GetNodeInterpret(pstTree) <= _pstNode ) && ( _pstNode < (M_GetNodeInterpret(pstTree) + M_GetNbNodeInterpret(pstTree)) ) )
|
|
return pstTree;
|
|
|
|
/*** Search in rules ***/
|
|
for( i=0; i < M_GetComportNbRules(pstComport); i++ )
|
|
{
|
|
pstTree = M_GetComportRuleN( pstComport, i );
|
|
if( pstTree == NULL )
|
|
{
|
|
Erm_M_UpdateLastError( AIDebug,
|
|
C_ucErmDefaultChannel,
|
|
E_uwAIDebugWarningNullPointer,
|
|
C_lErmNoDebugData,
|
|
C_ucErmOpenInfoWindow,
|
|
C_ucAllowStopForDebug,
|
|
"The rule is null" );
|
|
}
|
|
else
|
|
if( ( M_GetNodeInterpret(pstTree) <= _pstNode ) && ( _pstNode < (M_GetNodeInterpret(pstTree) + M_GetNbNodeInterpret(pstTree)) ) )
|
|
return pstTree;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
|
|
/**************************************************************************************
|
|
* Set a breakpoint on the first breakable node before the one passed as a parameter
|
|
*
|
|
* Input : the proposed node for BreakPoint
|
|
* the script containing the node
|
|
* the number of the comport containing the node
|
|
*
|
|
* Output: the actual node with the breakpoint or NULL
|
|
*
|
|
*****************************************************************************************/
|
|
|
|
tdstNodeInterpret * fn_pstSetValidBreakPoint( tdstNodeInterpret *_pstNode, tdstScriptAI *_pstScript, unsigned long _ulNb )
|
|
{
|
|
tdstTreeInterpret *pstTree = NULL;
|
|
tdstNodeInterpret *pstTmpNode = NULL;
|
|
|
|
/*** if node accepts breakpoint then it is used ***/
|
|
if( fn_bIsBreakableNode( _pstNode ) )
|
|
{
|
|
M_SetBreakPoint( _pstNode, TRUE );
|
|
return _pstNode;
|
|
}
|
|
|
|
/*** else find the tree containing the node ***/
|
|
pstTree = fn_pstFindTreeWithNode( _pstScript, _ulNb, _pstNode );
|
|
if( pstTree == NULL )
|
|
{
|
|
Erm_M_UpdateLastError( AIDebug,
|
|
C_ucErmDefaultChannel,
|
|
E_uwAIDebugWarningNullPointer,
|
|
C_lErmNoDebugData,
|
|
C_ucErmOpenInfoWindow,
|
|
C_ucAllowStopForDebug,
|
|
"The found tree is null" );
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*** Serach for the previous breakable node ***/
|
|
pstTmpNode = _pstNode;
|
|
while( (pstTmpNode >= M_GetNodeInterpret(pstTree)) && !(fn_bIsBreakableNode( pstTmpNode )) )
|
|
pstTmpNode --;
|
|
|
|
/*** a node is found ***/
|
|
if( fn_bIsBreakableNode( pstTmpNode ) )
|
|
{
|
|
M_SetBreakPoint( pstTmpNode, TRUE );
|
|
return pstTmpNode;
|
|
}
|
|
/*** no node is found, the breakpoint is invalid ***/
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
|
|
#endif /*ACTIVE_AIDEBUG*/
|