watmisc.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 598 行 · 第 1/2 页

C
598
字号
                dst += op_len;
                src += item.source.len;
                len -= item.source.len;
            } else {
                *dst++ = *src++;
                --len;
            }
        }
        item.name.len = dst - buff;
        item.name.start = buff;
    }
    sr = SR_NONE;
    switch( ss ) {
    case SS_SCOPED:
        if( ImpInterface.addr_mod( ii, *(address *)source, &im ) == SR_NONE ) {
            im = item.mod;
        } else if( item.mod == NO_MOD || item.mod == im ) {
            if( !item.file_scope && item.type == ST_NONE ) {
                sr = SearchLclScope( ii, im, (address *)source, &item, d );
            }
        } else {
            im = item.mod;
        }
        if( im != NO_MOD && sr == SR_NONE ) {
            sr = SearchFileScope( ii, im, &item, d );
        }
        break;
    case SS_MODULE:
        im = *(imp_mod_handle *)source;
        if( item.mod == NO_MOD || item.mod == im ) {
            sr = SearchFileScope( ii, im, &item, d );
        }
        break;
    case SS_TYPE:
        if( item.mod != NO_MOD ) return( SR_NONE );
        switch( item.type ) {
        case ST_TYPE:
        case ST_STRUCT_TAG:
        case ST_CLASS_TAG:
        case ST_UNION_TAG:
        case ST_ENUM_TAG:
            return( SR_NONE );
        }
        return( SearchMbr( ii, (imp_type_handle *)source, &item, d ) );
    }
    if( sr == SR_NONE ) {
        switch( item.type ) {
        case ST_NONE:
        case ST_DESTRUCTOR:
        case ST_OPERATOR:
            sr = SearchGbl( ii, im, (imp_mod_handle)item.mod, &item, d );
            break;
        }
    }
    return( sr );
}

search_result DIPENTRY DIPImpLookupSym( imp_image_handle *ii, symbol_source ss,
                         void *source, lookup_item *li, void *d )
{
    return( DoLookupSym( ii, ss, source, li, NULL, d ) );
}

search_result DIPENTRY DIPImpLookupSymEx( imp_image_handle *ii, symbol_source ss,
                         void *source, lookup_item *li, location_context *lc, void *d )
{
    return( DoLookupSym( ii, ss, source, li, lc, d ) );
}

dip_status DIPENTRY DIPImpSymLocation( imp_image_handle *ii, imp_sym_handle *is,
                                location_context *lc, location_list *ll )
{
    switch( is->type ) {
    case SH_GBL:
        return( SymHdl2GblLoc( ii, is, ll ) );
    case SH_LCL:
        return( SymHdl2LclLoc( ii, is, lc, ll ) );
    case SH_MBR:
        return( SymHdl2MbrLoc( ii, is, lc, ll ) );
    }
    return( DS_ERR|DS_BAD_PARM );
}


dip_status DIPENTRY DIPImpSymValue( imp_image_handle *ii, imp_sym_handle *is,
                                location_context *lc, void *value )
{
    lc = lc;
    switch( is->type ) {
    case SH_CST:
        return( SymHdl2CstValue( ii, is, value ) );
    }
    return( DS_ERR|DS_BAD_PARM );
}


dip_status DIPENTRY DIPImpSymType( imp_image_handle *ii, imp_sym_handle *is,
                                imp_type_handle *it )
{
    switch( is->type ) {
    case SH_GBL:
        return( SymHdl2GblType( ii, is, it ) );
    case SH_LCL:
        return( SymHdl2LclType( ii, is, it ) );
    case SH_MBR:
        return( SymHdl2MbrType( ii, is, it ) );
    case SH_TYP:
        return( SymHdl2TypType( ii, is, it ) );
    case SH_CST:
        return( SymHdl2CstType( ii, is, it ) );
    }
    return( DS_ERR|DS_BAD_PARM );
}

dip_status DIPENTRY DIPImpSymInfo( imp_image_handle *ii, imp_sym_handle *is,
                        location_context *lc, sym_info *si )
{
    memset( si, 0, sizeof( *si ) );
    switch( is->type ) {
    case SH_GBL:
        return( SymHdl2GblInfo( ii, is, si ) );
    case SH_LCL:
        return( SymHdl2LclInfo( ii, is, si ) );
    case SH_MBR:
        return( SymHdl2MbrInfo( ii, is, si, lc ) );
    case SH_TYP:
        si->kind = SK_TYPE;
        break;
    case SH_CST:
        si->kind = SK_CONST;
        break;
    default:
        return( DS_ERR|DS_BAD_PARM );
    }
    return( DS_OK );

}

dip_status DIPENTRY DIPImpSymParmLocation( imp_image_handle *ii,
    imp_sym_handle *is, location_context *lc, location_list *ll, unsigned parm )
{
    if( is->type != SH_LCL ) return( DS_FAIL );
    return( SymHdl2LclParmLoc( ii, is, lc, ll, parm ) );
}

typedef struct {
    IMP_SYM_WKR         *walk;
    imp_sym_handle      *is;
    void                *d;
} sym_glue;

walk_result WalkMySyms( imp_image_handle *ii,
                        imp_mod_handle im, void *d )
{
    sym_glue    *wd = d;
    walk_result wr;

    WalkLclModSymList( ii, im, wd->walk, wd->is, wd->d, &wr );
    return( wr );
}

walk_result DoWalkSymList( imp_image_handle *ii, symbol_source ss,
                void *t, IMP_SYM_WKR *wk, imp_sym_handle *is, void *d )
{
    imp_mod_handle      im;
    sym_glue            glue;
    walk_result         wr;

    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 == (imp_mod_handle)NO_MOD ) {
            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 );
}

walk_result DIPENTRY DIPImpWalkSymList( imp_image_handle *ii, symbol_source ss,
                void *source, IMP_SYM_WKR *wk, imp_sym_handle *is, void *d )
{
    return( DoWalkSymList( ii, ss, source, wk, is, d ) );
}

walk_result DIPENTRY DIPImpWalkSymListEx( imp_image_handle *ii, symbol_source ss,
                void *source, IMP_SYM_WKR *wk, imp_sym_handle *is,
                location_context *lc, void *d )
{
    lc=lc;
    return( DoWalkSymList( ii, ss, source, wk, is, d ) );
}

dip_status DIPENTRY DIPImpModDefault( imp_image_handle *ii, imp_mod_handle im,
                        default_kind dk, type_info *ti )
{
    ii = ii; im = im; dk = dk; ti = ti;
    return( DS_FAIL );
}

static int GblCmp( void *g1, void *g2 )
{
#if defined(__COMPACT__) || defined(__LARGE__) || defined( __HUGE__ )
    unsigned    s1;
    unsigned    s2;

    s1 = FP_SEG( g1 );
    s2 = FP_SEG( g2 );
    if( s1 != s2 ) return( s1 - s2 );
    return( FP_OFF( g1 ) - FP_OFF( g2 ) );
#else
    return( (char*)g1 - (char*)g2 );
#endif
}

int DIPENTRY DIPImpSymCmp( imp_image_handle *ii, imp_sym_handle *is1,
                        imp_sym_handle *is2 )
{
    ii = ii;
    if( is1->im != is2->im ) return( is1->im - is2->im );
    switch( is1->type ) {
    case SH_GBL:
        switch( is2->type ) {
        case SH_GBL:
            return( GblCmp( is1->u.gbl, is2->u.gbl ) );
        case SH_LCL:
            if( is2->u.lcl.gbl_link != NULL ) {
                return( GblCmp( is1->u.gbl, is2->u.lcl.gbl_link ) );
            }
            /* fall through */
        default:
             return( -1 );
        }
    case SH_LCL:
        switch( is2->type ) {
        case SH_GBL:
            if( is1->u.lcl.gbl_link != NULL ) {
                return( GblCmp( is1->u.lcl.gbl_link, is2->u.gbl ) );
            }
            return( 1 );
        case SH_LCL:
            return( is1->u.lcl.offset - is2->u.lcl.offset );
        default:
            return( -1 );
        }
    case SH_MBR:
    case SH_TYP:
    case SH_CST:
        switch( is2->type ) {
        case SH_MBR:
        case SH_TYP:
        case SH_CST:
            if( is1->u.typ.t.entry != is2->u.typ.t.entry ) {
                return( is1->u.typ.t.entry - is2->u.typ.t.entry );
            }
            return( is1->u.typ.t.offset - is2->u.typ.t.offset );
        default:
            return( 1 );
        }
    }
    return( 0 );
}

dip_status DIPENTRY DIPImpSymAddRef( imp_image_handle *ii, imp_sym_handle *is )
{
    ii=ii;
    is=is;
    return(DS_OK);
}

dip_status DIPENTRY DIPImpSymRelease( imp_image_handle *ii, imp_sym_handle *is )
{
    ii=ii;
    is=is;
    return(DS_OK);
}

dip_status DIPENTRY DIPImpSymFreeAll( imp_image_handle *ii )
{
    ii=ii;
    return(DS_OK);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?