msdump.c

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

C
862
字号
    case MS_RT_TYP_CURRENCY:
        printf( "currency" );
        switch( t & MS_RT_SZ_FIELD ) {
        case MS_RT_SZ_01:
            printf( "_8 " );
            break;
        }
        break;
    }
    switch( t & MS_RT_MD_FIELD ) {
    case MS_RT_MD_NEAR_PTR:
        printf( "near * " );
        break;
    case MS_RT_MD_FAR_PTR:
        printf( "far * " );
        break;
    case MS_RT_MD_HUGE_PTR:
        printf( "huge * " );
        break;
    case MS_RT_MD_DIRECT:
        break;
    }
}

void dumpLeaf( unsigned *len )
{
    uint_16 u2;
    uint_32 u4;
    int_8 s1;
    int_16 s2;
    int_32 s4;
    int leaf;
    unsigned slen;
    unsigned idx;

    leaf = getb();
    --*len;
    if( leaf < 0x80 ) {
        printf( "%u ", leaf );
        return;
    }
    switch( leaf ) {
    case MS_BCL_INT_8:
        s1 = getb();
        --*len;
        printf( "%d ", s1 );
        break;
    case MS_BCL_INT_16:
        s2 = getw();
        *len -= 2;
        printf( "%d ", s2 );
        break;
    case MS_BCL_INT_32:
        s4 = getl();
        *len -= 4;
        printf( "%ld ", s4 );
        break;
    case MS_BCL_UINT_16:
        u2 = getw();
        *len -= 2;
        printf( "%u ", u2 );
        break;
    case MS_BCL_UINT_32:
        u4 = getl();
        *len -= 4;
        printf( "%lu ", u4 );
        break;
    case MS_BCL_INDEX:
        if( obj_metaware ) {
            idx = getb();
            --*len;
            printf( "@%x ", idx + ( FIRST_DEFINED_TYPE - 1 ) );
            break;
        }
        idx = getw();
        *len -= 2;
        if( idx < FIRST_DEFINED_TYPE ) {
            dumpSpecial( idx );
            break;
        }
        printf( "@%x ", idx );
        break;
    case MS_BCL_STRING:
        slen = getb();
        --*len;
        putchar( '"' );
        while( slen ) {
            putchar( getb() );
            --*len;
            --slen;
        }
        putchar( '"' );
        putchar( ' ' );
        break;
    default:
        dumpCode( leaf, translateType );
    }
}

void dumpHexRec( void )
{
    char *p;

    if( dump_hex == 0 ) {
        return;
    }
    p = record;
    while( p != in_record ) {
        printf( "%02x ", *p );
        ++p;
    }
    putchar( '\n' );
    putchar( '\n' );
}

void dumpTypes( unsigned len )
{
    int linkage;
    unsigned tlen;
    int c;
    int lo, hi;
    int packed;
    int calling;

    for(;;) {
        if( len == 1 ) break;
        in_record = record;
        linkage = getb();
        lo = getb();
        if( linkage == 0 && lo == 0 ) {
            tlen = len - 3;
            len -= 2;
        } else {
            hi = getb();
            tlen = ( hi << 8 ) | lo;
            len -= 3;
        }
        printf( "%3x: %s (%u) ", type_index, linkage ? "T" : "F", tlen );
        ++type_index;
        len -= tlen;
        c = getb();
        --tlen;
        dumpCode( c, translateType );
        switch( c ) {
        case MS_SL_POINTER:
            dumpCode( getb(), translateType );
            --tlen;
            while( tlen ) {
                dumpLeaf( &tlen );
            }
            break;
        case MS_SL_SCALAR:
            dumpLeaf( &tlen );
            dumpSpecial( getb() );
            --tlen;
            while( tlen ) {
                dumpLeaf( &tlen );
            }
            break;
        case MS_SL_STRUCTURE:
            dumpLeaf( &tlen );
            dumpLeaf( &tlen );
            dumpLeaf( &tlen );
            dumpLeaf( &tlen );
            dumpLeaf( &tlen );
            packed = getb();
            --tlen;
            dumpCode( packed, translateType );
            flushRec( tlen );
            break;
        case MS_SL_PROCEDURE:
            dumpLeaf( &tlen );
            dumpLeaf( &tlen );
            calling = getb();
            --tlen;
            dumpCode( calling, translateType );
            dumpi( &tlen );
            dumpLeaf( &tlen );
            flushRec( tlen );
            break;
        case MS_SL_BITFIELD:
            putchar( ':' );
            dumpi( &tlen );
            dumpCode( getb(), translateType );
            dumpb();
            break;
        case MS_SL_ARRAY:
            while( tlen ) {
                dumpLeaf( &tlen );
            }
            break;
        case MS_SL_LIST:
            if( tlen ) {
                dumpLeaf( &tlen );
            }
            while( tlen ) {
                putchar( ',' );
                putchar( ' ' );
                dumpLeaf( &tlen );
            }
            break;
        default:
            flushRec( tlen );
        }
        putchar( '\n' );
        dumpHexRec();
    }
    getb();     /* checksum */
}

void dumpSymbols( unsigned len )
{
    unsigned slen;
    int c;

    for(;;) {
        if( len == 1 ) break;
        in_record = record;
        slen = getb();
        --len;
        printf( "(%u) ", slen );
        len -= slen;
        c = getb();
        --slen;
        if( c & MS_SYM_386_FLAG ) {
            obj_32 = 1;
        }
        c &= ~MS_SYM_386_FLAG;
        dumpCode( c, translateSymbol );
        switch( c ) {
        case MS_SYM_BP_RELATIVE:
            if( obj_32 ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            putchar( '@' );
            dumpw();
            slen -= 2;
            dumpName( &slen );
            break;
        case MS_SYM_LOCAL_SYM:
            if( obj_32 ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            dumpw();
            slen -= 2;
            putchar( '@' );
            dumpw();
            slen -= 2;
            dumpName( &slen );
            break;
        case MS_SYM_PROCEDURE_START:
            if( obj_32 ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            putchar( '@' );
            dumpw();
            slen -= 2;
            if( obj_metaware ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            dumpw();
            slen -= 2;
            if( obj_metaware ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            dumpw();
            slen -= 2;
            dumpb();
            dumpName( &slen );
            break;
        case MS_SYM_BLOCK_START:
            if( obj_32 ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            if( obj_metaware ) {
                dumpl();
                slen -= 4;
            } else {
                dumpw();
                slen -= 2;
            }
            dumpName( &slen );
            break;
        case MS_SYM_TYPEDEF_SYM:
            putchar( '@' );
            dumpw();
            slen -= 2;
            dumpName( &slen );
            break;
        case MS_SYM_CHANGE_DEF_SEG:
            dumpw();
            slen -= 2;
            dumpw();
            slen -= 2;
            break;
        default:
            flushRec( slen );
        }
        putchar( '\n' );
        dumpHexRec();
    }
    getb();     /* checksum */
}

void procLEDATA( unsigned len )
{
    unsigned seg_idx;

    seg_idx = geti( &len );
    if( seg_idx != type_seg && seg_idx != sym_seg ) {
        flushRec( len );
        return;
    }
    if( obj_32 ) {
        getl();
        len -= 4;
    } else {
        getw();
        len -= 2;
    }
    if( seg_idx == type_seg ) {
        dumpTypes( len );
    } else if( seg_idx == sym_seg ) {
        dumpSymbols( len );
    } else {
        flushRec( len );
    }
}

void main( int argc, char **argv )
{
    unsigned len;
    int rec;
    char *p;

    if( argc != 2 && argc != 3 ) {
        puts( "usage: MSDUMP <file> [-xm]" );
        puts( "-x     dump hex values of type/symbol records" );
        puts( "-m     use MetaWare CodeView interpretation" );
        puts( "options may be combined (i.e., -xm)" );
        exit( EXIT_FAILURE );
    }
    fp = fopen( argv[1], "rb" );
    if( fp == NULL ) {
        fatal( "could not open input file" );
    }
    dump_hex = 0;
    obj_32 = 0;
    obj_metaware = 0;
    if( argc == 3 ) {
        if( argv[2][0] == '-' || argv[2][0] == '/' ) {
            p = &argv[2][1];
            while( *p ) {
                switch( *p ) {
                case 'x':
                    dump_hex = 1;
                    break;
                case 'm':
                    obj_metaware = 1;
                    break;
                }
                ++p;
            }
        }
    }
    record_len = 256;
    record = memalloc( record_len );
    in_record = record;
    curr_lname = 1;
    curr_segdef = 1;
    for(;;) {
        rec = fgetc( fp );
        if( rec == EOF ) break;
        in_record = record;
        len = getw();
        if( len > record_len ) {
            record_len = (( len + 1 ) + 0x0f ) & ~0x0f;
            record = memrealloc( record, record_len );
            in_record = record;
        }
        switch( rec ) {
        case CMD_COMENT:
            procCOMENT( len );
            break;
        case CMD_LNAMES:
            procLNAMES( len );
            break;
        case CMD_SEGDEF:
        case CMD_SEGD32:
            procSEGDEF( len );
            break;
        case CMD_LEDATA:
        case CMD_LEDA32:
            procLEDATA( len );
            break;
        case CMD_TYPDEF:
            obj_metaware = 1;
            dumpTypes( len );
            break;
        default:
            flushRec( len );
        }
    }
    fclose( fp );
    exit( EXIT_SUCCESS );
}

⌨️ 快捷键说明

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