reman3/Rayman_X/cpa/tempgrp/AI/AIDebug/BreakPts.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*/