diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-10-23 18:19:51 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-10-23 18:19:51 -0700 |
commit | 96c9792f33a76962c022fb484a8d153112591756 (patch) | |
tree | ca2ec7f95dc8aec568f26aa3523b9c35959bd42a /src | |
parent | 49caf258d4c5e9da857e312c930fc77d9ff57989 (diff) | |
parent | 392390d23e726ed796f8018c3d0a003758c1559b (diff) | |
download | abc-96c9792f33a76962c022fb484a8d153112591756.tar.gz abc-96c9792f33a76962c022fb484a8d153112591756.tar.bz2 abc-96c9792f33a76962c022fb484a8d153112591756.zip |
Merged in sterin/abc (pull request #9)
make it easy to add intialization functions to Abc_FrameInit()/Abc_FrameEnd()
Diffstat (limited to 'src')
-rw-r--r-- | src/base/main/mainInit.c | 30 | ||||
-rw-r--r-- | src/base/main/mainInt.h | 15 |
2 files changed, 45 insertions, 0 deletions
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 ); |