int Munkres::step2(void) { const unsigned int rows = matrix.rows, columns = matrix.cols; unsigned int covercount = 0; for ( unsigned int row = 0 ; row < rows ; row++ ) for ( unsigned int col = 0 ; col < columns ; col++ ) if ( STAR == mask_matrix(row, col) ) { col_mask[col] = true; covercount++; } if ( covercount >= minsize(matrix) ) { if(isDiag) { std::cout << "Final cover count: " << covercount << std::endl; } return 0; } if(isDiag) { std::cout << "Munkres matrix has " << covercount << " of " << minsize(matrix) << " Columns covered:" << std::endl; for ( unsigned int row = 0 ; row < rows ; row++ ) { for ( unsigned int col = 0 ; col < columns ; col++ ) { std::cout.width(4); std::cout << matrix(row, col) << ","; } std::cout << std::endl; } std::cout << std::endl; } return 3; }
void VDUIBaseWindowW32::PreLayoutBase(const VDUILayoutSpecs& parentConstraints) { VDUILayoutSpecs rcConstraints(parentConstraints); RECT rcBorders = {0,0,0,0}; RECT rcPad = {mPadding,mPadding,mPadding,mPadding}; bool bModeless = (0 != (GetWindowLong(mhwnd, GWL_STYLE) & DS_CONTROL)); // If the dialog is modal, compute the insets for the dialog. if (!bModeless) { MapDialogRect(mhwnd, &rcPad); mInsets = rcPad; AdjustWindowRectEx(&rcBorders, GetWindowLong(mhwnd, GWL_STYLE), GetMenu(mhwnd) != NULL, GetWindowLong(mhwnd, GWL_STYLE)); // enlarge borders by pads rcBorders.left = rcBorders.left - rcPad.left; rcBorders.top = rcBorders.top - rcPad.top; rcBorders.right = rcBorders.right + rcPad.right; rcBorders.bottom = rcBorders.bottom + rcPad.bottom; } else mInsets = rcBorders; // Shrink constraints by insets. mLayoutSpecs.minsize.w = rcBorders.right - rcBorders.left; mLayoutSpecs.minsize.h = rcBorders.bottom - rcBorders.top; rcConstraints.minsize.w -= mLayoutSpecs.minsize.w; rcConstraints.minsize.h -= mLayoutSpecs.minsize.h; // Layout children. tChildren::iterator it(mChildren.begin()), itEnd(mChildren.end()); vduisize minsize(0, 0); for(; it!=itEnd; ++it) { IVDUIWindow *pWin = *it; pWin->PreLayout(rcConstraints); const VDUILayoutSpecs& prispecs = pWin->GetLayoutSpecs(); if (minsize.w < prispecs.minsize.w) minsize.w = prispecs.minsize.w; if (minsize.h < prispecs.minsize.h) minsize.h = prispecs.minsize.h; } mLayoutSpecs.minsize.w += minsize.w; mLayoutSpecs.minsize.h += minsize.h; }
void VDUIBaseWindowW32::PostLayoutBase(const vduirect& target) { VDUIControlW32::PostLayoutBase(target); vduirect rc(GetClientArea()); rc.left += mInsets.left; rc.top += mInsets.top; rc.right -= mInsets.right; rc.bottom -= mInsets.bottom; tChildren::iterator it(mChildren.begin()), itEnd(mChildren.end()); vduisize minsize(0, 0); for(; it!=itEnd; ++it) { IVDUIWindow *pWin = *it; pWin->PostLayout(rc); } }
void TimeLabel::setDisplayPosition( float pos, int64_t t, int length ) { showBuffering = false; bufTimer->stop(); if( pos == -1.f ) { setMinimumSize( QSize( 0, 0 ) ); if( displayType == TimeLabel::Both ) setText( "--:--/--:--" ); else setText( "--:--" ); return; } int time = t / 1000000; secstotimestr( psz_length, length ); secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time : time ); // compute the minimum size that will be required for the psz_length // and use it to enforce a minimal size to avoid "dancing" widgets QSize minsize( 0, 0 ); if ( length > 0 ) { QMargins margins = contentsMargins(); minsize += QSize( fontMetrics().size( 0, QString( psz_length ), 0, 0 ).width(), sizeHint().height() ); minsize += QSize( margins.left() + margins.right() + 8, 0 ); /* +padding */ if ( b_remainingTime ) minsize += QSize( fontMetrics().size( 0, "-", 0, 0 ).width(), 0 ); } switch( displayType ) { case TimeLabel::Elapsed: setMinimumSize( minsize ); setText( QString( psz_time ) ); break; case TimeLabel::Remaining: if( b_remainingTime ) { setMinimumSize( minsize ); setText( QString("-") + QString( psz_time ) ); } else { setMinimumSize( QSize( 0, 0 ) ); setText( QString( psz_length ) ); } break; case TimeLabel::Both: default: QString timestr = QString( "%1%2/%3" ) .arg( QString( (b_remainingTime && length) ? "-" : "" ) ) .arg( QString( psz_time ) ) .arg( QString( ( !length && time ) ? "--:--" : psz_length ) ); setText( timestr ); break; } cachedLength = length; }
////////////////// // Get size information for a single entry (WINRECT). Returns size info in // the SIZEINFO argument. For a group, calculate size info as aggregate of // subentries. // void CWinMgr::OnGetSizeInfo(SIZEINFO& szi, WINRECT* wrc, CWnd* pWnd) { szi.szMin = SIZEZERO; // default min size = zero szi.szMax = SIZEMAX; // default max size = infinite szi.szDesired = wrc->GetRect().Size(); // default desired size = current if (wrc->IsGroup()) { // For groups, calculate min, max, desired size as aggregate of children szi.szDesired = SIZEZERO; BOOL bRow = wrc->IsRowGroup(); CWinGroupIterator it; for (it=wrc; it; it.Next()) { WINRECT* wrc2 = it; SIZEINFO szi2; OnGetSizeInfo(szi2, wrc2, pWnd); if (bRow) { szi.szMin.cx = max(szi.szMin.cx, szi2.szMin.cx); szi.szMin.cy += szi2.szMin.cy; szi.szMax.cx = min(szi.szMax.cx, szi2.szMax.cx); szi.szMax.cy = min(szi.szMax.cy + szi2.szMax.cy, _INFINITY); szi.szDesired.cx = max(szi.szDesired.cx, szi2.szDesired.cx); szi.szDesired.cy += szi2.szDesired.cy; } else { szi.szMin.cx += szi2.szMin.cx; szi.szMin.cy = max(szi.szMin.cy, szi2.szMin.cy); szi.szMax.cx = min(szi.szMax.cx + szi2.szMax.cx, _INFINITY); szi.szMax.cy = min(szi.szMax.cy, szi2.szMax.cy); szi.szDesired.cx += szi2.szDesired.cx; szi.szDesired.cy = max(szi.szDesired.cy, szi2.szDesired.cy); } } // Add margins. int w2,h2; wrc->GetMargins(w2,h2); // get margins w2<<=1; h2<<=1; // double szi.szMin.cx += max(0,w2); // negative margins ==> don't include in min szi.szMin.cy += max(0,h2); // ditto szi.szDesired.cx += abs(w2); // for desired size, use abs vallue szi.szDesired.cy += abs(h2); // ditto } else { // not a group WINRECT* parent = wrc->Parent(); ASSERT(parent); CRect& rcParent = parent->GetRect(); BOOL bRow = parent->IsRowGroup(); int hw, hwMin, hwTotal, pct; switch (wrc->Type()) { case WRCT_FIXED: hw = hwMin = wrc->GetParam(); // ht/wid is parameter if (hw<0) { // if fixed val is negative: hw = -hw; // use absolute val for desired.. hwMin = 0; // ..and zero for minimum } if (bRow) { szi.szMax.cy = szi.szDesired.cy = hw; szi.szMin.cy = hwMin; } else { szi.szMax.cx = szi.szDesired.cx = hw; szi.szMin.cx = hwMin; } break; case WRCT_PCT: pct = wrc->GetParam(); ASSERT(0<pct && pct<100); hwTotal = bRow ? rcParent.Height() : rcParent.Width(); hw = (hwTotal * pct) / 100; szi.szDesired = bRow ? CSize(rcParent.Width(), hw) : CSize(hw, rcParent.Height()); break; case WRCT_TOFIT: if (wrc->HasToFitSize()) { szi.szDesired = wrc->GetToFitSize(); } break; case WRCT_REST: break; default: ASSERT(FALSE); } // If the entry is a window, send message to get min/max/tofit size. // Only set tofit size if type is TOFIT. // if (wrc->IsWindow() && pWnd) { CWnd* pChild = pWnd->GetDlgItem(wrc->GetID()); if (pChild) { if (!pChild->IsWindowVisible() && pWnd->IsWindowVisible()) { // parent visible but child not ==> tofit size is zero // important so hidden windows use no space szi.szDesired = SIZEZERO; } else { szi.szAvail = rcParent.Size(); SendGetSizeInfo(szi, pWnd, wrc->GetID()); } } } szi.szDesired = maxsize(minsize(szi.szDesired,szi.szMax), szi.szMin); } }
FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType ) : PCB_BASE_FRAME( aKiway, aParent, aFrameType, _( "Footprint Library Browser" ), wxDefaultPosition, wxDefaultSize, aFrameType == FRAME_PCB_MODULE_VIEWER_MODAL ? KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT : KICAD_DEFAULT_DRAWFRAME_STYLE, GetFootprintViewerFrameName() ) { wxASSERT( aFrameType==FRAME_PCB_MODULE_VIEWER || aFrameType==FRAME_PCB_MODULE_VIEWER_MODAL ); if( aFrameType == FRAME_PCB_MODULE_VIEWER_MODAL ) SetModal( true ); wxAcceleratorTable table( DIM( accels ), accels ); m_FrameName = GetFootprintViewerFrameName(); m_configPath = wxT( "FootprintViewer" ); m_showAxis = true; // true to draw axis. // Give an icon wxIcon icon; icon.CopyFromBitmap( KiBitmap( modview_icon_xpm ) ); SetIcon( icon ); m_HotkeysZoomAndGridList = g_Module_Viewer_Hokeys_Descr; m_libList = new wxListBox( this, ID_MODVIEW_LIB_LIST, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_HSCROLL ); m_footprintList = new wxListBox( this, ID_MODVIEW_FOOTPRINT_LIST, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_HSCROLL ); SetBoard( new BOARD() ); // Ensure all layers and items are visible: GetBoard()->SetVisibleAlls(); SetScreen( new PCB_SCREEN( GetPageSizeIU() ) ); GetScreen()->m_Center = true; // Center coordinate origins on screen. LoadSettings( config() ); SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); ReCreateHToolbar(); ReCreateVToolbar(); ReCreateLibraryList(); UpdateTitle(); // If a footprint was previously loaded, reload it if( getCurNickname().size() && getCurFootprintName().size() ) { FPID id; id.SetLibNickname( getCurNickname() ); id.SetFootprintName( getCurFootprintName() ); GetBoard()->Add( loadFootprint( id ) ); } if( m_canvas ) m_canvas->SetAcceleratorTable( table ); m_auimgr.SetManagedWindow( this ); wxSize minsize(100,-1); // Min size of list boxes // Main toolbar is initially docked at the top of the main window and dockable on any side. // The close button is disable because the footprint viewer has no main menu to re-enable it. // The tool bar will only be dockable on the top or bottom of the main frame window. This is // most likely due to the fact that the other windows are not dockable and are preventing the // tool bar from docking on the right and left. wxAuiPaneInfo toolbarPaneInfo; toolbarPaneInfo.Name( wxT( "m_mainToolBar" ) ).ToolbarPane().Top().CloseButton( false ); EDA_PANEINFO info; info.InfoToolbarPane(); EDA_PANEINFO mesg; mesg.MessageToolbarPane(); // Manage main toolbar, top pane m_auimgr.AddPane( m_mainToolBar, toolbarPaneInfo ); // Manage the list of libraries, left pane. m_auimgr.AddPane( m_libList, wxAuiPaneInfo( info ).Name( wxT( "m_libList" ) ) .Left().Row( 1 ).MinSize( minsize ) ); // Manage the list of footprints, center pane. m_auimgr.AddPane( m_footprintList, wxAuiPaneInfo( info ).Name( wxT( "m_footprintList" ) ) .Left().Row( 2 ).MinSize( minsize ) ); // Manage the draw panel, right pane. m_auimgr.AddPane( m_canvas, wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() ); // Manage the message panel, bottom pane. m_auimgr.AddPane( m_messagePanel, wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom() ); if( !m_perspective.IsEmpty() ) { // Restore last saved sizes, pos and other params // However m_mainToolBar size cannot be set to its last saved size // because the actual size change depending on the way modview was called: // the tool to export the current footprint exist or not. // and the saved size is not always OK // the trick is to get the default toolbar size, and set the size after // calling LoadPerspective wxSize tbsize = m_mainToolBar->GetSize(); m_auimgr.LoadPerspective( m_perspective, false ); m_auimgr.GetPane( m_mainToolBar ).BestSize( tbsize ); } #if 0 // no. // Set min size (overwrite params read in LoadPerspective(), if any) m_auimgr.GetPane( m_libList ).MinSize( minsize ); m_auimgr.GetPane( m_footprintList ).MinSize( minsize ); #endif // after changing something to the aui manager, // call Update()() to reflect the changes m_auimgr.Update(); // Now Drawpanel is sized, we can use BestZoom to show the component (if any) #ifdef USE_WX_GRAPHICS_CONTEXT GetScreen()->SetZoom( BestZoom() ); #else Zoom_Automatique( false ); #endif Show( true ); }
FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType ) : PCB_BASE_FRAME( aKiway, aParent, aFrameType, _( "Footprint Library Browser" ), wxDefaultPosition, wxDefaultSize, aFrameType == FRAME_PCB_MODULE_VIEWER_MODAL ? #ifdef __WINDOWS__ KICAD_DEFAULT_DRAWFRAME_STYLE | wxSTAY_ON_TOP : #else KICAD_DEFAULT_DRAWFRAME_STYLE | wxFRAME_FLOAT_ON_PARENT : #endif KICAD_DEFAULT_DRAWFRAME_STYLE, FOOTPRINT_VIEWER_FRAME_NAME ) { wxASSERT( aFrameType==FRAME_PCB_MODULE_VIEWER || aFrameType==FRAME_PCB_MODULE_VIEWER_MODAL ); if( aFrameType == FRAME_PCB_MODULE_VIEWER_MODAL ) SetModal( true ); m_configFrameName = FOOTPRINT_VIEWER_FRAME_NAME; m_showAxis = true; // true to draw axis. // Give an icon wxIcon icon; icon.CopyFromBitmap( KiBitmap( modview_icon_xpm ) ); SetIcon( icon ); m_hotkeysDescrList = g_Module_Viewer_Hokeys_Descr; m_libList = new wxListBox( this, ID_MODVIEW_LIB_LIST, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_HSCROLL ); m_footprintList = new wxListBox( this, ID_MODVIEW_FOOTPRINT_LIST, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_HSCROLL ); SetBoard( new BOARD() ); // In viewer, the default net clearance is not known (it depends on the actual board). // So we do not show the default clearance, by setting it to 0 // The footprint or pad specific clearance will be shown GetBoard()->GetDesignSettings().GetDefault()->SetClearance(0); // Ensure all layers and items are visible: GetBoard()->SetVisibleAlls(); SetScreen( new PCB_SCREEN( GetPageSizeIU() ) ); GetScreen()->m_Center = true; // Center coordinate origins on screen. LoadSettings( config() ); SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y ); GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); // Menu bar is not mandatory: uncomment/comment the next line // to add/remove the menubar ReCreateMenuBar(); ReCreateHToolbar(); ReCreateVToolbar(); ReCreateLibraryList(); UpdateTitle(); PCB_BASE_FRAME* parentFrame = static_cast<PCB_BASE_FRAME*>( Kiway().Player( FRAME_PCB, true ) ); // Create GAL canvas PCB_DRAW_PANEL_GAL* drawPanel = new PCB_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_FrameSize, parentFrame->GetGalCanvas()->GetBackend() ); SetGalCanvas( drawPanel ); // Create the manager and dispatcher & route draw panel events to the dispatcher m_toolManager = new TOOL_MANAGER; m_toolManager->SetEnvironment( GetBoard(), drawPanel->GetView(), drawPanel->GetViewControls(), this ); m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager ); drawPanel->SetEventDispatcher( m_toolDispatcher ); m_toolManager->RegisterTool( new PCBNEW_CONTROL ); m_toolManager->ResetTools( TOOL_BASE::RUN ); // If a footprint was previously loaded, reload it if( getCurNickname().size() && getCurFootprintName().size() ) { FPID id; id.SetLibNickname( getCurNickname() ); id.SetFootprintName( getCurFootprintName() ); GetBoard()->Add( loadFootprint( id ) ); } drawPanel->DisplayBoard( m_Pcb ); updateView(); m_auimgr.SetManagedWindow( this ); wxSize minsize(100,-1); // Min size of list boxes // Main toolbar is initially docked at the top of the main window and dockable on any side. // The close button is disable because the footprint viewer has no main menu to re-enable it. // The tool bar will only be dockable on the top or bottom of the main frame window. This is // most likely due to the fact that the other windows are not dockable and are preventing the // tool bar from docking on the right and left. wxAuiPaneInfo toolbarPaneInfo; toolbarPaneInfo.Name( wxT( "m_mainToolBar" ) ).ToolbarPane().Top().CloseButton( false ); EDA_PANEINFO info; info.InfoToolbarPane(); EDA_PANEINFO mesg; mesg.MessageToolbarPane(); // Manage main toolbar, top pane m_auimgr.AddPane( m_mainToolBar, toolbarPaneInfo ); // Manage the list of libraries, left pane. m_auimgr.AddPane( m_libList, wxAuiPaneInfo( info ).Name( wxT( "m_libList" ) ) .Left().Row( 1 ).MinSize( minsize ) ); // Manage the list of footprints, center pane. m_auimgr.AddPane( m_footprintList, wxAuiPaneInfo( info ).Name( wxT( "m_footprintList" ) ) .Left().Row( 2 ).MinSize( minsize ) ); // Manage the draw panel, right pane. m_auimgr.AddPane( m_canvas, wxAuiPaneInfo().Name( wxT( "DrawFrame" ) ).CentrePane() ); m_auimgr.AddPane( (wxWindow*) GetGalCanvas(), wxAuiPaneInfo().Name( wxT( "DrawFrameGal" ) ).CentrePane().Hide() ); // Manage the message panel, bottom pane. m_auimgr.AddPane( m_messagePanel, wxAuiPaneInfo( mesg ).Name( wxT( "MsgPanel" ) ).Bottom() ); if( !m_perspective.IsEmpty() ) { // Restore last saved sizes, pos and other params // However m_mainToolBar size cannot be set to its last saved size // because the actual size change depending on the way modview was called: // the tool to export the current footprint exist or not. // and the saved size is not always OK // the trick is to get the default toolbar size, and set the size after // calling LoadPerspective wxSize tbsize = m_mainToolBar->GetSize(); m_auimgr.LoadPerspective( m_perspective, false ); m_auimgr.GetPane( m_mainToolBar ).BestSize( tbsize ); } // after changing something to the aui manager, // call Update()() to reflect the changes m_auimgr.Update(); // Now Drawpanel is sized, we can use BestZoom to show the component (if any) #ifdef USE_WX_GRAPHICS_CONTEXT GetScreen()->SetZoom( BestZoom() ); #else Zoom_Automatique( false ); #endif UseGalCanvas( parentFrame->IsGalCanvasActive() ); if( !IsModal() ) // For modal mode, calling ShowModal() will show this frame { Raise(); // On some window managers, this is needed Show( true ); } } FOOTPRINT_VIEWER_FRAME::~FOOTPRINT_VIEWER_FRAME() { if( m_Draw3DFrame ) m_Draw3DFrame->Destroy(); } void FOOTPRINT_VIEWER_FRAME::OnCloseWindow( wxCloseEvent& Event ) { DBG(printf( "%s:\n", __func__ );) if( IsGalCanvasActive() )
static int process (int in, BIfunc func) { BI info; unsigned char buffer[BUFSIZE]; unsigned char *bidxlist[(BUFSIZE/BLKSIZE)+1]; int bidx; ssize_t bread; unsigned long size; unsigned long ccnt[cnt_LAST]; double cprc[cnt_LAST]; FREQ bcnt[256]; double bprc[256]; int i, c; memset (&info, 0, sizeof (info)); memset (bidxlist, 0, sizeof (bidxlist)); bidx = 0; while ((bidx * BLKSIZE) < BUFSIZE) { bidxlist[bidx] = &(buffer[bidx * BLKSIZE]); bidx++; } memset (ccnt, 0, sizeof (ccnt)); memset (cprc, 0, sizeof (cprc)); memset (bcnt, 0, sizeof (bcnt)); memset (bprc, 0, sizeof (bprc)); for (i=0; i<256; i++) bcnt[i].idx = i; size = 0; while (1) { memset (buffer, 0, sizeof (buffer)); bread = _read (in, buffer, sizeof (buffer)); if (bread <= 0) break; size += bread; bidx = 0; while (bread > 0) { info.size = minsize (BLKSIZE, bread); info.buffer = bidxlist[bidx]; func (&info, ccnt, bcnt); info.index++; info.offset += BLKSIZE; bidx++; bread -= BLKSIZE; } } if (bread == -1) { fprintf (stderr, "*** Error: error reading from file! (errno: %d)\n", errno); return (1); } printf ("# Character class distribution:\n"); printf ("# %9s %9s %9s %9s %9s %9s\n", "alfa", "num", "punc", "space", "nul", "rest"); cprc[cnt_alf] = ccnt[cnt_alf] * 100.0 / size; cprc[cnt_num] = ccnt[cnt_num] * 100.0 / size; cprc[cnt_pnc] = ccnt[cnt_pnc] * 100.0 / size; cprc[cnt_spc] = ccnt[cnt_spc] * 100.0 / size; cprc[cnt_nul] = ccnt[cnt_nul] * 100.0 / size; cprc[cnt_rst] = ccnt[cnt_rst] * 100.0 / size; printf (" %9lu %9lu %9lu %9lu %9lu %9lu\n", ccnt[cnt_alf], ccnt[cnt_num], ccnt[cnt_pnc], ccnt[cnt_spc], ccnt[cnt_nul], ccnt[cnt_rst]); printf (" %8.2f%% %8.2f%% %8.2f%% %8.2f%% %8.2f%% %8.2f%%\n", cprc[cnt_alf], cprc[cnt_num], cprc[cnt_pnc], cprc[cnt_spc], cprc[cnt_nul], cprc[cnt_rst]); printf ("\n"); qsort (bcnt, 256, sizeof (FREQ), sort_freq); printf ("# Byte distribution, sorted on frequency:\n"); printf ("# %4s %9s %6s\n", "char", "count", "dist"); for (i=0; i<256; i++) { bprc[i] = bcnt[i].cnt * 100.0 / size; c = bcnt[i].idx & 0xff; if (isprint (c)) { printf (" [ %c] %9lu %6.2f%%\n", c, bcnt[i].cnt, bprc[i]); } else { printf (" [%2.2x] %9lu %6.2f%%\n", c, bcnt[i].cnt, bprc[i]); } } printf ("\n"); qsort (bcnt, 256, sizeof (FREQ), sort_char); printf ("# Byte distribution, sorted on byte value:\n"); printf ("# %4s %9s %6s\n", "char", "count", "dist"); for (i=0; i<256; i++) { bprc[i] = bcnt[i].cnt * 100.0 / size; c = bcnt[i].idx & 0xff; if (isprint (c)) { printf (" [ %c] %9lu %6.2f%%\n", c, bcnt[i].cnt, bprc[i]); } else { printf (" [%2.2x] %9lu %6.2f%%\n", c, bcnt[i].cnt, bprc[i]); } } printf ("\n"); return (0); }