static walk_result DoWalkSymList( imp_image_handle *ii, symbol_source ss, void *t, DIP_IMP_SYM_WALKER *wk, imp_sym_handle *is, void *d ) { imp_mod_handle im; sym_glue glue; walk_result wr; wr = WR_CONTINUE; switch( ss ) { case SS_TYPE: return( WalkTypeSymList( ii, (imp_type_handle *)t, wk, is, d ) ); case SS_SCOPED: return( WalkScopedSymList( ii, (address *)t, wk, is, d ) ); case SS_BLOCK: return( WalkBlockSymList( ii, (scope_block *)t, wk, is, d ) ); case SS_MODULE: im = *(imp_mod_handle *)t; if( im == IMH_NOMOD ) { glue.walk = wk; glue.is = is; glue.d = d; wr = MyWalkModList( ii, WalkMySyms, &glue ); if( wr == WR_CONTINUE ) { wr = WalkGblModSymList( ii, im, wk, is, d ); } } else { if( WalkLclModSymList( ii, im, wk, is, d, &wr ) != DS_OK ) { wr = WalkGblModSymList( ii, im, wk, is, d ); } } break; } return( wr ); }
dip_status InitDemand( imp_image_handle *ii ) { struct walk_demand d; d.max_size = 0; MyWalkModList( ii, WlkDmnd, &d ); if( d.max_size >= (0x10000UL - sizeof( demand_ctrl )) ) { DCStatus( DS_ERR|DS_INFO_INVALID ); return( DS_ERR|DS_INFO_INVALID ); } if( d.max_size <= LastDmndSize ) return( DS_OK ); if( LastDemand != NULL ) { Unload( LastDemand ); DCFree( LastDemand ); } LastDmndSize = d.max_size; LastDemand = DCAlloc( _demand_size( d.max_size ) ); if( LastDemand == NULL ) { DCStatus( DS_ERR|DS_NO_MEM ); return( DS_ERR|DS_NO_MEM ); } LastDemand->link = NULL; LastDemand->owner = NULL; LastDemand->clear = NULL; LastDemand->locks = 0; return( DS_OK ); }
void InfoClear( imp_image_handle *ii ) { MyWalkModList( ii, WlkClear, NULL ); }