static walk_result logRegisterSet( const mad_reg_set_data *reg_set, void *_regs) { mad_registers *regs = _regs; int i; int j; int num_columns; int num_regs; RegStringCreateData *reg_create; char *reg_name; char *set_level; unsigned len; len = MADCliString( MADRegSetName( reg_set ), NULL, 0 ); reg_name = alloca( len + 1 ); MADCliString( MADRegSetName( reg_set ), reg_name, len + 1 ); len = MADRegSetLevel( reg_set, NULL, 0 ); if( len == 0 ){ logStrPrintf( "\n%s\n\n", reg_name ); } else { set_level = alloca( len + 1 ); MADRegSetLevel( reg_set, set_level, len + 1 ); logStrPrintf( "\n%s (%s)\n\n", reg_name, set_level ); } GetRegStringCreate( regs, (mad_reg_set_data*)reg_set, PAGE_WIDTH, ®_create, &num_regs, &num_columns ); j = 0; for( i = 0; i < num_regs; i++ ) { logStrPrintf("%*s ", -reg_create[j].length, reg_create[i].buffer ); j++; if ( j == num_columns ){ logStrPrintf( "\n" ); j = 0; } } FreeRegStringCreate( reg_create, num_regs ); return( WR_CONTINUE ); }
static walk_result CreateAllRegLists( const mad_reg_set_data *data, void *_crld ) { CreateRegListData *crld = _crld; HWND list; HWND combo; HDC dc; SIZE size; char *p; char TxtBuff[TXT_LEN]; unsigned len; p = TxtBuff + MADCliString( MADRegSetName( data ), TxtBuff, TXT_LEN ); *p++ = ' '; *p++ = '('; len = MADRegSetLevel( data, p, TXT_LEN - ( p - TxtBuff ) ); if( len == 0 ) { p -= 2; } else { p += len; *p++ = ')'; } *p++ = '\0'; combo = GetDlgItem( crld->parent, STAT_REGISTER_COMBO ); SendMessage( combo, CB_ADDSTRING, 0, (LPARAM)TxtBuff ); dc = GetDC( combo ); GetTextExtentPoint( dc, TxtBuff, strlen( TxtBuff ), &size ); ReleaseDC( combo, dc ); crld->max_len = size.cx; if( crld->max_len < crld->max_len ) crld->max_len = crld->max_len; crld->reg_set = (mad_reg_set_data *)data; list=CreateRegList( crld ); if( crld->index != 0 ) { ShowWindow( list, SW_HIDE ); } crld->index++; return( WR_CONTINUE ); }
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, ®->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 = ®->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 ); }