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 + -
显示快捷键?