Exemplo n.º 1
0
void GetRegStringCreate( mad_registers *regs, mad_reg_set_data *reg_set,
    int width, RegStringCreateData **rc, int *nregs, int *ncols )
{
    RegStringCreateData *reg_create;
    int                 num_columns;
    int                 num_regs;
    int                 max_len;
    int                 i;
    int                 j;
    char                *buffer;
    int                 maxv;

    getRegSetInfo( reg_set, regs, &max_len, &maxv, &num_regs );
    reg_create = MemAlloc( sizeof(RegStringCreateData) * num_regs );
    for( i = 0; i < num_regs; i++ ){
        reg_create[i].buffer = MemAlloc( max_len + 1 );
        reg_create[i].value = MemAlloc( maxv + 1 );
        getMadString( reg_set, regs, i, reg_create );
    }

    num_columns = MADRegSetDisplayGrouping(reg_set);
    if( num_columns == 0 ){
        num_columns = width / max_len;
    }
    num_columns = num_columns;
    if( num_columns > num_regs )
        num_columns = num_regs;
    for( i = 0; i < num_columns; i++ ){
        for( j = i; j < num_regs; j += num_columns ) {
            if( reg_create[i].maxd < reg_create[j].maxd )
                reg_create[i].maxd = reg_create[j].maxd;
            if( reg_create[i].length = reg_create[j].length ) {
                reg_create[i].length = reg_create[j].length;
            }
        }
        reg_create[i].length += reg_create[i].maxd;
    }
    buffer = alloca( max_len + 1 );
    j = 0;
    for( i = 0; i < num_regs; i++ ){
        sprintf( buffer, "%*s%s", -reg_create[j].maxd, reg_create[i].buffer, reg_create[i].value );
        strcpy( reg_create[i].buffer, buffer );
        j++;
        if( j == num_columns ) {
            j = 0;
        }
    }
    *rc = reg_create;
    *nregs = num_regs;
    *ncols = num_columns;
}
Exemplo n.º 2
0
static bool RegResize( a_window *wnd )
{
    reg_window          *reg = WndReg( wnd );
    gui_ord             space;
    int                 old_up;
    int                 i,j;
    reg_display_piece   disp;
    gui_ord             max_extent;
    gui_ord             max_descript;
    a_reg_info          *info;
    gui_ord             indent;
    gui_ord             value,descript;
    char                *p;
    unsigned            len;

    old_up = reg->up;
    reg->up = 1;

    RegFindData( reg->kind, &reg->data );
    reg->count = 0;
    while( GetDisplayPiece( &disp, reg, DbgRegs, reg->count ) ) {
        reg->count++;
    }

    WndFree( reg->info );
    reg->info = WndMustAlloc( reg->count * sizeof( *reg->info ) );
    space = WndAvgCharX( wnd );

    max_extent = 0;
    max_descript = 0;
    for( i = 0; i < reg->count; ++i ) {
        GetDisplayPiece( &disp, reg, DbgRegs, i );
        if( disp.max_value == 0 && disp.reginfo != NULL ) {
            disp.max_value = GetMADMaxFormatWidth( disp.disp_type );
        }
        info = &reg->info[i];
        info->max_value = disp.max_value;
        info->info = disp.reginfo;
        if( disp.max_descript > strlen( disp.descript ) ) {
            info->max_descript = space + disp.max_descript * WndAvgCharX( wnd );
        } else {
            info->max_descript = space + WndExtentX( wnd, disp.descript );
        }
        info->max_extent = space + disp.max_value * WndAvgCharX( wnd );
        info->standout = false;
        if( max_extent < info->max_extent ) {
            max_extent = info->max_extent;
        }
        if( max_descript < info->max_descript ) {
            max_descript = info->max_descript;
        }
    }

    reg->up = MADRegSetDisplayGrouping( reg->data );
    if( reg->up == 0 ) {
        reg->up = WndWidth( wnd ) / ( max_extent + max_descript );
        if( reg->up < 1 )
            reg->up = 1;
        if( reg->up > reg->count ) {
            reg->up = reg->count;
        }
    }
    reg->rows = ( reg->count + reg->up - 1 ) / reg->up;

    // calculate the indents

    WndFree( reg->indents );
    reg->indents = WndMustAlloc( reg->count * sizeof( *reg->indents ) );

    // For each column
    for( i = 0; i < reg->up; ++i ) {
        reg->indents[i].descript = 0;
        reg->indents[i].value = 0;
        // Calc max widths for column
        for( j = i; j < reg->count; j += reg->up ) {
            if( reg->indents[i].value < reg->info[j].max_extent ) {
                reg->indents[i].value = reg->info[j].max_extent;
            }
            if( reg->indents[i].descript < reg->info[j].max_descript ) {
                reg->indents[i].descript = reg->info[j].max_descript;
            }
        }
    }
    // Calc indents for each column
    indent = 0;
    value = 0;
    descript = 0;
    // For each column
    for( i = 0; i < reg->up; ++i ) {
        value = reg->indents[i].value;
        descript = reg->indents[i].descript;
        reg->indents[i].descript = indent;
        reg->indents[i].value = indent + descript;
        indent += value + descript;
#if ( defined( __GUI__ ) && defined( __OS2__ ) )
        // OS/2 PM GUI needs more space between columns
        indent += space;
#endif
    }
    // Copy indents to all registers by column
    for( i = reg->up; i < reg->count; ++i ) {
        reg->indents[i] = reg->indents[i % reg->up];
    }

    if( reg->up != old_up ) {
        WndScrollAbs( wnd, 0 );
        WndNoCurrent( wnd );
    }

    p = TxtBuff + MADCliString( MADRegSetName( reg->data ), TxtBuff, TXT_LEN );
    *p++ = ' ';
    *p++ = '(';
    len = MADRegSetLevel( reg->data, p, TXT_LEN - ( p - TxtBuff ) );
    if( len == 0 ) {
        p -= 2;
    } else {
        p += len;
        *p++ = ')';
    }
    *p++ = NULLCHAR;
    WndSetTitle( wnd, TxtBuff );

    return( true );
}