madman.c

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

C
2,275
字号

    max = *maxp;
    switch( radix ) {
    case 16:
        p = d;
#if !defined( __BIG_ENDIAN__ )
        p += mti->b.bits / BITS_PER_BYTE;
#endif
        for( len = 0; len < mti->b.bits / (BITS_PER_BYTE / 2); len += 2 ) {
#if !defined( __BIG_ENDIAN__ )
            --p;
#endif
            if( len < max ) {
                res[len+0] = DigitTab[ *p >>   4 ];
                res[len+1] = DigitTab[ *p &  0xf ];
            }
#if defined( __BIG_ENDIAN__ )
            ++p;
#endif
        }
        if( max > 0 )
            res[ min( len, max ) ] = '\0';
        *maxp = len;
        return( MS_OK );
    case 10:
        MADTypeInfoForHost( MTK_FLOAT, sizeof( val ), &host );
        ms = MADTypeConvert( mti, d, &host, &val, 0 );
        if( ms != MS_OK )
            return( ms );
        DoStrReal( (long_double *)&val, res, mti );
        *maxp = strlen( res );
        return( MS_OK );
    }
    return( MS_UNSUPPORTED );
}

#endif

mad_status MADTypeToString( unsigned radix, const mad_type_info *mti, const void *d, unsigned *max, char *buff )
{
    if( mti->b.handler_code == MAD_DEFAULT_HANDLING ) {
        switch( mti->b.kind ) {
        case MTK_INTEGER:
           if( IntTypeToString( radix, mti, d, max, buff ) == MS_OK ) return( MS_OK );
           break;
        case MTK_ADDRESS:
           if( AddrTypeToString( radix, mti, d, max, buff ) == MS_OK ) return( MS_OK );
           break;
#if !defined(MAD_OMIT_FLOAT_CVT)
        case MTK_FLOAT:
           if( FloatTypeToString( radix, mti, d, max, buff ) == MS_OK ) return( MS_OK );
           break;
        }
#endif
    }
    return( Active->rtns->MITypeToString( radix, mti, d, max, buff ) );
}

mad_status MADTypeHandleToString( unsigned radix, mad_type_handle th, const void *d, unsigned *max, char *buff )
{
    mad_type_info       mti;

    MADTypeInfo( th, &mti );
    return( MADTypeToString( radix, &mti, d, max, buff ) );
}


/*
 *      Machine Registers
 */

static unsigned DIGREGISTER DummyRegistersSize( void )
{
    return( 1 );
}

unsigned        MADRegistersSize( void )
{
    return( Active->rtns->MIRegistersSize() );
}

static mad_status DIGREGISTER DummyRegistersHost( mad_registers *mr )
{
    mr = mr;
    return( MS_OK );
}

mad_status      MADRegistersHost( mad_registers *mr )
{
    return( Active->rtns->MIRegistersHost( mr ) );
}

static mad_status DIGREGISTER DummyRegistersTarget( mad_registers *mr )
{
    mr = mr;
    return( MS_OK );
}

mad_status      MADRegistersTarget( mad_registers *mr )
{
    return( Active->rtns->MIRegistersTarget( mr ) );
}

static walk_result DIGREGISTER DummyRegSetWalk( mad_type_kind tk, MI_REG_SET_WALKER *wk, void *d )
{
    tk = tk;
    wk = wk;
    d  = d;
    return( WR_CONTINUE );
}

struct regset_glue {
    MAD_REG_SET_WALKER  *wk;
    void                *d;
};

static walk_result DIGCLIENT RegSetGlue( const mad_reg_set_data *rsd, void *d )
{
    struct regset_glue  *gd = d;

    return( gd->wk( rsd, gd->d ) );
}

walk_result     MADRegSetWalk( mad_type_kind tk, MAD_REG_SET_WALKER *wk, void *d )
{
    struct regset_glue  glue;

    glue.wk = wk;
    glue.d  = d;
    return( Active->rtns->MIRegSetWalk( tk, &RegSetGlue, &glue ) );
}

static mad_string DIGREGISTER DummyRegSetName( const mad_reg_set_data *rsd )
{
    rsd = rsd;
    return( MSTR_NIL );
}

mad_string      MADRegSetName( const mad_reg_set_data *rsd )
{
    return( Active->rtns->MIRegSetName( rsd ) );
}

static unsigned DIGREGISTER DummyRegSetLevel( const mad_reg_set_data *rsd, unsigned max, char *buff )
{
    rsd = rsd;
    max = max;
    if( buff != NULL ) *buff = '\0';
    return( 0 );
}

unsigned        MADRegSetLevel( const mad_reg_set_data *rsd, unsigned max, char *buff )
{
    return( Active->rtns->MIRegSetLevel( rsd, max, buff ) );
}

static unsigned DIGREGISTER DummyRegSetDisplayGrouping( const mad_reg_set_data *rsd )
{
    rsd = rsd;
    return( 0 );
}

unsigned        MADRegSetDisplayGrouping( const mad_reg_set_data *rsd )
{
    return( Active->rtns->MIRegSetDisplayGrouping( rsd ) );
}

static mad_status DIGREGISTER DummyRegSetDisplayGetPiece( const mad_reg_set_data *rsd, const mad_registers *mr, unsigned piece, char **descript, unsigned *max_descript, const mad_reg_info **reg, mad_type_handle *disp_type, unsigned *max_value )
{
    rsd = rsd;
    mr = mr;
    piece = piece;
    descript = descript;
    max_descript = max_descript;
    reg = reg;
    disp_type = disp_type;
    max_value = max_value;
    return( MS_FAIL );
}

mad_status      MADRegSetDisplayGetPiece( const mad_reg_set_data *rsd, const mad_registers *mr, unsigned piece, char **descript, unsigned *max_descript, const mad_reg_info **reg, mad_type_handle *disp_type, unsigned *max_value )
{
    return( Active->rtns->MIRegSetDisplayGetPiece( rsd, mr, piece, descript,
                max_descript, reg, disp_type, max_value ) );
}

static mad_status DIGREGISTER DummyRegSetDisplayModify( const mad_reg_set_data *rsd, const mad_reg_info *reg, const mad_modify_list **possible, unsigned *num_possible )
{
    rsd = rsd;
    reg = reg;
    *possible = NULL;
    *num_possible = 0;
    return( MS_FAIL );
}

mad_status      MADRegSetDisplayModify( const mad_reg_set_data *rsd, const mad_reg_info *reg, const mad_modify_list **possible, unsigned *num_possible )
{
    return( Active->rtns->MIRegSetDisplayModify( rsd, reg, possible, num_possible ) );
}


static const mad_toggle_strings *DIGREGISTER DummyRegSetDisplayToggleList( const mad_reg_set_data *rsd )
{
    rsd = rsd;
    return( EmptyToggleList );
}

const mad_toggle_strings *MADRegSetDisplayToggleList( const mad_reg_set_data *rsd )
{
    return( Active->rtns->MIRegSetDisplayToggleList( rsd ) );
}

static unsigned DIGREGISTER DummyRegSetDisplayToggle( const mad_reg_set_data *rsd, unsigned on, unsigned off )
{
    rsd = rsd;
    on = on;
    off = off;
    return( 0 );
}

unsigned        MADRegSetDisplayToggle( const mad_reg_set_data *rsd, unsigned on, unsigned off )
{
    return( Active->rtns->MIRegSetDisplayToggle( rsd, on, off ) );
}

static mad_status DIGREGISTER DummyRegModified( const mad_reg_set_data *rsd, const mad_reg_info *ri, const mad_registers *old, const mad_registers *curr )
{
    rsd = rsd;
    ri = ri;
    old = old;
    curr = curr;
    return( MS_OK );
}

mad_status      MADRegModified( const mad_reg_set_data *rsd, const mad_reg_info *ri, const mad_registers *old, const mad_registers *curr )
{
    return( Active->rtns->MIRegModified( rsd, ri, old, curr ) );
}

static mad_status DIGREGISTER DummyRegInspectAddr( const mad_reg_info *ri, const mad_registers *mr, address *a )
{
    ri = ri;
    mr = mr;
    a = a;
    return( MS_FAIL );
}

mad_status      MADRegInspectAddr( const mad_reg_info *ri, const mad_registers *mr, address *a )
{
    return( Active->rtns->MIRegInspectAddr( ri, mr, a ) );
}

static walk_result DIGREGISTER DummyRegWalk( const mad_reg_set_data *rsd, const mad_reg_info *ri, MI_REG_WALKER *wk, void *d )
{
    rsd = rsd;
    ri = ri;
    wk = wk;
    d = d;
    return( WR_CONTINUE );
}

struct reg_glue {
    MAD_REG_WALKER      *wk;
    void                *d;
};

static walk_result DIGCLIENT RegGlue( const mad_reg_info *ri, int has_sublist, void *d )
{
    struct reg_glue     *gd = d;

    return( gd->wk( ri, has_sublist, gd->d ) );
}

static walk_result DIGCLIENT AllRegWalk( const mad_reg_set_data *rsd, void *d )
{
    return( Active->rtns->MIRegWalk( rsd, NULL, &RegGlue, d ) );
}

walk_result     MADRegWalk( const mad_reg_set_data *rsd, const mad_reg_info *ri, MAD_REG_WALKER *wk, void *d )
{
    struct reg_glue     glue;

    glue.wk = wk;
    glue.d  = d;
    if( rsd == NULL && ri == NULL ) {
        return( Active->rtns->MIRegSetWalk( MTK_ALL, &AllRegWalk, &glue ) );
    }
    return( Active->rtns->MIRegWalk( rsd, ri, &RegGlue, &glue ) );
}

struct full_name_component {
    struct full_name_component  *parent;
    mad_reg_info const          *ri;
};

struct full_name {
    struct full_name_component  *components;
    mad_reg_info  const         *ri;
    const char                  *op;
    char                        *buff;
    unsigned                    max;
    unsigned                    len;
};

static walk_result FindFullName( const mad_reg_info *ri, int has_sublist, void *d )
{
    struct full_name            *name = d;
    struct full_name_component  curr;
    struct full_name_component  *p;
    struct full_name_component  *h;
    struct full_name_component  *t;
    walk_result                 wr;
    unsigned                    op_len;
    unsigned                    amount;
    int                         first;

    curr.parent = name->components;
    name->components = &curr;
    curr.ri = ri;
    if( ri == name->ri ) {
        op_len = strlen( name->op );
        /* reverse the list, calculate length */
        p = name->components;
        h = NULL;
        while( p != NULL ) {
            name->len += strlen( p->ri->name ) + op_len;
            t = p->parent;
            p->parent = h;
            h = p;
            p = t;
        }
        name->len -= op_len; /* take off extra op_len */
        /* lay down name */
        first = 1;
        p = h;
        while( p != NULL ) {
            if( !first ) {
                amount = name->max;
                if( amount > op_len  ) amount = op_len;
                memcpy( name->buff, name->op, amount );
                name->buff += amount;
                name->max  -= amount;
            }
            first = 0;
            amount = strlen( p->ri->name );
            if( amount > name->max ) amount = name->max;
            memcpy( name->buff, p->ri->name, amount );
            name->buff += amount;
            name->max  -= amount;
            p = p->parent;
        }
        return( WR_STOP );
    }
    wr = WR_CONTINUE;
    if( has_sublist ) {
        wr = MADRegWalk( NULL, ri, FindFullName, name );
    }
    name->components = curr.parent;
    return( wr );
}

unsigned        MADRegFullName( const mad_reg_info *ri, const char *op, unsigned max, char *buff )
{
    struct full_name    name;

    name.components = NULL;
    name.ri = ri;
    name.op = op;
    name.buff = buff;
    name.max = max;
    name.len = 0;
    MADRegWalk( NULL, NULL, FindFullName, &name );
    if( max > 0 ) {
        buff[ min( name.len, max ) ] = '\0';
    }
    return( name.len );
}

static void DIGREGISTER DummyRegSpecialGet( mad_special_reg sr, const mad_registers *mr, addr_ptr *a )
{
    sr = sr;
    mr = mr;
    a->segment = 0;
    a->offset = 0;
}

void            MADRegSpecialGet( mad_special_reg sr, const mad_registers *mr, addr_ptr *a )
{
    Active->rtns->MIRegSpecialGet( sr, mr, a );
}

static void DIGREGISTER DummyRegSpecialSet( mad_special_reg sr, mad_registers *mr, const addr_ptr *a )
{
    sr = sr;
    mr = mr;
    a = a;
}

void            MADRegSpecialSet( mad_special_reg sr, mad_registers *mr, const addr_ptr *a )
{
    Active->rtns->MIRegSpecialSet( sr, mr, a );
}

static unsigned DIGREGISTER DummyRegSpecialName( mad_special_reg sr, const mad_registers *mr, mad_address_format af, unsigned max, char *buff )
{
    sr = sr;
    mr = mr;
    af = af;
    max = max;
    buff = buff;
    return( 0 );
}

unsigned        MADRegSpecialName( mad_special_reg sr, const mad_registers *mr, mad_address_format af, unsigned max, char *buff )
{
    return( Active->rtns->MIRegSpecialName( sr, mr, af, max, buff ) );
}

static const mad_reg_info *DIGREGISTER DummyRegFromContextItem( context_item ci )
{
    ci = ci;
    return( NULL );
}

const mad_reg_info *MADRegFromContextItem( context_item ci )
{
    return( Active->rtns->MIRegFromContextItem( ci ) );
}

static void DIGREGISTER DummyRegUpdateStart( mad_registers *mr, unsigned flags, unsigned bit_start, unsigned bit_size )
{
    mr = mr;
    flags = flags;
    bit_start = bit_start;
    bit_size = bit_size;
}

void            MADRegUpdateStart( mad_registers *mr, unsigned flags, unsigned bit_start, unsigned bit_size )
{
    Active->rtns->MIRegUpdateStart( mr, flags, bit_start, bit_size );
}

static void DIGREGISTER DummyRegUpdateEnd( mad_registers *mr, unsigned flags, unsigned bit_start, unsigned bit_size )
{
    mr = mr;
    flags = flags;
    bit_start = bit_start;
    bit_size = bit_size;
}

void            MADRegUpdateEnd( mad_registers *mr, unsigned flags, unsigned bit_start, unsigned bit_size )
{
    Active->rtns->MIRegUpdateEnd( mr, flags, bit_start, bit_size );
}

⌨️ 快捷键说明

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