|
|
1.1 root 1: /*
2: * Main program
3: */
4:
5:
6: #include <afxwin.h>
7: #include <afxdlgs.h>
8: #include <afxcoll.h>
9: #include <iostream.h>
10: #include <fstream.h>
11:
12: extern "C"
13: {
14: #include <commdlg.h>
15: #include <stdio.h>
16: #include <string.h>
17: #include <imagehlp.h>
18: }
19:
20: #include "types.h"
21: #include "resource.h"
22: #include "ranges.h"
23: #include "dispobj.h"
24: #include "timer.h"
25: #include "tree.h"
26: #include "list.h"
27: #include "listwin.h"
28: #include "capview.h"
29:
30: #define SIZESTRING 256
31:
32: /************************ Data *******************************/
33:
34: CTheApp WinAnalApp;
35: HCURSOR HCursorSizer;
36: HCURSOR HCursorNormal;
37: HICON HIconList;
38: HICON HIconTree;
39: LOGFONT DefaultFont;
40:
41: /***************************************************************/
42:
43: void GetWindows(char * pchProgram, int iThread, CListWnd ** ppListWnd,
44: CTREEWND ** pTreeWnd);
45:
46: /************************ CTheApp definitions *****************/
47:
48: /*** CTheApp::InitInstance
49: *
50: * This function is an override of a virtual function. The
51: * function is used to do any initialization which is needed
52: * for the CapView as a whole (as oppose to window initialization).
53: *
54: * Create the main application whine and load some standard objects
55: * from the library of objects.
56: */
57:
58: BOOL CTheApp::InitInstance()
59: {
60: CFont systemFont;
61:
62: /*
63: * Create the main window
64: */
65:
66: m_pMainWnd = new CMainWindow();
67: m_pMainWnd->ShowWindow( m_nCmdShow );
68: m_pMainWnd->UpdateWindow();
69:
70: /*
71: * Load stock objects from the system
72: */
73:
74: systemFont.CreateStockObject(SYSTEM_FONT);
75: systemFont.GetObject(sizeof(LOGFONT), &DefaultFont);
76:
77: HIconList = LoadIcon(LIST_ICO);
78: HIconTree = LoadIcon(TREE_ICO);
79:
80: HCursorSizer = LoadStandardCursor(IDC_SIZEWE);
81: HCursorNormal = LoadStandardCursor(IDC_ARROW);
82:
83: /*
84: * Process any command line which shows up
85: */
86:
87: if (m_lpCmdLine && *m_lpCmdLine) {
88: ((CMainWindow *) m_pMainWnd)->LoadFile(m_lpCmdLine);
89: }
90:
91: return TRUE;
92: } /* CTheApp::InitInstance() */
93:
94:
95:
96:
97: /*********************** CMainWindow definitions ***************/
98:
99: BEGIN_MESSAGE_MAP( CMainWindow, CMDIFrameWnd )
100: ON_WM_CREATE()
101:
102: ON_COMMAND(IDM_EXIT, OnExit)
103: ON_COMMAND(IDM_OPEN, OnOpen)
104:
105: ON_COMMAND(IDM_TILE, MDITile)
106: ON_COMMAND(IDM_CASCADE, MDICascade)
107: ON_COMMAND(IDM_ARRANGEICON, MDIIconArrange)
108:
109: ON_COMMAND(IDM_ABOUT, OnAbout)
110: ON_COMMAND(IDM_HELP, OnHelp)
111: END_MESSAGE_MAP()
112:
113: CMainWindow::CMainWindow()
114: {
115: LoadAccelTable( "MainAccelTable" );
116: Create(NULL, "Capview", WS_OVERLAPPEDWINDOW, rectDefault, NULL,
117: "MdiMenuInit");
118: return;
119: } /* CMainWindow::CMainWindow() */
120:
121: CMainWindow::~CMainWindow()
122: {
123: delete m_pMenuInit;
124: return;
125: } /* CMainWindow::~CMainWindow() */
126:
127: int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
128: {
129: m_pMenuInit = new CMenu();
130: m_pMenuInit->LoadMenu("MdiMenuInit");
131: CreateClient(lpCreateStruct, m_pMenuInit->GetSubMenu(1));
132: return 0;
133: } /* CMainWindow::OnCreate() */
134:
135: /*
136: * Defined the set of command which are used in response
137: * to commands from the menu bar
138: */
139:
140: void CMainWindow::OnAbout()
141: {
142: ShellAbout(m_hWnd, "CapView", NULL, NULL);
143: return;
144: } /* CMainWindow::OnAbout() */
145:
146: void CMainWindow::OnHelp()
147: {
148: WinHelp(m_hWnd, "capview.hlp", HELP_CONTENTS, 0);
149: return;
150: } /* CMainWindow::OnHelp() */
151:
152: void CMainWindow::OnExit()
153: {
154: DestroyWindow();
155: return;
156: } /* CMainWindow::OnExit() */
157:
158: void CMainWindow::OnOpen()
159: {
160: /*
161: * Attempt to open a profile file and read it.
162: * If a file or archive exception occurs, catch it and
163: * present an error message box.
164: */
165:
166: CString szFileName, szFileTitle;
167:
168: /*
169: * Use CommDlg to get the file name and then call LoadFile.
170: */
171:
172: if ( FileDlg( TRUE, SIZESTRING, szFileName.GetBuffer( SIZESTRING ),
173: SIZESTRING, szFileTitle.GetBuffer( SIZESTRING ) ) ) {
174:
175: szFileName.ReleaseBuffer();
176: szFileTitle.ReleaseBuffer();
177:
178: LoadFile(szFileName);
179: }
180:
181: return;
182: } /* CMainWindow::OnOpen() */
183:
184:
185: void CMainWindow::LoadFile(CString szFileName)
186: {
187: ifstream myFile;
188: char rgch[4000];
189: char rgch2[256];
190: char * pchDll;
191: char * pchFunction;
192: char * pch;
193: char * pchProgram;
194: int iDepth;
195: int iCalls;
196: int iThread;
197: TIMETYPE iTotalTime;
198: TIMETYPE iRoutineTime;
199: CListWnd * pListWnd;
200: CTREEWND * pTreeWnd;
201:
202: /*
203: * Now start processing the file
204: */
205:
206: myFile.open(szFileName );
207: if (!myFile.is_open()) {
208: _snprintf(rgch, sizeof(rgch), "Cannot open file '%s'", szFileName);
209: MessageBox(rgch);
210: return;
211: }
212:
213: /*
214: * Get the first line -- it tells us which file is being profiled
215: */
216:
217: myFile.getline( rgch, sizeof(rgch) );
218: if (strncmp(rgch, "Call Profile of ", 16) != 0) {
219: /*
220: * Message box -- not correct file formatter
221: */
222:
223: _snprintf(rgch, sizeof(rgch),
224: "The file '%s' is incorrectly formatted", szFileName);
225: MessageBox(rgch);
226: return;
227: }
228:
229: /*
230: * Capture the program name
231: */
232:
233: pchProgram = &rgch[16];
234: strtok(pchProgram, " ");
235: pchProgram = strdup(pchProgram);
236:
237: /*
238: * Process the rest of the file
239: */
240:
241: while (TRUE) {
242: /*
243: * When we can't get a line -- exit the loop
244: */
245:
246: myFile.getline( rgch, sizeof(rgch) );
247: if (!myFile.good()) {
248: break;
249: }
250:
251: /*
252: * Look for the first possible valid line
253: */
254:
255: if ((strncmp( rgch, "T h r e a d #", 14) == 0) ||
256: (strncmp( rgch, "S e c t i o n #", 16) == 0)) {
257: iThread = atoi(&rgch[14]);
258:
259: /*
260: * Get the List and Tree window to be used for this threads
261: * set of data.
262: */
263:
264: GetWindows(pchProgram, iThread, &pListWnd, &pTreeWnd);
265:
266: pListWnd->InitTiming();
267: pTreeWnd->InitTiming();
268:
269: /*
270: * Skip over the headers
271: */
272:
273: myFile.getline( rgch, sizeof(rgch) );
274: myFile.getline( rgch, sizeof(rgch) );
275: myFile.getline( rgch, sizeof(rgch) );
276:
277: /*
278: * Start processing each data line
279: */
280:
281: while (TRUE) {
282: myFile.getline( rgch, sizeof(rgch) );
283: pch = strtok(rgch, " \t\n");
284: if (pch == NULL) {
285: break;
286: }
287:
288: iDepth = atoi(pch);
289: pchDll = strtok(NULL, " \t:");
290: if (*pchDll == '*') {
291: pchDll = strtok(NULL, " \t:");
292: }
293: pchFunction = strtok(NULL, " \t");
294: iCalls = atoi(strtok(NULL, " \t"));
295: iTotalTime = strtok(NULL, " \t");
296: strtok(NULL, " \t");
297: iRoutineTime = strtok(NULL, " \t");
298:
299: /*
300: * Remove undeceration from function name
301: */
302:
303: if (UnDecorateSymbolName(pchFunction, rgch2, sizeof(rgch2),
304: UNDNAME_NO_FUNCTION_RETURNS |
305: UNDNAME_32_BIT_DECODE |
306: UNDNAME_NO_ACCESS_SPECIFIERS |
307: UNDNAME_NO_MS_KEYWORDS)) {
308: pchFunction = rgch2;
309: }
310:
311: pListWnd->AddTiming(iDepth, pchDll, pchFunction, iCalls,
312: iTotalTime, iRoutineTime);
313: pTreeWnd->AddTiming(iDepth, pchDll, pchFunction, iCalls,
314: iTotalTime, iRoutineTime);
315:
316: }
317:
318: /*
319: *
320: */
321:
322: pTreeWnd->EndTiming();
323: pTreeWnd->Invalidate();
324: pTreeWnd->SetScrollRange(SB_HORZ, 0, 100);
325: pTreeWnd->SetScrollRange(SB_VERT, 0, 100);
326: pTreeWnd->ShowWindow(SW_SHOW);
327:
328: /*
329: *
330: */
331:
332: pListWnd->EndTiming();
333: pListWnd->Invalidate();
334: }
335: }
336:
337: free(pchProgram);
338: return;
339: } /* CMainWindow::LoadFile() */
340:
341: //////////////////////////////////////////////////
342: // CMainWindow::FileDlg
343: // Call the commdlg routine to display File Open or File Save As
344: // dialogs. The setup is the same for either. If bOpen is TRUE
345: // then File Open is display otherwise File Save As is displayed.
346: // The File Name and File Title are stored at the string pointer
347: // passed in.
348: //
349: BOOL CMainWindow::FileDlg( BOOL bOpen, int nMaxFile, LPSTR szFile,
350: int nMaxFileTitle, LPSTR szFileTitle )
351: {
352: OPENFILENAME of;
353:
354: char szDirName[SIZESTRING];
355: char szFilter[] = "Cap input files (*.cap)\0"
356: "*.cap\0"
357: "Cap end files (*.end)\0"
358: "*.end\0"
359: "All files (*.*)\0"
360: "*.*\0"
361: "\0";
362:
363: szDirName[0] = '.';
364:
365: of.lStructSize = sizeof( OPENFILENAME );
366: of.hwndOwner = m_hWnd;
367: of.lpstrFilter = szFilter;
368: of.lpstrCustomFilter = NULL;
369: of.nMaxCustFilter = 0L;
370: of.nFilterIndex = 1L;
371: of.lpstrFile=szFile;
372: of.nMaxFile=nMaxFile;
373: of.lpstrFileTitle = szFileTitle;
374: of.nMaxFileTitle = nMaxFileTitle;
375: of.lpstrInitialDir = szDirName;
376: of.lpstrTitle = NULL;
377: of.nFileOffset = 0;
378: of.nFileExtension = 0;
379: of.lpstrDefExt = "pb";
380:
381: if ( bOpen ) {
382: of.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
383: return GetOpenFileName( &of );
384: } else {
385: of.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
386: return GetSaveFileName( &of );
387: }
388: } /* CMainWindow::FileDlg() */
389:
390: void CMainWindow::GetWindows(char * szProgram, int iThread,
391: CListWnd ** ppListWnd, CTREEWND ** ppTreeWnd)
392: {
393: char rgchKey[100];
394: char rgchTitle[100];
395: int count;
396: void * pv;
397:
398: *ppListWnd = new CListWnd;
399: *ppTreeWnd = new CTREEWND;
400:
401: _snprintf(rgchKey, sizeof(rgchKey), "%s Thread: %d",
402: szProgram, iThread);
403:
404: if (mapCInstance.Lookup(rgchKey, pv)) {
405: count = 1 + (int) pv;
406: mapCInstance[rgchKey] = (void *) count;
407: } else {
408: count = 1;
409: mapCInstance[rgchKey] = (void *) 1;
410: }
411:
412: _snprintf(rgchTitle, sizeof(rgchTitle), "Tree: %s <%d>", rgchKey, count);
413: if (!(*ppTreeWnd)->Create(rgchTitle, WS_HSCROLL | WS_VSCROLL,
414: rectDefault, this)) {
415: delete *ppTreeWnd;
416: *ppTreeWnd = NULL;
417: return;
418: }
419:
420: _snprintf(rgchTitle, sizeof(rgchTitle), "List: %s <%d>", rgchKey, count);
421:
422: if (!(*ppListWnd)->Create(rgchTitle, WS_VSCROLL, rectDefault,
423: this)) {
424: delete *ppListWnd;
425: *ppListWnd = NULL;
426: return;
427:
428: }
429: return;
430: } /* CMainWindow::GetWindows() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.