From 392390d23e726ed796f8018c3d0a003758c1559b Mon Sep 17 00:00:00 2001 From: Baruch Sterin Date: Wed, 22 Oct 2014 15:50:06 -0700 Subject: make it easy to add intialization functions to Abc_FrameInit()/Abc_FrameEnd() --- src/base/main/mainInit.c | 30 ++++++++++++++++++++++++++++++ src/base/main/mainInt.h | 15 +++++++++++++++ 2 files changed, 45 insertions(+) (limited to 'src/base/main') diff --git a/src/base/main/mainInit.c b/src/base/main/mainInit.c index f99a5653..b2ad5cde 100644 --- a/src/base/main/mainInit.c +++ b/src/base/main/mainInit.c @@ -59,6 +59,24 @@ extern void Abc2_End ( Abc_Frame_t * pAbc ); extern void Abc85_Init( Abc_Frame_t * pAbc ); extern void Abc85_End( Abc_Frame_t * pAbc ); +static Abc_FrameInitializer_t* s_InitializerStart = NULL; +static Abc_FrameInitializer_t* s_InitializerEnd = NULL; + +void Abc_FrameAddInitializer( Abc_FrameInitializer_t* p ) +{ + if( ! s_InitializerStart ) + s_InitializerStart = p; + + p->next = NULL; + p->prev = s_InitializerEnd; + + if ( s_InitializerEnd ) + s_InitializerEnd->next = p; + + s_InitializerEnd = p; + +} + //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// @@ -76,6 +94,8 @@ extern void Abc85_End( Abc_Frame_t * pAbc ); ***********************************************************************/ void Abc_FrameInit( Abc_Frame_t * pAbc ) { + Abc_FrameInitializer_t* p; + Cmd_Init( pAbc ); Cmd_CommandExecute( pAbc, "set checkread" ); Io_Init( pAbc ); @@ -96,6 +116,10 @@ void Abc_FrameInit( Abc_Frame_t * pAbc ) Abc85_Init( pAbc ); #endif EXT_ABC_INIT(pAbc) // plugin for external functionality + + for( p = s_InitializerStart ; p ; p = p->next ) + if(p->init) + p->init(pAbc); } @@ -112,6 +136,12 @@ void Abc_FrameInit( Abc_Frame_t * pAbc ) ***********************************************************************/ void Abc_FrameEnd( Abc_Frame_t * pAbc ) { + Abc_FrameInitializer_t* p; + + for( p = s_InitializerEnd ; p ; p = p->prev ) + if ( p->destroy ) + p->destroy(pAbc); + Abc_End( pAbc ); Io_End( pAbc ); Cmd_End( pAbc ); diff --git a/src/base/main/mainInt.h b/src/base/main/mainInt.h index 8bccc632..f145b379 100644 --- a/src/base/main/mainInt.h +++ b/src/base/main/mainInt.h @@ -132,6 +132,20 @@ struct Abc_Frame_t_ EXT_ABC_FRAME // plugin for external functionality }; +typedef void (*Abc_Frame_Initialization_Func)( Abc_Frame_t * pAbc ); + +struct Abc_FrameInitializer_t_; +typedef struct Abc_FrameInitializer_t_ Abc_FrameInitializer_t; + +struct Abc_FrameInitializer_t_ +{ + Abc_Frame_Initialization_Func init; + Abc_Frame_Initialization_Func destroy; + + Abc_FrameInitializer_t* next; + Abc_FrameInitializer_t* prev; +}; + //////////////////////////////////////////////////////////////////////// /// GLOBAL VARIABLES /// //////////////////////////////////////////////////////////////////////// @@ -150,6 +164,7 @@ extern ABC_DLL int main( int argc, char * argv[] ); /*=== mvInit.c ===================================================*/ extern ABC_DLL void Abc_FrameInit( Abc_Frame_t * pAbc ); extern ABC_DLL void Abc_FrameEnd( Abc_Frame_t * pAbc ); +extern ABC_DLL void Abc_FrameAddInitializer( Abc_FrameInitializer_t* p ); /*=== mvFrame.c =====================================================*/ extern ABC_DLL Abc_Frame_t * Abc_FrameAllocate(); extern ABC_DLL void Abc_FrameDeallocate( Abc_Frame_t * p ); -- cgit v1.2.3