Esempio n. 1
0
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 );
}
Esempio n. 2
0
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 );
}
Esempio n. 3
0
void InfoClear( imp_image_handle *ii )
{
    MyWalkModList( ii, WlkClear, NULL );
}