xref: /aoo4110/main/tools/source/debug/debug.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_tools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #define _TOOLS_DEBUG_CXX
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #if defined (UNX) || defined (GCC)
30*b1cdbd2cSJim Jagielski #include <unistd.h>
31*b1cdbd2cSJim Jagielski #else
32*b1cdbd2cSJim Jagielski #include <direct.h>
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <time.h>
36*b1cdbd2cSJim Jagielski #include <cstdarg>  // combinations
37*b1cdbd2cSJim Jagielski #include <stdlib.h>
38*b1cdbd2cSJim Jagielski #include <string.h>
39*b1cdbd2cSJim Jagielski #include <stdio.h>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #ifdef OS2
42*b1cdbd2cSJim Jagielski #define INCL_DOSSEMAPHORES
43*b1cdbd2cSJim Jagielski #define INCL_DOSMISC
44*b1cdbd2cSJim Jagielski #define INCL_WINDIALOGS
45*b1cdbd2cSJim Jagielski #define INCL_WINSHELLDATA
46*b1cdbd2cSJim Jagielski #include <svpm.h>
47*b1cdbd2cSJim Jagielski #endif
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #if defined ( WNT )
50*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
51*b1cdbd2cSJim Jagielski #pragma warning (push,1)
52*b1cdbd2cSJim Jagielski #endif
53*b1cdbd2cSJim Jagielski #include <tools/svwin.h>
54*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
55*b1cdbd2cSJim Jagielski #pragma warning (pop)
56*b1cdbd2cSJim Jagielski #endif
57*b1cdbd2cSJim Jagielski #endif
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
60*b1cdbd2cSJim Jagielski #include <rtl/string.h>
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski #include <vector>
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski // =======================================================================
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski // --- DbgErrors ---
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski static sal_Char const DbgError_ProfEnd1[]   = "DBG_PROF...() without DBG_PROFSTART(): ";
73*b1cdbd2cSJim Jagielski static sal_Char const DbgError_Xtor1[]      = "DBG_DTOR() or DBG_CHKTHIS() without DBG_CTOR(): ";
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski static sal_Char const DbgError_CtorDtor1[]  = "this == NULL in class ";
76*b1cdbd2cSJim Jagielski static sal_Char const DbgError_CtorDtor2[]  = "invalid this-Pointer %p in class ";
77*b1cdbd2cSJim Jagielski static sal_Char const DbgError_CtorDtor3[]  = "Error-Msg from Object %p in class ";
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_EnterCtor[]  = "Enter Ctor from class ";
80*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_LeaveCtor[]  = "Leave Ctor from class ";
81*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_EnterDtor[]  = "Enter Dtor from class ";
82*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_LeaveDtor[]  = "Leave Dtor from class ";
83*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_EnterMeth[]  = "Enter method from class ";
84*b1cdbd2cSJim Jagielski static sal_Char const DbgTrace_LeaveMeth[]  = "Leave method from class ";
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski // --- PointerList ---
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski #define PBLOCKCOUNT     1024
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski struct PBlock
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski     void*       aData[PBLOCKCOUNT];
93*b1cdbd2cSJim Jagielski     sal_uInt16      nCount;
94*b1cdbd2cSJim Jagielski     PBlock*     pPrev;
95*b1cdbd2cSJim Jagielski     PBlock*     pNext;
96*b1cdbd2cSJim Jagielski };
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski class PointerList
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski private:
101*b1cdbd2cSJim Jagielski     PBlock*     pFirst;
102*b1cdbd2cSJim Jagielski     PBlock*     pLast;
103*b1cdbd2cSJim Jagielski     sal_uIntPtr       nCount;
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski public:
PointerList()106*b1cdbd2cSJim Jagielski                 PointerList() { pFirst = NULL; pLast = NULL; nCount = 0; }
107*b1cdbd2cSJim Jagielski                 ~PointerList();
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     void        Add( const void* p );
110*b1cdbd2cSJim Jagielski     sal_Bool        Remove( const void* p );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski     const void* Get( sal_uIntPtr nPos ) const;
113*b1cdbd2cSJim Jagielski     sal_Bool        IsIn( const void* p ) const;
Count() const114*b1cdbd2cSJim Jagielski     sal_uIntPtr       Count() const { return nCount; }
115*b1cdbd2cSJim Jagielski };
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski // --- Datentypen ---
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski #define DBG_MAXNAME     28
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski struct ProfType
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nCount;
124*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nTime;
125*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nMinTime;
126*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nMaxTime;
127*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nStart;
128*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nContinueTime;
129*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nContinueStart;
130*b1cdbd2cSJim Jagielski     sal_Char                aName[DBG_MAXNAME+1];
131*b1cdbd2cSJim Jagielski };
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski struct XtorType
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nCtorCalls;
136*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nDtorCalls;
137*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nMaxCount;
138*b1cdbd2cSJim Jagielski     sal_uIntPtr                   nStatics;
139*b1cdbd2cSJim Jagielski     sal_Char                aName[DBG_MAXNAME+1];
140*b1cdbd2cSJim Jagielski     sal_Bool                    bTest;
141*b1cdbd2cSJim Jagielski     PointerList             aThisList;
142*b1cdbd2cSJim Jagielski };
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski struct DebugData
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski     DbgData                 aDbgData;
147*b1cdbd2cSJim Jagielski     sal_uInt16                  bInit;
148*b1cdbd2cSJim Jagielski     DbgPrintLine            pDbgPrintMsgBox;
149*b1cdbd2cSJim Jagielski     DbgPrintLine            pDbgPrintWindow;
150*b1cdbd2cSJim Jagielski     DbgPrintLine            pDbgPrintTestTool;
151*b1cdbd2cSJim Jagielski 	DbgPrintLine			pDbgAbort;
152*b1cdbd2cSJim Jagielski     ::std::vector< DbgPrintLine >
153*b1cdbd2cSJim Jagielski                             aDbgPrintUserChannels;
154*b1cdbd2cSJim Jagielski     PointerList*            pProfList;
155*b1cdbd2cSJim Jagielski     PointerList*            pXtorList;
156*b1cdbd2cSJim Jagielski     DbgTestSolarMutexProc   pDbgTestSolarMutex;
157*b1cdbd2cSJim Jagielski     pfunc_osl_printDetailedDebugMessage
158*b1cdbd2cSJim Jagielski                             pOldDebugMessageFunc;
159*b1cdbd2cSJim Jagielski     bool                    bOslIsHooked;
160*b1cdbd2cSJim Jagielski 
DebugDataDebugData161*b1cdbd2cSJim Jagielski     DebugData()
162*b1cdbd2cSJim Jagielski         :bInit( sal_False )
163*b1cdbd2cSJim Jagielski         ,pDbgPrintMsgBox( NULL )
164*b1cdbd2cSJim Jagielski         ,pDbgPrintWindow( NULL )
165*b1cdbd2cSJim Jagielski         ,pDbgPrintTestTool( NULL )
166*b1cdbd2cSJim Jagielski 		,pDbgAbort( NULL )
167*b1cdbd2cSJim Jagielski         ,pProfList( NULL )
168*b1cdbd2cSJim Jagielski         ,pXtorList( NULL )
169*b1cdbd2cSJim Jagielski         ,pDbgTestSolarMutex( NULL )
170*b1cdbd2cSJim Jagielski         ,pOldDebugMessageFunc( NULL )
171*b1cdbd2cSJim Jagielski         ,bOslIsHooked( false )
172*b1cdbd2cSJim Jagielski     {
173*b1cdbd2cSJim Jagielski         aDbgData.nTestFlags = DBG_TEST_RESOURCE | DBG_TEST_MEM_INIT;
174*b1cdbd2cSJim Jagielski         aDbgData.bOverwrite = sal_True;
175*b1cdbd2cSJim Jagielski         aDbgData.nTraceOut = DBG_OUT_NULL;
176*b1cdbd2cSJim Jagielski         aDbgData.nWarningOut = DBG_OUT_NULL;
177*b1cdbd2cSJim Jagielski         aDbgData.nErrorOut = DBG_OUT_MSGBOX;
178*b1cdbd2cSJim Jagielski         aDbgData.bMemInit = 0x77;
179*b1cdbd2cSJim Jagielski         aDbgData.bMemBound = 0x55;
180*b1cdbd2cSJim Jagielski         aDbgData.bMemFree = 0x33;
181*b1cdbd2cSJim Jagielski         aDbgData.bHookOSLAssert = sal_True;
182*b1cdbd2cSJim Jagielski         aDbgData.aDebugName[0] = 0;
183*b1cdbd2cSJim Jagielski         aDbgData.aInclFilter[0] = 0;
184*b1cdbd2cSJim Jagielski         aDbgData.aExclFilter[0] = 0;
185*b1cdbd2cSJim Jagielski         aDbgData.aInclClassFilter[0] = 0;
186*b1cdbd2cSJim Jagielski         aDbgData.aExclClassFilter[0] = 0;
187*b1cdbd2cSJim Jagielski         aDbgData.aDbgWinState[0] = 0;
188*b1cdbd2cSJim Jagielski     }
189*b1cdbd2cSJim Jagielski };
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski #define DBG_TEST_XTOR_EXTRA (DBG_TEST_XTOR_THIS |  DBG_TEST_XTOR_FUNC |               \
192*b1cdbd2cSJim Jagielski                              DBG_TEST_XTOR_EXIT |  DBG_TEST_XTOR_REPORT )
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski // ------------------------------
195*b1cdbd2cSJim Jagielski // - statische Verwaltungsdaten -
196*b1cdbd2cSJim Jagielski // ------------------------------
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski static DebugData aDebugData;
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski static sal_Char aCurPath[260];
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski static int bDbgImplInMain = sal_False;
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski // =======================================================================
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski #if defined( WNT )
207*b1cdbd2cSJim Jagielski static CRITICAL_SECTION aImplCritDbgSection;
208*b1cdbd2cSJim Jagielski #elif defined( OS2 )
209*b1cdbd2cSJim Jagielski static HMTX             hImplCritDbgSection = 0;
210*b1cdbd2cSJim Jagielski #endif
211*b1cdbd2cSJim Jagielski static sal_Bool             bImplCritDbgSectionInit = sal_False;
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
214*b1cdbd2cSJim Jagielski 
ImplDbgInitLock()215*b1cdbd2cSJim Jagielski void ImplDbgInitLock()
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski #if defined( WNT )
218*b1cdbd2cSJim Jagielski     InitializeCriticalSection( &aImplCritDbgSection );
219*b1cdbd2cSJim Jagielski #elif defined( OS2 )
220*b1cdbd2cSJim Jagielski     DosCreateMutexSem( NULL, &hImplCritDbgSection, 0, sal_False );
221*b1cdbd2cSJim Jagielski #endif
222*b1cdbd2cSJim Jagielski     bImplCritDbgSectionInit = sal_True;
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
226*b1cdbd2cSJim Jagielski 
ImplDbgDeInitLock()227*b1cdbd2cSJim Jagielski void ImplDbgDeInitLock()
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski #if defined( WNT )
230*b1cdbd2cSJim Jagielski     DeleteCriticalSection( &aImplCritDbgSection );
231*b1cdbd2cSJim Jagielski #elif defined( OS2 )
232*b1cdbd2cSJim Jagielski     DosCloseMutexSem( hImplCritDbgSection );
233*b1cdbd2cSJim Jagielski #endif
234*b1cdbd2cSJim Jagielski     bImplCritDbgSectionInit = sal_False;
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
238*b1cdbd2cSJim Jagielski 
ImplDbgLock()239*b1cdbd2cSJim Jagielski void ImplDbgLock()
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski     if ( !bImplCritDbgSectionInit )
242*b1cdbd2cSJim Jagielski         return;
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski #if defined( WNT )
245*b1cdbd2cSJim Jagielski     EnterCriticalSection( &aImplCritDbgSection );
246*b1cdbd2cSJim Jagielski #elif defined( OS2 )
247*b1cdbd2cSJim Jagielski     DosRequestMutexSem( hImplCritDbgSection, SEM_INDEFINITE_WAIT );
248*b1cdbd2cSJim Jagielski #endif
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
252*b1cdbd2cSJim Jagielski 
ImplDbgUnlock()253*b1cdbd2cSJim Jagielski void ImplDbgUnlock()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     if ( !bImplCritDbgSectionInit )
256*b1cdbd2cSJim Jagielski         return;
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski #if defined( WNT )
259*b1cdbd2cSJim Jagielski     LeaveCriticalSection( &aImplCritDbgSection );
260*b1cdbd2cSJim Jagielski #elif defined( OS2 )
261*b1cdbd2cSJim Jagielski     DosReleaseMutexSem( hImplCritDbgSection );
262*b1cdbd2cSJim Jagielski #endif
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski // =======================================================================
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski #if (defined WNT || defined OS2) && !defined SVX_LIGHT
268*b1cdbd2cSJim Jagielski //#define SV_MEMMGR //
269*b1cdbd2cSJim Jagielski #endif
270*b1cdbd2cSJim Jagielski #ifdef SV_MEMMGR
271*b1cdbd2cSJim Jagielski void DbgImpCheckMemory( void* p = NULL );
272*b1cdbd2cSJim Jagielski void DbgImpCheckMemoryDeInit();
273*b1cdbd2cSJim Jagielski void DbgImpMemoryInfo( sal_Char* pBuf );
274*b1cdbd2cSJim Jagielski #endif
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski #define FILE_LINEEND    "\n"
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski // =======================================================================
279*b1cdbd2cSJim Jagielski 
ImplActivateDebugger(const sal_Char * pMsg)280*b1cdbd2cSJim Jagielski static sal_Bool ImplActivateDebugger( const sal_Char* pMsg )
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski #if defined( WNT )
283*b1cdbd2cSJim Jagielski     static sal_Char aImplDbgOutBuf[DBG_BUF_MAXLEN];
284*b1cdbd2cSJim Jagielski     strcpy( aImplDbgOutBuf, pMsg );
285*b1cdbd2cSJim Jagielski     strcat( aImplDbgOutBuf, "\r\n" );
286*b1cdbd2cSJim Jagielski     OutputDebugString( aImplDbgOutBuf );
287*b1cdbd2cSJim Jagielski     DebugBreak();
288*b1cdbd2cSJim Jagielski     return sal_True;
289*b1cdbd2cSJim Jagielski #else
290*b1cdbd2cSJim Jagielski     (void) pMsg; // avoid warning about unused parameter
291*b1cdbd2cSJim Jagielski     return sal_False;
292*b1cdbd2cSJim Jagielski #endif
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
296*b1cdbd2cSJim Jagielski 
ImplCoreDump()297*b1cdbd2cSJim Jagielski static sal_Bool ImplCoreDump()
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski #if defined( WNT )
300*b1cdbd2cSJim Jagielski     DebugBreak();
301*b1cdbd2cSJim Jagielski #else
302*b1cdbd2cSJim Jagielski     long* pTemp = 0;
303*b1cdbd2cSJim Jagielski     *pTemp = 0xCCCC;
304*b1cdbd2cSJim Jagielski #endif
305*b1cdbd2cSJim Jagielski     return sal_True;
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski // =======================================================================
309*b1cdbd2cSJim Jagielski 
ImplGetPerfTime()310*b1cdbd2cSJim Jagielski static sal_uIntPtr ImplGetPerfTime()
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski #if defined( WNT )
313*b1cdbd2cSJim Jagielski     return (sal_uIntPtr)GetTickCount();
314*b1cdbd2cSJim Jagielski #elif defined( OS2 )
315*b1cdbd2cSJim Jagielski     sal_uIntPtr nClock;
316*b1cdbd2cSJim Jagielski     DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, &nClock, sizeof( nClock ) );
317*b1cdbd2cSJim Jagielski     return (sal_uIntPtr)nClock;
318*b1cdbd2cSJim Jagielski #else
319*b1cdbd2cSJim Jagielski     static sal_uIntPtr    nImplTicksPerSecond = 0;
320*b1cdbd2cSJim Jagielski     static double   dImplTicksPerSecond;
321*b1cdbd2cSJim Jagielski     sal_uIntPtr           nTicks = (sal_uIntPtr)clock();
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski     if ( !nImplTicksPerSecond )
324*b1cdbd2cSJim Jagielski     {
325*b1cdbd2cSJim Jagielski         nImplTicksPerSecond = CLOCKS_PER_SEC;
326*b1cdbd2cSJim Jagielski         dImplTicksPerSecond = nImplTicksPerSecond;
327*b1cdbd2cSJim Jagielski     }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski     double fTicks = nTicks;
330*b1cdbd2cSJim Jagielski     fTicks *= 1000;
331*b1cdbd2cSJim Jagielski     fTicks /= dImplTicksPerSecond;
332*b1cdbd2cSJim Jagielski     return (sal_uIntPtr)fTicks;
333*b1cdbd2cSJim Jagielski #endif
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski typedef FILE*       FILETYPE;
339*b1cdbd2cSJim Jagielski #define FileOpen    fopen
340*b1cdbd2cSJim Jagielski #define FileRead    fread
341*b1cdbd2cSJim Jagielski #define FileWrite   fwrite
342*b1cdbd2cSJim Jagielski #define FilePrintF  fprintf
343*b1cdbd2cSJim Jagielski #define FileClose   fclose
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski // =======================================================================
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski namespace
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski     enum ConfigSection
350*b1cdbd2cSJim Jagielski     {
351*b1cdbd2cSJim Jagielski         eOutput,
352*b1cdbd2cSJim Jagielski         eMemory,
353*b1cdbd2cSJim Jagielski         eGUI,
354*b1cdbd2cSJim Jagielski         eObjects,
355*b1cdbd2cSJim Jagielski         eTest,
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski         eUnknown
358*b1cdbd2cSJim Jagielski     };
359*b1cdbd2cSJim Jagielski 
lcl_lineFeed(FILETYPE _pFile)360*b1cdbd2cSJim Jagielski     void lcl_lineFeed( FILETYPE _pFile )
361*b1cdbd2cSJim Jagielski     {
362*b1cdbd2cSJim Jagielski         FilePrintF( _pFile, "%s", FILE_LINEEND );
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski 
lcl_getSectionName(ConfigSection _eSection)365*b1cdbd2cSJim Jagielski     const sal_Char* lcl_getSectionName( ConfigSection _eSection )
366*b1cdbd2cSJim Jagielski     {
367*b1cdbd2cSJim Jagielski         const sal_Char* pSectionName = NULL;
368*b1cdbd2cSJim Jagielski         switch ( _eSection )
369*b1cdbd2cSJim Jagielski         {
370*b1cdbd2cSJim Jagielski             case eOutput    : pSectionName = "output";  break;
371*b1cdbd2cSJim Jagielski             case eMemory    : pSectionName = "memory";  break;
372*b1cdbd2cSJim Jagielski             case eGUI       : pSectionName = "gui";     break;
373*b1cdbd2cSJim Jagielski             case eObjects   : pSectionName = "objects"; break;
374*b1cdbd2cSJim Jagielski             case eTest      : pSectionName = "test";    break;
375*b1cdbd2cSJim Jagielski             case eUnknown:
376*b1cdbd2cSJim Jagielski                 OSL_ASSERT(false);
377*b1cdbd2cSJim Jagielski                 break;
378*b1cdbd2cSJim Jagielski         }
379*b1cdbd2cSJim Jagielski         return pSectionName;
380*b1cdbd2cSJim Jagielski     }
381*b1cdbd2cSJim Jagielski 
lcl_getSectionFromName(const sal_Char * _pSectionName,size_t _nSectionNameLength)382*b1cdbd2cSJim Jagielski     ConfigSection lcl_getSectionFromName( const sal_Char* _pSectionName, size_t _nSectionNameLength )
383*b1cdbd2cSJim Jagielski     {
384*b1cdbd2cSJim Jagielski         if ( strncmp( _pSectionName, "output",  _nSectionNameLength < 6 ? _nSectionNameLength : 6 ) == 0 )
385*b1cdbd2cSJim Jagielski             return eOutput;
386*b1cdbd2cSJim Jagielski         if ( strncmp( _pSectionName, "memory",  _nSectionNameLength < 6 ? _nSectionNameLength : 6 ) == 0 )
387*b1cdbd2cSJim Jagielski             return eMemory;
388*b1cdbd2cSJim Jagielski         if ( strncmp( _pSectionName, "gui",     _nSectionNameLength < 3 ? _nSectionNameLength : 3 ) == 0 )
389*b1cdbd2cSJim Jagielski             return eGUI;
390*b1cdbd2cSJim Jagielski         if ( strncmp( _pSectionName, "objects", _nSectionNameLength < 7 ? _nSectionNameLength : 7 ) == 0 )
391*b1cdbd2cSJim Jagielski             return eObjects;
392*b1cdbd2cSJim Jagielski         if ( strncmp( _pSectionName, "test",    _nSectionNameLength < 4 ? _nSectionNameLength : 4 ) == 0 )
393*b1cdbd2cSJim Jagielski             return eTest;
394*b1cdbd2cSJim Jagielski         return eUnknown;
395*b1cdbd2cSJim Jagielski     }
396*b1cdbd2cSJim Jagielski 
lcl_startSection(FILETYPE _pFile,ConfigSection _eSection)397*b1cdbd2cSJim Jagielski     void lcl_startSection( FILETYPE _pFile, ConfigSection _eSection )
398*b1cdbd2cSJim Jagielski     {
399*b1cdbd2cSJim Jagielski         FilePrintF( _pFile, "[%s]%s", lcl_getSectionName( _eSection ), FILE_LINEEND );
400*b1cdbd2cSJim Jagielski     }
401*b1cdbd2cSJim Jagielski 
lcl_writeConfigString(FILETYPE _pFile,const sal_Char * _pKeyName,const sal_Char * _pValue)402*b1cdbd2cSJim Jagielski     void lcl_writeConfigString( FILETYPE _pFile, const sal_Char* _pKeyName, const sal_Char* _pValue )
403*b1cdbd2cSJim Jagielski     {
404*b1cdbd2cSJim Jagielski         FilePrintF( _pFile, "%s=%s%s", _pKeyName, _pValue, FILE_LINEEND );
405*b1cdbd2cSJim Jagielski     }
406*b1cdbd2cSJim Jagielski 
lcl_writeConfigBoolean(FILETYPE _pFile,const sal_Char * _pKeyName,bool _bValue)407*b1cdbd2cSJim Jagielski     void lcl_writeConfigBoolean( FILETYPE _pFile, const sal_Char* _pKeyName, bool _bValue )
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         lcl_writeConfigString( _pFile, _pKeyName, _bValue ? "1" : "0" );
410*b1cdbd2cSJim Jagielski     }
411*b1cdbd2cSJim Jagielski 
lcl_writeConfigFlag(FILETYPE _pFile,const sal_Char * _pKeyName,sal_uIntPtr _nAllFlags,sal_uIntPtr _nCheckFlag)412*b1cdbd2cSJim Jagielski     void lcl_writeConfigFlag( FILETYPE _pFile, const sal_Char* _pKeyName, sal_uIntPtr _nAllFlags, sal_uIntPtr _nCheckFlag )
413*b1cdbd2cSJim Jagielski     {
414*b1cdbd2cSJim Jagielski         lcl_writeConfigBoolean( _pFile, _pKeyName, ( _nAllFlags & _nCheckFlag ) != 0 );
415*b1cdbd2cSJim Jagielski     }
416*b1cdbd2cSJim Jagielski 
lcl_writeConfigOutChannel(FILETYPE _pFile,const sal_Char * _pKeyName,sal_uIntPtr _nValue)417*b1cdbd2cSJim Jagielski     void lcl_writeConfigOutChannel( FILETYPE _pFile, const sal_Char* _pKeyName, sal_uIntPtr _nValue )
418*b1cdbd2cSJim Jagielski     {
419*b1cdbd2cSJim Jagielski         const sal_Char* names[ DBG_OUT_COUNT ] =
420*b1cdbd2cSJim Jagielski         {
421*b1cdbd2cSJim Jagielski             "dev/null", "file", "window", "shell", "messagebox", "testtool", "debugger", "abort"
422*b1cdbd2cSJim Jagielski         };
423*b1cdbd2cSJim Jagielski         lcl_writeConfigString( _pFile, _pKeyName, names[ _nValue ] );
424*b1cdbd2cSJim Jagielski     }
lcl_writeHexByte(FILETYPE _pFile,const sal_Char * _pKeyName,sal_uInt8 _nValue)425*b1cdbd2cSJim Jagielski     void lcl_writeHexByte( FILETYPE _pFile, const sal_Char* _pKeyName, sal_uInt8 _nValue )
426*b1cdbd2cSJim Jagielski     {
427*b1cdbd2cSJim Jagielski         sal_Char buf[RTL_STR_MAX_VALUEOFINT32];
428*b1cdbd2cSJim Jagielski         rtl_String* stringData = NULL;
429*b1cdbd2cSJim Jagielski         rtl_string_newFromStr_WithLength( &stringData, buf, rtl_str_valueOfInt32( buf, _nValue, 16 ) );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski         lcl_writeConfigString( _pFile, _pKeyName, stringData->buffer );
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski         rtl_string_release( stringData );
434*b1cdbd2cSJim Jagielski     }
lcl_isConfigSection(const sal_Char * _pLine,size_t _nLineLen)435*b1cdbd2cSJim Jagielski     bool lcl_isConfigSection( const sal_Char* _pLine, size_t _nLineLen )
436*b1cdbd2cSJim Jagielski     {
437*b1cdbd2cSJim Jagielski         if ( _nLineLen < 2 )
438*b1cdbd2cSJim Jagielski             // not even enough space for '[' and ']'
439*b1cdbd2cSJim Jagielski             return false;
440*b1cdbd2cSJim Jagielski         if ( ( _pLine[0] == '[' ) && ( _pLine[ _nLineLen - 1 ] == ']' ) )
441*b1cdbd2cSJim Jagielski             return true;
442*b1cdbd2cSJim Jagielski         return false;
443*b1cdbd2cSJim Jagielski     }
lcl_isConfigKey(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName)444*b1cdbd2cSJim Jagielski     bool lcl_isConfigKey( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName )
445*b1cdbd2cSJim Jagielski     {
446*b1cdbd2cSJim Jagielski         size_t nKeyLength = strlen( _pKeyName );
447*b1cdbd2cSJim Jagielski         if ( nKeyLength + 1 >= _nLineLen )
448*b1cdbd2cSJim Jagielski             // not even long enough for the key name plus "=" plus a one-character value
449*b1cdbd2cSJim Jagielski             return false;
450*b1cdbd2cSJim Jagielski         if ( ( strncmp( _pLine, _pKeyName, nKeyLength ) == 0 ) && ( _pLine[ nKeyLength ] == '=' ) )
451*b1cdbd2cSJim Jagielski             return true;
452*b1cdbd2cSJim Jagielski         return false;
453*b1cdbd2cSJim Jagielski     }
lcl_tryReadConfigString(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName,sal_Char * _pValue,size_t _nValueLen)454*b1cdbd2cSJim Jagielski     sal_Int32 lcl_tryReadConfigString( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName, sal_Char* _pValue, size_t _nValueLen )
455*b1cdbd2cSJim Jagielski     {
456*b1cdbd2cSJim Jagielski         if ( !lcl_isConfigKey( _pLine, _nLineLen, _pKeyName ) )
457*b1cdbd2cSJim Jagielski             return 0;
458*b1cdbd2cSJim Jagielski         size_t nValuePos = strlen( _pKeyName ) + 1;
459*b1cdbd2cSJim Jagielski         size_t nValueLen = _nLineLen - nValuePos;
460*b1cdbd2cSJim Jagielski         const sal_Char* pValue = _pLine + nValuePos;
461*b1cdbd2cSJim Jagielski         strncpy( _pValue, pValue, ( _nValueLen > nValueLen ) ? nValueLen : _nValueLen );
462*b1cdbd2cSJim Jagielski         _pValue[ ( _nValueLen > nValueLen ) ? nValueLen : _nValueLen - 1 ] = 0;
463*b1cdbd2cSJim Jagielski         return strlen( _pValue );
464*b1cdbd2cSJim Jagielski     }
lcl_tryReadConfigBoolean(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName,sal_uIntPtr * _out_pnValue)465*b1cdbd2cSJim Jagielski     void lcl_tryReadConfigBoolean( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName, sal_uIntPtr* _out_pnValue )
466*b1cdbd2cSJim Jagielski     {
467*b1cdbd2cSJim Jagielski         sal_Char aBuf[2];
468*b1cdbd2cSJim Jagielski         size_t nValueLen = lcl_tryReadConfigString( _pLine, _nLineLen, _pKeyName, aBuf, sizeof( aBuf ) );
469*b1cdbd2cSJim Jagielski         if ( nValueLen )
470*b1cdbd2cSJim Jagielski             *_out_pnValue = strcmp( aBuf, "1" ) == 0 ? sal_True : sal_False;
471*b1cdbd2cSJim Jagielski     }
lcl_matchOutputChannel(sal_Char const * i_buffer,sal_uIntPtr * o_value)472*b1cdbd2cSJim Jagielski     void lcl_matchOutputChannel( sal_Char const * i_buffer, sal_uIntPtr* o_value )
473*b1cdbd2cSJim Jagielski     {
474*b1cdbd2cSJim Jagielski         if ( i_buffer == NULL )
475*b1cdbd2cSJim Jagielski             return;
476*b1cdbd2cSJim Jagielski         const sal_Char* names[ DBG_OUT_COUNT ] =
477*b1cdbd2cSJim Jagielski         {
478*b1cdbd2cSJim Jagielski             "dev/null", "file", "window", "shell", "messagebox", "testtool", "debugger", "abort"
479*b1cdbd2cSJim Jagielski         };
480*b1cdbd2cSJim Jagielski         for ( sal_uIntPtr name = 0; name < sizeof( names ) / sizeof( names[0] ); ++name )
481*b1cdbd2cSJim Jagielski         {
482*b1cdbd2cSJim Jagielski             if ( strcmp( i_buffer, names[ name ] ) == 0 )
483*b1cdbd2cSJim Jagielski             {
484*b1cdbd2cSJim Jagielski                 *o_value = name;
485*b1cdbd2cSJim Jagielski                 return;
486*b1cdbd2cSJim Jagielski             }
487*b1cdbd2cSJim Jagielski         }
488*b1cdbd2cSJim Jagielski     }
lcl_tryReadOutputChannel(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName,sal_uIntPtr * _out_pnValue)489*b1cdbd2cSJim Jagielski     void lcl_tryReadOutputChannel( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName, sal_uIntPtr* _out_pnValue )
490*b1cdbd2cSJim Jagielski     {
491*b1cdbd2cSJim Jagielski         sal_Char aBuf[20];
492*b1cdbd2cSJim Jagielski         size_t nValueLen = lcl_tryReadConfigString( _pLine, _nLineLen, _pKeyName, aBuf, sizeof( aBuf ) );
493*b1cdbd2cSJim Jagielski         if ( nValueLen )
494*b1cdbd2cSJim Jagielski             lcl_matchOutputChannel( aBuf, _out_pnValue );
495*b1cdbd2cSJim Jagielski     }
lcl_tryReadConfigFlag(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName,sal_uIntPtr * _out_pnAllFlags,sal_uIntPtr _nCheckFlag)496*b1cdbd2cSJim Jagielski     void lcl_tryReadConfigFlag( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName, sal_uIntPtr* _out_pnAllFlags, sal_uIntPtr _nCheckFlag )
497*b1cdbd2cSJim Jagielski     {
498*b1cdbd2cSJim Jagielski         sal_Char aBuf[2];
499*b1cdbd2cSJim Jagielski         size_t nValueLen = lcl_tryReadConfigString( _pLine, _nLineLen, _pKeyName, aBuf, sizeof( aBuf ) );
500*b1cdbd2cSJim Jagielski         if ( nValueLen )
501*b1cdbd2cSJim Jagielski             if ( strcmp( aBuf, "1" ) == 0 )
502*b1cdbd2cSJim Jagielski                 *_out_pnAllFlags |= _nCheckFlag;
503*b1cdbd2cSJim Jagielski             else
504*b1cdbd2cSJim Jagielski                 *_out_pnAllFlags &= ~_nCheckFlag;
505*b1cdbd2cSJim Jagielski     }
lcl_tryReadHexByte(const sal_Char * _pLine,size_t _nLineLen,const sal_Char * _pKeyName,sal_uInt8 * _out_pnValue)506*b1cdbd2cSJim Jagielski     void lcl_tryReadHexByte( const sal_Char* _pLine, size_t _nLineLen, const sal_Char* _pKeyName, sal_uInt8* _out_pnValue )
507*b1cdbd2cSJim Jagielski     {
508*b1cdbd2cSJim Jagielski         sal_Char aBuf[3];
509*b1cdbd2cSJim Jagielski         size_t nValueLen = lcl_tryReadConfigString( _pLine, _nLineLen, _pKeyName, aBuf, sizeof( aBuf ) );
510*b1cdbd2cSJim Jagielski         if ( nValueLen )
511*b1cdbd2cSJim Jagielski             *_out_pnValue = (sal_uInt8)rtl_str_toInt32( aBuf, 16 );
512*b1cdbd2cSJim Jagielski     }
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski // =======================================================================
516*b1cdbd2cSJim Jagielski 
~PointerList()517*b1cdbd2cSJim Jagielski PointerList::~PointerList()
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski     PBlock* pBlock = pFirst;
520*b1cdbd2cSJim Jagielski     while ( pBlock )
521*b1cdbd2cSJim Jagielski     {
522*b1cdbd2cSJim Jagielski         PBlock* pNextBlock = pBlock->pNext;
523*b1cdbd2cSJim Jagielski         delete pBlock;
524*b1cdbd2cSJim Jagielski         pBlock = pNextBlock;
525*b1cdbd2cSJim Jagielski     }
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
529*b1cdbd2cSJim Jagielski 
Add(const void * p)530*b1cdbd2cSJim Jagielski void PointerList::Add( const void* p )
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski     if ( !pFirst )
533*b1cdbd2cSJim Jagielski     {
534*b1cdbd2cSJim Jagielski         pFirst = new PBlock;
535*b1cdbd2cSJim Jagielski         memset( pFirst->aData, 0, PBLOCKCOUNT * sizeof( void* ) );
536*b1cdbd2cSJim Jagielski         pFirst->nCount = 0;
537*b1cdbd2cSJim Jagielski         pFirst->pPrev  = NULL;
538*b1cdbd2cSJim Jagielski         pFirst->pNext  = NULL;
539*b1cdbd2cSJim Jagielski         pLast = pFirst;
540*b1cdbd2cSJim Jagielski     }
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski     PBlock* pBlock = pFirst;
543*b1cdbd2cSJim Jagielski     while ( pBlock && (pBlock->nCount == PBLOCKCOUNT) )
544*b1cdbd2cSJim Jagielski         pBlock = pBlock->pNext;
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski     if ( !pBlock )
547*b1cdbd2cSJim Jagielski     {
548*b1cdbd2cSJim Jagielski         pBlock = new PBlock;
549*b1cdbd2cSJim Jagielski         memset( pBlock->aData, 0, PBLOCKCOUNT * sizeof( void* ) );
550*b1cdbd2cSJim Jagielski         pBlock->nCount = 0;
551*b1cdbd2cSJim Jagielski         pBlock->pPrev  = pLast;
552*b1cdbd2cSJim Jagielski         pBlock->pNext  = NULL;
553*b1cdbd2cSJim Jagielski         pLast->pNext   = pBlock;
554*b1cdbd2cSJim Jagielski         pLast          = pBlock;
555*b1cdbd2cSJim Jagielski     }
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     sal_uInt16 i = 0;
558*b1cdbd2cSJim Jagielski     while ( pBlock->aData[i] )
559*b1cdbd2cSJim Jagielski         i++;
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski     pBlock->aData[i] = (void*)p;
562*b1cdbd2cSJim Jagielski     pBlock->nCount++;
563*b1cdbd2cSJim Jagielski     nCount++;
564*b1cdbd2cSJim Jagielski }
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
567*b1cdbd2cSJim Jagielski 
Remove(const void * p)568*b1cdbd2cSJim Jagielski sal_Bool PointerList::Remove( const void* p )
569*b1cdbd2cSJim Jagielski {
570*b1cdbd2cSJim Jagielski     if ( !p )
571*b1cdbd2cSJim Jagielski        return sal_False;
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski     PBlock* pBlock = pFirst;
574*b1cdbd2cSJim Jagielski     while ( pBlock )
575*b1cdbd2cSJim Jagielski     {
576*b1cdbd2cSJim Jagielski         sal_uInt16 i = 0;
577*b1cdbd2cSJim Jagielski         while ( i < PBLOCKCOUNT )
578*b1cdbd2cSJim Jagielski         {
579*b1cdbd2cSJim Jagielski             if ( ((sal_uIntPtr)p) == ((sal_uIntPtr)pBlock->aData[i]) )
580*b1cdbd2cSJim Jagielski             {
581*b1cdbd2cSJim Jagielski                 pBlock->aData[i] = NULL;
582*b1cdbd2cSJim Jagielski                 pBlock->nCount--;
583*b1cdbd2cSJim Jagielski                 nCount--;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski                 if ( !pBlock->nCount )
586*b1cdbd2cSJim Jagielski                 {
587*b1cdbd2cSJim Jagielski                     if ( pBlock->pPrev )
588*b1cdbd2cSJim Jagielski                         pBlock->pPrev->pNext = pBlock->pNext;
589*b1cdbd2cSJim Jagielski                     if ( pBlock->pNext )
590*b1cdbd2cSJim Jagielski                         pBlock->pNext->pPrev = pBlock->pPrev;
591*b1cdbd2cSJim Jagielski                     if ( pBlock == pFirst )
592*b1cdbd2cSJim Jagielski                         pFirst = pBlock->pNext;
593*b1cdbd2cSJim Jagielski                     if ( pBlock == pLast )
594*b1cdbd2cSJim Jagielski                         pLast = pBlock->pPrev;
595*b1cdbd2cSJim Jagielski                     delete pBlock;
596*b1cdbd2cSJim Jagielski                 }
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski                 return sal_True;
599*b1cdbd2cSJim Jagielski             }
600*b1cdbd2cSJim Jagielski             i++;
601*b1cdbd2cSJim Jagielski         }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski         pBlock = pBlock->pNext;
604*b1cdbd2cSJim Jagielski     }
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski     return sal_False;
607*b1cdbd2cSJim Jagielski }
608*b1cdbd2cSJim Jagielski 
609*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
610*b1cdbd2cSJim Jagielski 
Get(sal_uIntPtr nPos) const611*b1cdbd2cSJim Jagielski const void* PointerList::Get( sal_uIntPtr nPos ) const
612*b1cdbd2cSJim Jagielski {
613*b1cdbd2cSJim Jagielski     if ( nCount <= nPos )
614*b1cdbd2cSJim Jagielski         return NULL;
615*b1cdbd2cSJim Jagielski 
616*b1cdbd2cSJim Jagielski     PBlock* pBlock = pFirst;
617*b1cdbd2cSJim Jagielski     sal_uIntPtr   nStart = 0;
618*b1cdbd2cSJim Jagielski     while ( pBlock )
619*b1cdbd2cSJim Jagielski     {
620*b1cdbd2cSJim Jagielski         sal_uInt16 i = 0;
621*b1cdbd2cSJim Jagielski         while ( i < PBLOCKCOUNT )
622*b1cdbd2cSJim Jagielski         {
623*b1cdbd2cSJim Jagielski             if ( pBlock->aData[i] )
624*b1cdbd2cSJim Jagielski             {
625*b1cdbd2cSJim Jagielski                 nStart++;
626*b1cdbd2cSJim Jagielski                 if ( (nStart-1) == nPos )
627*b1cdbd2cSJim Jagielski                     return pBlock->aData[i];
628*b1cdbd2cSJim Jagielski             }
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski             i++;
631*b1cdbd2cSJim Jagielski         }
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski         pBlock = pBlock->pNext;
634*b1cdbd2cSJim Jagielski     }
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski     return NULL;
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
640*b1cdbd2cSJim Jagielski 
IsIn(const void * p) const641*b1cdbd2cSJim Jagielski sal_Bool PointerList::IsIn( const void* p ) const
642*b1cdbd2cSJim Jagielski {
643*b1cdbd2cSJim Jagielski     if ( !p )
644*b1cdbd2cSJim Jagielski        return sal_False;
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski     PBlock* pBlock = pFirst;
647*b1cdbd2cSJim Jagielski     while ( pBlock )
648*b1cdbd2cSJim Jagielski     {
649*b1cdbd2cSJim Jagielski         sal_uInt16 i = 0;
650*b1cdbd2cSJim Jagielski         while ( i < PBLOCKCOUNT )
651*b1cdbd2cSJim Jagielski         {
652*b1cdbd2cSJim Jagielski             if ( ((sal_uIntPtr)p) == ((sal_uIntPtr)pBlock->aData[i]) )
653*b1cdbd2cSJim Jagielski                 return sal_True;
654*b1cdbd2cSJim Jagielski             i++;
655*b1cdbd2cSJim Jagielski         }
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski         pBlock = pBlock->pNext;
658*b1cdbd2cSJim Jagielski     }
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski     return sal_False;
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski // =======================================================================
665*b1cdbd2cSJim Jagielski 
DbgGetDbgFileName(sal_Char * pStr,sal_Int32 nMaxLen)666*b1cdbd2cSJim Jagielski static void DbgGetDbgFileName( sal_Char* pStr, sal_Int32 nMaxLen )
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski #if defined( UNX )
669*b1cdbd2cSJim Jagielski     const sal_Char* pName = getenv("DBGSV_INIT");
670*b1cdbd2cSJim Jagielski     if ( !pName )
671*b1cdbd2cSJim Jagielski         pName = ".dbgsv.init";
672*b1cdbd2cSJim Jagielski     strncpy( pStr, pName, nMaxLen );
673*b1cdbd2cSJim Jagielski #elif defined( WNT )
674*b1cdbd2cSJim Jagielski     const sal_Char* pName = getenv("DBGSV_INIT");
675*b1cdbd2cSJim Jagielski     if ( pName )
676*b1cdbd2cSJim Jagielski         strncpy( pStr, pName, nMaxLen );
677*b1cdbd2cSJim Jagielski     else
678*b1cdbd2cSJim Jagielski         GetProfileStringA( "sv", "dbgsv", "dbgsv.ini", pStr, nMaxLen );
679*b1cdbd2cSJim Jagielski #elif defined( OS2 )
680*b1cdbd2cSJim Jagielski     PrfQueryProfileString( HINI_PROFILE, (PSZ)"SV", (PSZ)"DBGSV",
681*b1cdbd2cSJim Jagielski                            "dbgsv.ini", (PSZ)pStr, nMaxLen );
682*b1cdbd2cSJim Jagielski #else
683*b1cdbd2cSJim Jagielski     strncpy( pStr, "dbgsv.ini", nMaxLen );
684*b1cdbd2cSJim Jagielski #endif
685*b1cdbd2cSJim Jagielski     pStr[ nMaxLen - 1 ] = 0;
686*b1cdbd2cSJim Jagielski }
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
689*b1cdbd2cSJim Jagielski 
DbgGetLogFileName(sal_Char * pStr)690*b1cdbd2cSJim Jagielski static void DbgGetLogFileName( sal_Char* pStr )
691*b1cdbd2cSJim Jagielski {
692*b1cdbd2cSJim Jagielski #if defined( UNX )
693*b1cdbd2cSJim Jagielski     const sal_Char* pName = getenv("DBGSV_LOG");
694*b1cdbd2cSJim Jagielski     if ( !pName )
695*b1cdbd2cSJim Jagielski         pName = "dbgsv.log";
696*b1cdbd2cSJim Jagielski     strcpy( pStr, pName );
697*b1cdbd2cSJim Jagielski #elif defined( WNT )
698*b1cdbd2cSJim Jagielski     const sal_Char* pName = getenv("DBGSV_LOG");
699*b1cdbd2cSJim Jagielski     if ( pName )
700*b1cdbd2cSJim Jagielski         strcpy( pStr, pName );
701*b1cdbd2cSJim Jagielski     else
702*b1cdbd2cSJim Jagielski         GetProfileStringA( "sv", "dbgsvlog", "dbgsv.log", pStr, 200 );
703*b1cdbd2cSJim Jagielski #elif defined( OS2 )
704*b1cdbd2cSJim Jagielski     PrfQueryProfileString( HINI_PROFILE, (PSZ)"SV", (PSZ)"DBGSVLOG",
705*b1cdbd2cSJim Jagielski                            "dbgsv.log", (PSZ)pStr, 200 );
706*b1cdbd2cSJim Jagielski #else
707*b1cdbd2cSJim Jagielski     strcpy( pStr, "dbgsv.log" );
708*b1cdbd2cSJim Jagielski #endif
709*b1cdbd2cSJim Jagielski }
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
712*b1cdbd2cSJim Jagielski 
DbgDebugBeep()713*b1cdbd2cSJim Jagielski static void DbgDebugBeep()
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski #if defined( WNT )
716*b1cdbd2cSJim Jagielski     MessageBeep( MB_ICONHAND );
717*b1cdbd2cSJim Jagielski #elif defined( OS2 )
718*b1cdbd2cSJim Jagielski     WinAlarm( HWND_DESKTOP, WA_ERROR );
719*b1cdbd2cSJim Jagielski #endif
720*b1cdbd2cSJim Jagielski }
721*b1cdbd2cSJim Jagielski 
722*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
723*b1cdbd2cSJim Jagielski 
GetDebugData()724*b1cdbd2cSJim Jagielski static DebugData* GetDebugData()
725*b1cdbd2cSJim Jagielski {
726*b1cdbd2cSJim Jagielski     if ( !aDebugData.bInit )
727*b1cdbd2cSJim Jagielski     {
728*b1cdbd2cSJim Jagielski         aDebugData.bInit = sal_True;
729*b1cdbd2cSJim Jagielski 
730*b1cdbd2cSJim Jagielski         // Default Debug-Namen setzen
731*b1cdbd2cSJim Jagielski         DbgGetLogFileName( aDebugData.aDbgData.aDebugName );
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski         // DEBUG.INI-File
734*b1cdbd2cSJim Jagielski         sal_Char aBuf[ 4096 ];
735*b1cdbd2cSJim Jagielski         DbgGetDbgFileName( aBuf, sizeof( aBuf ) );
736*b1cdbd2cSJim Jagielski         FILETYPE pIniFile = FileOpen( aBuf, "r" );
737*b1cdbd2cSJim Jagielski         if ( pIniFile != NULL )
738*b1cdbd2cSJim Jagielski         {
739*b1cdbd2cSJim Jagielski             ConfigSection eCurrentSection = eUnknown;
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski             // no sophisticated algorithm here, assume that the whole file fits into aBuf ...
742*b1cdbd2cSJim Jagielski             sal_uIntPtr nReallyRead = FileRead( aBuf, 1, sizeof( aBuf ) / sizeof( sal_Char ) - 1, pIniFile );
743*b1cdbd2cSJim Jagielski             aBuf[ nReallyRead ] = 0;
744*b1cdbd2cSJim Jagielski             const sal_Char* pLine = aBuf;
745*b1cdbd2cSJim Jagielski             while ( const sal_Char* pNextLine = strstr( pLine, FILE_LINEEND ) )
746*b1cdbd2cSJim Jagielski             {
747*b1cdbd2cSJim Jagielski                 size_t nLineLength = pNextLine - pLine;
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski                 if ( lcl_isConfigSection( pLine, nLineLength ) )
750*b1cdbd2cSJim Jagielski                     eCurrentSection = lcl_getSectionFromName( pLine + 1, nLineLength - 2 );
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski                 // elements of the [output] section
753*b1cdbd2cSJim Jagielski                 if ( eCurrentSection == eOutput )
754*b1cdbd2cSJim Jagielski                 {
755*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "log_file", aDebugData.aDbgData.aDebugName, sizeof( aDebugData.aDbgData.aDebugName ) );
756*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigBoolean( pLine, nLineLength, "overwrite", &aDebugData.aDbgData.bOverwrite );
757*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "include", aDebugData.aDbgData.aInclFilter, sizeof( aDebugData.aDbgData.aInclFilter ) );
758*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "exclude", aDebugData.aDbgData.aExclFilter, sizeof( aDebugData.aDbgData.aExclFilter ) );
759*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "include_class", aDebugData.aDbgData.aInclClassFilter, sizeof( aDebugData.aDbgData.aInclClassFilter ) );
760*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "exclude_class", aDebugData.aDbgData.aExclClassFilter, sizeof( aDebugData.aDbgData.aExclClassFilter ) );
761*b1cdbd2cSJim Jagielski                     lcl_tryReadOutputChannel( pLine, nLineLength, "trace", &aDebugData.aDbgData.nTraceOut );
762*b1cdbd2cSJim Jagielski                     lcl_tryReadOutputChannel( pLine, nLineLength, "warning", &aDebugData.aDbgData.nWarningOut );
763*b1cdbd2cSJim Jagielski                     lcl_tryReadOutputChannel( pLine, nLineLength, "error", &aDebugData.aDbgData.nErrorOut );
764*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigBoolean( pLine, nLineLength, "oslhook", &aDebugData.aDbgData.bHookOSLAssert );
765*b1cdbd2cSJim Jagielski                 }
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski                 // elements of the [memory] section
768*b1cdbd2cSJim Jagielski                 if ( eCurrentSection == eMemory )
769*b1cdbd2cSJim Jagielski                 {
770*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "initialize", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_INIT );
771*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "overwrite", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_OVERWRITE );
772*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "overwrite_free", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_OVERWRITEFREE );
773*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "pointer", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_POINTER );
774*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "report", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_REPORT );
775*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "trace", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_TRACE );
776*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "new_and_delete", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_NEWDEL );
777*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "object_test", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_XTOR );
778*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "sys_alloc", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_SYSALLOC );
779*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "leak_report", &aDebugData.aDbgData.nTestFlags, DBG_TEST_MEM_LEAKREPORT );
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski                     lcl_tryReadHexByte( pLine, nLineLength, "init_byte", &aDebugData.aDbgData.bMemInit );
782*b1cdbd2cSJim Jagielski                     lcl_tryReadHexByte( pLine, nLineLength, "bound_byte", &aDebugData.aDbgData.bMemBound );
783*b1cdbd2cSJim Jagielski                     lcl_tryReadHexByte( pLine, nLineLength, "free_byte", &aDebugData.aDbgData.bMemFree );
784*b1cdbd2cSJim Jagielski                 }
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski                 // elements of the [gui] section
787*b1cdbd2cSJim Jagielski                 if ( eCurrentSection == eGUI )
788*b1cdbd2cSJim Jagielski                 {
789*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigString( pLine, nLineLength, "debug_window_state", aDebugData.aDbgData.aDbgWinState, sizeof( aDebugData.aDbgData.aDbgWinState ) );
790*b1cdbd2cSJim Jagielski                 }
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski                 // elements of the [objects] section
793*b1cdbd2cSJim Jagielski                 if ( eCurrentSection == eObjects )
794*b1cdbd2cSJim Jagielski                 {
795*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "check_this", &aDebugData.aDbgData.nTestFlags, DBG_TEST_XTOR_THIS );
796*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "check_function", &aDebugData.aDbgData.nTestFlags, DBG_TEST_XTOR_FUNC );
797*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "check_exit", &aDebugData.aDbgData.nTestFlags, DBG_TEST_XTOR_EXIT );
798*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "generate_report", &aDebugData.aDbgData.nTestFlags, DBG_TEST_XTOR_REPORT );
799*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "trace", &aDebugData.aDbgData.nTestFlags, DBG_TEST_XTOR_TRACE );
800*b1cdbd2cSJim Jagielski                 }
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski                 // elements of the [test] section
803*b1cdbd2cSJim Jagielski                 if ( eCurrentSection == eTest )
804*b1cdbd2cSJim Jagielski                 {
805*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "profiling", &aDebugData.aDbgData.nTestFlags, DBG_TEST_PROFILING );
806*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "resources", &aDebugData.aDbgData.nTestFlags, DBG_TEST_RESOURCE );
807*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "dialog", &aDebugData.aDbgData.nTestFlags, DBG_TEST_DIALOG );
808*b1cdbd2cSJim Jagielski                     lcl_tryReadConfigFlag( pLine, nLineLength, "bold_app_font", &aDebugData.aDbgData.nTestFlags, DBG_TEST_BOLDAPPFONT );
809*b1cdbd2cSJim Jagielski                 }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski                 pLine = pNextLine + strlen( FILE_LINEEND );
812*b1cdbd2cSJim Jagielski             }
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski             FileClose( pIniFile );
815*b1cdbd2cSJim Jagielski         }
816*b1cdbd2cSJim Jagielski         else
817*b1cdbd2cSJim Jagielski         {
818*b1cdbd2cSJim Jagielski             lcl_matchOutputChannel( getenv( "DBGSV_TRACE_OUT" ), &aDebugData.aDbgData.nTraceOut );
819*b1cdbd2cSJim Jagielski             lcl_matchOutputChannel( getenv( "DBGSV_WARNING_OUT" ), &aDebugData.aDbgData.nWarningOut );
820*b1cdbd2cSJim Jagielski             lcl_matchOutputChannel( getenv( "DBGSV_ERROR_OUT" ), &aDebugData.aDbgData.nErrorOut );
821*b1cdbd2cSJim Jagielski 
822*b1cdbd2cSJim Jagielski         }
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski         getcwd( aCurPath, sizeof( aCurPath ) );
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski         // Daten initialisieren
827*b1cdbd2cSJim Jagielski         if ( aDebugData.aDbgData.nTestFlags & DBG_TEST_XTOR )
828*b1cdbd2cSJim Jagielski             aDebugData.pXtorList = new PointerList;
829*b1cdbd2cSJim Jagielski         if ( aDebugData.aDbgData.nTestFlags & DBG_TEST_PROFILING )
830*b1cdbd2cSJim Jagielski             aDebugData.pProfList = new PointerList;
831*b1cdbd2cSJim Jagielski     }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski     return &aDebugData;
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
837*b1cdbd2cSJim Jagielski 
ImplGetDebugData()838*b1cdbd2cSJim Jagielski inline DebugData* ImplGetDebugData()
839*b1cdbd2cSJim Jagielski {
840*b1cdbd2cSJim Jagielski     if ( !aDebugData.bInit )
841*b1cdbd2cSJim Jagielski         return GetDebugData();
842*b1cdbd2cSJim Jagielski     else
843*b1cdbd2cSJim Jagielski         return &aDebugData;
844*b1cdbd2cSJim Jagielski }
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
847*b1cdbd2cSJim Jagielski 
ImplDbgInitFile()848*b1cdbd2cSJim Jagielski static FILETYPE ImplDbgInitFile()
849*b1cdbd2cSJim Jagielski {
850*b1cdbd2cSJim Jagielski     static sal_Bool bFileInit = sal_False;
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski     sal_Char aBuf[4096];
853*b1cdbd2cSJim Jagielski     getcwd( aBuf, sizeof( aBuf ) );
854*b1cdbd2cSJim Jagielski     chdir( aCurPath );
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
857*b1cdbd2cSJim Jagielski     FILETYPE    pDebugFile;
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski     if ( !bFileInit )
860*b1cdbd2cSJim Jagielski     {
861*b1cdbd2cSJim Jagielski         bFileInit = sal_True;
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski         if ( pData->aDbgData.bOverwrite )
864*b1cdbd2cSJim Jagielski             pDebugFile = FileOpen( pData->aDbgData.aDebugName, "w" );
865*b1cdbd2cSJim Jagielski         else
866*b1cdbd2cSJim Jagielski             pDebugFile = FileOpen( pData->aDbgData.aDebugName, "a" );
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski         if ( pDebugFile )
869*b1cdbd2cSJim Jagielski         {
870*b1cdbd2cSJim Jagielski             time_t  nTime = time( 0 );
871*b1cdbd2cSJim Jagielski             tm*     pTime;
872*b1cdbd2cSJim Jagielski #ifdef UNX
873*b1cdbd2cSJim Jagielski             tm      aTime;
874*b1cdbd2cSJim Jagielski             pTime = localtime_r( &nTime, &aTime );
875*b1cdbd2cSJim Jagielski #else
876*b1cdbd2cSJim Jagielski             pTime = localtime( &nTime );
877*b1cdbd2cSJim Jagielski #endif
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski             // Header ausgeben
880*b1cdbd2cSJim Jagielski             FilePrintF( pDebugFile, "******************************************************************************%s", FILE_LINEEND );
881*b1cdbd2cSJim Jagielski             FilePrintF( pDebugFile, "%s%s", pData->aDbgData.aDebugName, FILE_LINEEND );
882*b1cdbd2cSJim Jagielski             if ( pTime )
883*b1cdbd2cSJim Jagielski                 FilePrintF( pDebugFile, "%s%s", asctime( pTime ), FILE_LINEEND );
884*b1cdbd2cSJim Jagielski         }
885*b1cdbd2cSJim Jagielski     }
886*b1cdbd2cSJim Jagielski     else
887*b1cdbd2cSJim Jagielski         pDebugFile = FileOpen( pData->aDbgData.aDebugName, "a" );
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski     chdir( aBuf );
890*b1cdbd2cSJim Jagielski 
891*b1cdbd2cSJim Jagielski     return pDebugFile;
892*b1cdbd2cSJim Jagielski }
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
895*b1cdbd2cSJim Jagielski 
ImplDbgPrintFile(const sal_Char * pLine)896*b1cdbd2cSJim Jagielski static void ImplDbgPrintFile( const sal_Char* pLine )
897*b1cdbd2cSJim Jagielski {
898*b1cdbd2cSJim Jagielski     FILETYPE pDebugFile = ImplDbgInitFile();
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski     if ( pDebugFile )
901*b1cdbd2cSJim Jagielski     {
902*b1cdbd2cSJim Jagielski         FilePrintF( pDebugFile, "%s%s", pLine, FILE_LINEEND );
903*b1cdbd2cSJim Jagielski         FileClose( pDebugFile );
904*b1cdbd2cSJim Jagielski     }
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
908*b1cdbd2cSJim Jagielski 
ImplStrSearch(const sal_Char * pSearchStr,int nSearchLen,const sal_Char * pStr,int nLen)909*b1cdbd2cSJim Jagielski static int ImplStrSearch( const sal_Char* pSearchStr, int nSearchLen,
910*b1cdbd2cSJim Jagielski                           const sal_Char* pStr, int nLen )
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski     int nPos = 0;
913*b1cdbd2cSJim Jagielski     while ( nPos+nSearchLen <= nLen )
914*b1cdbd2cSJim Jagielski     {
915*b1cdbd2cSJim Jagielski         if ( strncmp( pStr+nPos, pSearchStr, nSearchLen ) == 0 )
916*b1cdbd2cSJim Jagielski             return 1;
917*b1cdbd2cSJim Jagielski         nPos++;
918*b1cdbd2cSJim Jagielski     }
919*b1cdbd2cSJim Jagielski 
920*b1cdbd2cSJim Jagielski     return 0;
921*b1cdbd2cSJim Jagielski }
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
924*b1cdbd2cSJim Jagielski 
ImplDbgFilter(const sal_Char * pFilter,const sal_Char * pMsg,int bEmpty)925*b1cdbd2cSJim Jagielski static int ImplDbgFilter( const sal_Char* pFilter, const sal_Char* pMsg,
926*b1cdbd2cSJim Jagielski                           int bEmpty )
927*b1cdbd2cSJim Jagielski {
928*b1cdbd2cSJim Jagielski     int nStrLen = strlen( pFilter );
929*b1cdbd2cSJim Jagielski     if ( !nStrLen )
930*b1cdbd2cSJim Jagielski         return bEmpty;
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski     int nMsgLen = strlen( pMsg );
933*b1cdbd2cSJim Jagielski     const sal_Char* pTok = pFilter;
934*b1cdbd2cSJim Jagielski     int         nTok = 0;
935*b1cdbd2cSJim Jagielski     while ( pTok[nTok] )
936*b1cdbd2cSJim Jagielski     {
937*b1cdbd2cSJim Jagielski         if ( pTok[nTok] == ';' )
938*b1cdbd2cSJim Jagielski         {
939*b1cdbd2cSJim Jagielski             if ( nTok && ImplStrSearch( pTok, nTok, pMsg, nMsgLen ) )
940*b1cdbd2cSJim Jagielski                 return sal_True;
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski             pTok += nTok+1;
943*b1cdbd2cSJim Jagielski             nTok = 0;
944*b1cdbd2cSJim Jagielski         }
945*b1cdbd2cSJim Jagielski 
946*b1cdbd2cSJim Jagielski         nTok++;
947*b1cdbd2cSJim Jagielski     }
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski     if ( nTok && ImplStrSearch( pTok, nTok, pMsg, nMsgLen ) )
950*b1cdbd2cSJim Jagielski         return sal_True;
951*b1cdbd2cSJim Jagielski     else
952*b1cdbd2cSJim Jagielski         return sal_False;
953*b1cdbd2cSJim Jagielski }
954*b1cdbd2cSJim Jagielski 
955*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski extern "C"
dbg_printOslDebugMessage(const sal_Char * pszFileName,sal_Int32 nLine,const sal_Char * pszMessage)958*b1cdbd2cSJim Jagielski void SAL_CALL dbg_printOslDebugMessage( const sal_Char * pszFileName, sal_Int32 nLine, const sal_Char * pszMessage )
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski     DbgOut( pszMessage ? pszMessage : "assertion failed!", DBG_OUT_ERROR, pszFileName, (sal_uInt16)nLine );
961*b1cdbd2cSJim Jagielski }
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
964*b1cdbd2cSJim Jagielski 
DebugInit()965*b1cdbd2cSJim Jagielski static void DebugInit()
966*b1cdbd2cSJim Jagielski {
967*b1cdbd2cSJim Jagielski     bDbgImplInMain = sal_True;
968*b1cdbd2cSJim Jagielski     ImplDbgInitLock();
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski     DebugData* pData = GetDebugData();
971*b1cdbd2cSJim Jagielski     if( pData->aDbgData.bHookOSLAssert && ! pData->bOslIsHooked )
972*b1cdbd2cSJim Jagielski     {
973*b1cdbd2cSJim Jagielski         pData->pOldDebugMessageFunc = osl_setDetailedDebugMessageFunc( &dbg_printOslDebugMessage );
974*b1cdbd2cSJim Jagielski         pData->bOslIsHooked = true;
975*b1cdbd2cSJim Jagielski     }
976*b1cdbd2cSJim Jagielski }
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
979*b1cdbd2cSJim Jagielski 
DebugDeInit()980*b1cdbd2cSJim Jagielski static void DebugDeInit()
981*b1cdbd2cSJim Jagielski {
982*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
983*b1cdbd2cSJim Jagielski     sal_uIntPtr       i;
984*b1cdbd2cSJim Jagielski     sal_uIntPtr       nCount;
985*b1cdbd2cSJim Jagielski     sal_uIntPtr       nOldOut;
986*b1cdbd2cSJim Jagielski 
987*b1cdbd2cSJim Jagielski     if( pData->bOslIsHooked )
988*b1cdbd2cSJim Jagielski     {
989*b1cdbd2cSJim Jagielski         osl_setDetailedDebugMessageFunc( pData->pOldDebugMessageFunc );
990*b1cdbd2cSJim Jagielski         pData->bOslIsHooked = sal_False;
991*b1cdbd2cSJim Jagielski     }
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski     // Statistik-Ausgaben immer in File
994*b1cdbd2cSJim Jagielski     nOldOut = pData->aDbgData.nTraceOut;
995*b1cdbd2cSJim Jagielski     pData->aDbgData.nTraceOut = DBG_OUT_FILE;
996*b1cdbd2cSJim Jagielski 
997*b1cdbd2cSJim Jagielski     // Xtor-Liste ausgeben
998*b1cdbd2cSJim Jagielski     if ( pData->pXtorList && pData->pXtorList->Count() &&
999*b1cdbd2cSJim Jagielski          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_REPORT) )
1000*b1cdbd2cSJim Jagielski     {
1001*b1cdbd2cSJim Jagielski         DbgOutf( "------------------------------------------------------------------------------" );
1002*b1cdbd2cSJim Jagielski         DbgOutf( "Object Report" );
1003*b1cdbd2cSJim Jagielski         DbgOutf( "------------------------------------------------------------------------------" );
1004*b1cdbd2cSJim Jagielski         DbgOutf( "%-27s : %-9s : %-9s : %-7s : %-3s : %-6s :",
1005*b1cdbd2cSJim Jagielski                  "XTor-List", "Ctor", "Dtor", "MaxInst", "St.", "Diff." );
1006*b1cdbd2cSJim Jagielski         DbgOutf( "----------------------------:-----------:-----------:---------:----:---------:" );
1007*b1cdbd2cSJim Jagielski         for( i = 0, nCount = pData->pXtorList->Count(); i < nCount; i++ )
1008*b1cdbd2cSJim Jagielski         {
1009*b1cdbd2cSJim Jagielski             XtorType* pXtorData = (XtorType*)pData->pXtorList->Get( i );
1010*b1cdbd2cSJim Jagielski             if ( pXtorData->bTest )
1011*b1cdbd2cSJim Jagielski             {
1012*b1cdbd2cSJim Jagielski                 // Static-Objekte dazurechnen
1013*b1cdbd2cSJim Jagielski                 pXtorData->nDtorCalls += pXtorData->nStatics;
1014*b1cdbd2cSJim Jagielski                 if ( pXtorData->nStatics && (pXtorData->nDtorCalls > pXtorData->nCtorCalls) )
1015*b1cdbd2cSJim Jagielski                     pXtorData->nDtorCalls = pXtorData->nCtorCalls;
1016*b1cdbd2cSJim Jagielski                 DbgOutf( "%-27s : %9lu : %9lu : %7lu : %3lu : %4lu %-1s :",
1017*b1cdbd2cSJim Jagielski                          pXtorData->aName, pXtorData->nCtorCalls, pXtorData->nDtorCalls,
1018*b1cdbd2cSJim Jagielski                          pXtorData->nMaxCount, pXtorData->nStatics,
1019*b1cdbd2cSJim Jagielski                          pXtorData->nCtorCalls - pXtorData->nDtorCalls,
1020*b1cdbd2cSJim Jagielski                          (pXtorData->nCtorCalls - pXtorData->nDtorCalls) ? "!" : " " );
1021*b1cdbd2cSJim Jagielski             }
1022*b1cdbd2cSJim Jagielski         }
1023*b1cdbd2cSJim Jagielski         DbgOutf( "==============================================================================" );
1024*b1cdbd2cSJim Jagielski     }
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski     // Aufraeumen
1027*b1cdbd2cSJim Jagielski     if ( pData->pXtorList )
1028*b1cdbd2cSJim Jagielski     {
1029*b1cdbd2cSJim Jagielski         for( i = 0, nCount = pData->pXtorList->Count(); i < nCount; i++ )
1030*b1cdbd2cSJim Jagielski         {
1031*b1cdbd2cSJim Jagielski             XtorType* pXtorData = (XtorType*)pData->pXtorList->Get( i );
1032*b1cdbd2cSJim Jagielski             delete pXtorData;
1033*b1cdbd2cSJim Jagielski         }
1034*b1cdbd2cSJim Jagielski         delete pData->pXtorList;
1035*b1cdbd2cSJim Jagielski         pData->pXtorList = NULL;
1036*b1cdbd2cSJim Jagielski     }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski     // Alles auf sal_False setzen, damit globale Variablen nicht das
1039*b1cdbd2cSJim Jagielski     // System zum Abstuerzen bringt. Dabei muessen aber die
1040*b1cdbd2cSJim Jagielski     // Memory-Flags erhalten bleiben, da sonst new/delete in globalen
1041*b1cdbd2cSJim Jagielski     // Variablen abstuerzen, da die Pointeranpassung dann nicht mehr richtig
1042*b1cdbd2cSJim Jagielski     // funktioniert
1043*b1cdbd2cSJim Jagielski     pData->aDbgData.nTraceOut   = nOldOut;
1044*b1cdbd2cSJim Jagielski     pData->aDbgData.nTestFlags &= (DBG_TEST_MEM | DBG_TEST_PROFILING);
1045*b1cdbd2cSJim Jagielski     pData->aDbgPrintUserChannels.clear();
1046*b1cdbd2cSJim Jagielski     pData->pDbgPrintTestTool    = NULL;
1047*b1cdbd2cSJim Jagielski     pData->pDbgPrintWindow      = NULL;
1048*b1cdbd2cSJim Jagielski     pData->pOldDebugMessageFunc = NULL;
1049*b1cdbd2cSJim Jagielski     ImplDbgDeInitLock();
1050*b1cdbd2cSJim Jagielski }
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1053*b1cdbd2cSJim Jagielski 
DebugGlobalDeInit()1054*b1cdbd2cSJim Jagielski static void DebugGlobalDeInit()
1055*b1cdbd2cSJim Jagielski {
1056*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
1057*b1cdbd2cSJim Jagielski     sal_uIntPtr       i;
1058*b1cdbd2cSJim Jagielski     sal_uIntPtr       nCount;
1059*b1cdbd2cSJim Jagielski     sal_uIntPtr       nOldOut;
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski     // Statistik-Ausgaben immer in File
1062*b1cdbd2cSJim Jagielski     nOldOut = pData->aDbgData.nTraceOut;
1063*b1cdbd2cSJim Jagielski     pData->aDbgData.nTraceOut = DBG_OUT_FILE;
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski     // Profileliste ausgeben
1066*b1cdbd2cSJim Jagielski     if ( pData->pProfList && pData->pProfList->Count() )
1067*b1cdbd2cSJim Jagielski     {
1068*b1cdbd2cSJim Jagielski         DbgOutf( "------------------------------------------------------------------------------" );
1069*b1cdbd2cSJim Jagielski         DbgOutf( "Profiling Report" );
1070*b1cdbd2cSJim Jagielski         DbgOutf( "------------------------------------------------------------------------------" );
1071*b1cdbd2cSJim Jagielski         DbgOutf( "%-25s : %-9s : %-6s : %-6s : %-6s : %-9s :",
1072*b1cdbd2cSJim Jagielski                  "Prof-List (ms)", "Time", "Min", "Max", "Ave", "Count" );
1073*b1cdbd2cSJim Jagielski         DbgOutf( "--------------------------:-----------:--------:--------:--------:-----------:" );
1074*b1cdbd2cSJim Jagielski         for( i = 0, nCount = pData->pProfList->Count(); i < nCount; i++ )
1075*b1cdbd2cSJim Jagielski         {
1076*b1cdbd2cSJim Jagielski             ProfType* pProfData = (ProfType*)pData->pProfList->Get( i );
1077*b1cdbd2cSJim Jagielski             sal_uIntPtr nAve = pProfData->nTime / pProfData->nCount;
1078*b1cdbd2cSJim Jagielski             DbgOutf( "%-25s : %9lu : %6lu : %6lu : %6lu : %9lu :",
1079*b1cdbd2cSJim Jagielski                      pProfData->aName, pProfData->nTime,
1080*b1cdbd2cSJim Jagielski                      pProfData->nMinTime, pProfData->nMaxTime, nAve,
1081*b1cdbd2cSJim Jagielski                      pProfData->nCount );
1082*b1cdbd2cSJim Jagielski         }
1083*b1cdbd2cSJim Jagielski         DbgOutf( "==============================================================================" );
1084*b1cdbd2cSJim Jagielski     }
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski     // Aufraeumen
1087*b1cdbd2cSJim Jagielski     if ( pData->pProfList )
1088*b1cdbd2cSJim Jagielski     {
1089*b1cdbd2cSJim Jagielski         for( i = 0, nCount = pData->pProfList->Count(); i < nCount; i++ )
1090*b1cdbd2cSJim Jagielski         {
1091*b1cdbd2cSJim Jagielski             ProfType* pProfData = (ProfType*)pData->pProfList->Get( i );
1092*b1cdbd2cSJim Jagielski             delete pProfData;
1093*b1cdbd2cSJim Jagielski         }
1094*b1cdbd2cSJim Jagielski         delete pData->pProfList;
1095*b1cdbd2cSJim Jagielski         pData->pProfList = NULL;
1096*b1cdbd2cSJim Jagielski     }
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski #ifdef SV_MEMMGR
1099*b1cdbd2cSJim Jagielski     DbgImpCheckMemoryDeInit();
1100*b1cdbd2cSJim Jagielski #endif
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski     // Profiling-Flags ausschalten
1103*b1cdbd2cSJim Jagielski     pData->aDbgData.nTraceOut   = nOldOut;
1104*b1cdbd2cSJim Jagielski     pData->aDbgData.nTestFlags &= ~DBG_TEST_PROFILING;
1105*b1cdbd2cSJim Jagielski }
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1108*b1cdbd2cSJim Jagielski 
ImpDbgOutfBuf(sal_Char * pBuf,const sal_Char * pFStr,...)1109*b1cdbd2cSJim Jagielski void ImpDbgOutfBuf( sal_Char* pBuf, const sal_Char* pFStr, ... )
1110*b1cdbd2cSJim Jagielski {
1111*b1cdbd2cSJim Jagielski     va_list pList;
1112*b1cdbd2cSJim Jagielski 
1113*b1cdbd2cSJim Jagielski     va_start( pList, pFStr );
1114*b1cdbd2cSJim Jagielski     sal_Char aBuf[DBG_BUF_MAXLEN];
1115*b1cdbd2cSJim Jagielski     vsprintf( aBuf, pFStr, pList );
1116*b1cdbd2cSJim Jagielski     va_end( pList );
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski     strcat( pBuf, aBuf );
1119*b1cdbd2cSJim Jagielski     strcat( pBuf, "\n" );
1120*b1cdbd2cSJim Jagielski }
1121*b1cdbd2cSJim Jagielski 
1122*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1123*b1cdbd2cSJim Jagielski 
DebugXTorInfo(sal_Char * pBuf)1124*b1cdbd2cSJim Jagielski static void DebugXTorInfo( sal_Char* pBuf )
1125*b1cdbd2cSJim Jagielski {
1126*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
1127*b1cdbd2cSJim Jagielski     sal_uIntPtr       i;
1128*b1cdbd2cSJim Jagielski     sal_uIntPtr       nCount;
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski     // Xtor-Liste ausgeben
1131*b1cdbd2cSJim Jagielski     if ( pData->pXtorList && pData->pXtorList->Count() &&
1132*b1cdbd2cSJim Jagielski          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_REPORT) )
1133*b1cdbd2cSJim Jagielski     {
1134*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "------------------------------------------------------------------------------" );
1135*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "Object Report" );
1136*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "------------------------------------------------------------------------------" );
1137*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "%-27s : %-9s : %-9s : %-7s : %-3s : %-6s :",
1138*b1cdbd2cSJim Jagielski                        "XTor-List", "Ctor", "Dtor", "MaxInst", "St.", "Diff." );
1139*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "----------------------------:-----------:-----------:---------:----:---------:" );
1140*b1cdbd2cSJim Jagielski         for( i = 0, nCount = pData->pXtorList->Count(); i < nCount; i++ )
1141*b1cdbd2cSJim Jagielski         {
1142*b1cdbd2cSJim Jagielski             XtorType* pXtorData = (XtorType*)pData->pXtorList->Get( i );
1143*b1cdbd2cSJim Jagielski             if ( pXtorData->bTest )
1144*b1cdbd2cSJim Jagielski             {
1145*b1cdbd2cSJim Jagielski                 ImpDbgOutfBuf( pBuf, "%-27s : %9lu : %9lu : %7lu : %3lu : %6lu :",
1146*b1cdbd2cSJim Jagielski                                pXtorData->aName, pXtorData->nCtorCalls, pXtorData->nDtorCalls,
1147*b1cdbd2cSJim Jagielski                                pXtorData->nMaxCount, pXtorData->nStatics,
1148*b1cdbd2cSJim Jagielski                                pXtorData->nCtorCalls - pXtorData->nDtorCalls );
1149*b1cdbd2cSJim Jagielski             }
1150*b1cdbd2cSJim Jagielski         }
1151*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "==============================================================================" );
1152*b1cdbd2cSJim Jagielski         ImpDbgOutfBuf( pBuf, "" );
1153*b1cdbd2cSJim Jagielski     }
1154*b1cdbd2cSJim Jagielski }
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
ImplDbgFilterMessage(const sal_Char * pMsg)1157*b1cdbd2cSJim Jagielski sal_Bool ImplDbgFilterMessage( const sal_Char* pMsg )
1158*b1cdbd2cSJim Jagielski {
1159*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
1160*b1cdbd2cSJim Jagielski     if ( !ImplDbgFilter( pData->aDbgData.aInclFilter, pMsg, sal_True ) )
1161*b1cdbd2cSJim Jagielski         return sal_True;
1162*b1cdbd2cSJim Jagielski     if ( ImplDbgFilter( pData->aDbgData.aExclFilter, pMsg, sal_False ) )
1163*b1cdbd2cSJim Jagielski         return sal_True;
1164*b1cdbd2cSJim Jagielski     return sal_False;
1165*b1cdbd2cSJim Jagielski }
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1168*b1cdbd2cSJim Jagielski 
DbgFunc(sal_uInt16 nAction,void * pParam)1169*b1cdbd2cSJim Jagielski void* DbgFunc( sal_uInt16 nAction, void* pParam )
1170*b1cdbd2cSJim Jagielski {
1171*b1cdbd2cSJim Jagielski     DebugData* pDebugData = ImplGetDebugData();
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski     if ( nAction == DBG_FUNC_GETDATA )
1174*b1cdbd2cSJim Jagielski         return (void*)&(pDebugData->aDbgData);
1175*b1cdbd2cSJim Jagielski     else if ( nAction == DBG_FUNC_GETPRINTMSGBOX )
1176*b1cdbd2cSJim Jagielski         return (void*)(long)(pDebugData->pDbgPrintMsgBox);
1177*b1cdbd2cSJim Jagielski     else if ( nAction == DBG_FUNC_FILTERMESSAGE )
1178*b1cdbd2cSJim Jagielski         if ( ImplDbgFilterMessage( (const sal_Char*) pParam ) )
1179*b1cdbd2cSJim Jagielski             return (void*) -1;
1180*b1cdbd2cSJim Jagielski         else
1181*b1cdbd2cSJim Jagielski             return (void*) 0;   // aka NULL
1182*b1cdbd2cSJim Jagielski     else
1183*b1cdbd2cSJim Jagielski 
1184*b1cdbd2cSJim Jagielski     {
1185*b1cdbd2cSJim Jagielski         switch ( nAction )
1186*b1cdbd2cSJim Jagielski         {
1187*b1cdbd2cSJim Jagielski             case DBG_FUNC_DEBUGSTART:
1188*b1cdbd2cSJim Jagielski                 DebugInit();
1189*b1cdbd2cSJim Jagielski                 break;
1190*b1cdbd2cSJim Jagielski 
1191*b1cdbd2cSJim Jagielski             case DBG_FUNC_DEBUGEND:
1192*b1cdbd2cSJim Jagielski                 DebugDeInit();
1193*b1cdbd2cSJim Jagielski                 break;
1194*b1cdbd2cSJim Jagielski 
1195*b1cdbd2cSJim Jagielski             case DBG_FUNC_GLOBALDEBUGEND:
1196*b1cdbd2cSJim Jagielski                 DebugGlobalDeInit();
1197*b1cdbd2cSJim Jagielski                 break;
1198*b1cdbd2cSJim Jagielski 
1199*b1cdbd2cSJim Jagielski             case DBG_FUNC_SETPRINTMSGBOX:
1200*b1cdbd2cSJim Jagielski                 pDebugData->pDbgPrintMsgBox = (DbgPrintLine)(long)pParam;
1201*b1cdbd2cSJim Jagielski                 break;
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski             case DBG_FUNC_SETPRINTWINDOW:
1204*b1cdbd2cSJim Jagielski                 pDebugData->pDbgPrintWindow = (DbgPrintLine)(long)pParam;
1205*b1cdbd2cSJim Jagielski                 break;
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski             case DBG_FUNC_SETPRINTTESTTOOL:
1208*b1cdbd2cSJim Jagielski                 pDebugData->pDbgPrintTestTool = (DbgPrintLine)(long)pParam;
1209*b1cdbd2cSJim Jagielski                 break;
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski             case DBG_FUNC_SET_ABORT:
1212*b1cdbd2cSJim Jagielski                 pDebugData->pDbgAbort = (DbgPrintLine)(long)pParam;
1213*b1cdbd2cSJim Jagielski                 break;
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski             case DBG_FUNC_SAVEDATA:
1216*b1cdbd2cSJim Jagielski                 {
1217*b1cdbd2cSJim Jagielski                 const DbgData* pData = static_cast< const DbgData* >( pParam );
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski                 sal_Char aBuf[ 4096 ];
1220*b1cdbd2cSJim Jagielski                 DbgGetDbgFileName( aBuf, sizeof( aBuf ) );
1221*b1cdbd2cSJim Jagielski                 FILETYPE pIniFile = FileOpen( aBuf, "w" );
1222*b1cdbd2cSJim Jagielski                 if ( pIniFile == NULL )
1223*b1cdbd2cSJim Jagielski                     break;
1224*b1cdbd2cSJim Jagielski 
1225*b1cdbd2cSJim Jagielski                 lcl_startSection( pIniFile, eOutput );
1226*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "log_file", pData->aDebugName );
1227*b1cdbd2cSJim Jagielski                 lcl_writeConfigBoolean( pIniFile, "overwrite", pData->bOverwrite );
1228*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "include", pData->aInclFilter );
1229*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "exclude", pData->aExclFilter );
1230*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "include_class", pData->aInclClassFilter );
1231*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "exclude_class", pData->aExclClassFilter );
1232*b1cdbd2cSJim Jagielski                 lcl_writeConfigOutChannel( pIniFile, "trace", pData->nTraceOut );
1233*b1cdbd2cSJim Jagielski                 lcl_writeConfigOutChannel( pIniFile, "warning", pData->nWarningOut );
1234*b1cdbd2cSJim Jagielski                 lcl_writeConfigOutChannel( pIniFile, "error", pData->nErrorOut );
1235*b1cdbd2cSJim Jagielski                 lcl_writeConfigBoolean( pIniFile, "oslhook", pData->bHookOSLAssert );
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski                 lcl_lineFeed( pIniFile );
1238*b1cdbd2cSJim Jagielski                 lcl_startSection( pIniFile, eMemory );
1239*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "initialize", pData->nTestFlags, DBG_TEST_MEM_INIT );
1240*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "overwrite", pData->nTestFlags, DBG_TEST_MEM_OVERWRITE );
1241*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "overwrite_free", pData->nTestFlags, DBG_TEST_MEM_OVERWRITEFREE );
1242*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "pointer", pData->nTestFlags, DBG_TEST_MEM_POINTER );
1243*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "report", pData->nTestFlags, DBG_TEST_MEM_REPORT );
1244*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "trace", pData->nTestFlags, DBG_TEST_MEM_TRACE );
1245*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "new_and_delete", pData->nTestFlags, DBG_TEST_MEM_NEWDEL );
1246*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "object_test", pData->nTestFlags, DBG_TEST_MEM_XTOR );
1247*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "sys_alloc", pData->nTestFlags, DBG_TEST_MEM_SYSALLOC );
1248*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "leak_report", pData->nTestFlags, DBG_TEST_MEM_LEAKREPORT );
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski                 lcl_lineFeed( pIniFile );
1251*b1cdbd2cSJim Jagielski                 lcl_writeHexByte( pIniFile, "init_byte", pData->bMemInit );
1252*b1cdbd2cSJim Jagielski                 lcl_writeHexByte( pIniFile, "bound_byte", pData->bMemBound );
1253*b1cdbd2cSJim Jagielski                 lcl_writeHexByte( pIniFile, "free_byte", pData->bMemFree );
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski                 lcl_lineFeed( pIniFile );
1256*b1cdbd2cSJim Jagielski                 lcl_startSection( pIniFile, eGUI );
1257*b1cdbd2cSJim Jagielski                 lcl_writeConfigString( pIniFile, "debug_window_state", pData->aDbgWinState );
1258*b1cdbd2cSJim Jagielski 
1259*b1cdbd2cSJim Jagielski                 lcl_lineFeed( pIniFile );
1260*b1cdbd2cSJim Jagielski                 lcl_startSection( pIniFile, eObjects );
1261*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "check_this", pData->nTestFlags, DBG_TEST_XTOR_THIS );
1262*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "check_function", pData->nTestFlags, DBG_TEST_XTOR_FUNC );
1263*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "check_exit", pData->nTestFlags, DBG_TEST_XTOR_EXIT );
1264*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "generate_report", pData->nTestFlags, DBG_TEST_XTOR_REPORT );
1265*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "trace", pData->nTestFlags, DBG_TEST_XTOR_TRACE );
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski                 lcl_lineFeed( pIniFile );
1268*b1cdbd2cSJim Jagielski                 lcl_startSection( pIniFile, eTest );
1269*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "profiling", pData->nTestFlags, DBG_TEST_PROFILING );
1270*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "resources", pData->nTestFlags, DBG_TEST_RESOURCE );
1271*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "dialog", pData->nTestFlags, DBG_TEST_DIALOG );
1272*b1cdbd2cSJim Jagielski                 lcl_writeConfigFlag( pIniFile, "bold_app_font", pData->nTestFlags, DBG_TEST_BOLDAPPFONT );
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski                 FileClose( pIniFile );
1275*b1cdbd2cSJim Jagielski                 }
1276*b1cdbd2cSJim Jagielski                 break;
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski             case DBG_FUNC_MEMTEST:
1279*b1cdbd2cSJim Jagielski #ifdef SV_MEMMGR
1280*b1cdbd2cSJim Jagielski                 DbgImpCheckMemory( pParam );
1281*b1cdbd2cSJim Jagielski #endif
1282*b1cdbd2cSJim Jagielski                 break;
1283*b1cdbd2cSJim Jagielski 
1284*b1cdbd2cSJim Jagielski             case DBG_FUNC_XTORINFO:
1285*b1cdbd2cSJim Jagielski                 DebugXTorInfo( (sal_Char*)pParam );
1286*b1cdbd2cSJim Jagielski                 break;
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski             case DBG_FUNC_MEMINFO:
1289*b1cdbd2cSJim Jagielski #ifdef SV_MEMMGR
1290*b1cdbd2cSJim Jagielski                 DbgImpMemoryInfo( (sal_Char*)pParam );
1291*b1cdbd2cSJim Jagielski #endif
1292*b1cdbd2cSJim Jagielski                 break;
1293*b1cdbd2cSJim Jagielski 
1294*b1cdbd2cSJim Jagielski             case DBG_FUNC_COREDUMP:
1295*b1cdbd2cSJim Jagielski                 ImplCoreDump();
1296*b1cdbd2cSJim Jagielski                 break;
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski             case DBG_FUNC_ALLERROROUT:
1299*b1cdbd2cSJim Jagielski                 return (void*)(sal_uIntPtr)sal_True;
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski             case DBG_FUNC_SETTESTSOLARMUTEX:
1302*b1cdbd2cSJim Jagielski                 pDebugData->pDbgTestSolarMutex = (DbgTestSolarMutexProc)(long)pParam;
1303*b1cdbd2cSJim Jagielski                 break;
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski             case DBG_FUNC_TESTSOLARMUTEX:
1306*b1cdbd2cSJim Jagielski                 if ( pDebugData->pDbgTestSolarMutex )
1307*b1cdbd2cSJim Jagielski                     pDebugData->pDbgTestSolarMutex();
1308*b1cdbd2cSJim Jagielski                 break;
1309*b1cdbd2cSJim Jagielski 
1310*b1cdbd2cSJim Jagielski             case DBG_FUNC_PRINTFILE:
1311*b1cdbd2cSJim Jagielski                 ImplDbgPrintFile( (const sal_Char*)pParam );
1312*b1cdbd2cSJim Jagielski                 break;
1313*b1cdbd2cSJim Jagielski             case DBG_FUNC_UPDATEOSLHOOK:
1314*b1cdbd2cSJim Jagielski             {
1315*b1cdbd2cSJim Jagielski                 const DbgData* pData = static_cast< const DbgData* >( pParam );
1316*b1cdbd2cSJim Jagielski                 pDebugData->aDbgData.bHookOSLAssert = pData->bHookOSLAssert;
1317*b1cdbd2cSJim Jagielski                 if( pDebugData->bOslIsHooked && ! pData->bHookOSLAssert )
1318*b1cdbd2cSJim Jagielski                 {
1319*b1cdbd2cSJim Jagielski                     osl_setDetailedDebugMessageFunc( pDebugData->pOldDebugMessageFunc );
1320*b1cdbd2cSJim Jagielski                     pDebugData->bOslIsHooked = sal_False;
1321*b1cdbd2cSJim Jagielski                 }
1322*b1cdbd2cSJim Jagielski                 else if( ! pDebugData->bOslIsHooked && pData->bHookOSLAssert )
1323*b1cdbd2cSJim Jagielski                 {
1324*b1cdbd2cSJim Jagielski                     pDebugData->pOldDebugMessageFunc = osl_setDetailedDebugMessageFunc( &dbg_printOslDebugMessage );
1325*b1cdbd2cSJim Jagielski                     pDebugData->bOslIsHooked = sal_True;
1326*b1cdbd2cSJim Jagielski                 }
1327*b1cdbd2cSJim Jagielski             }
1328*b1cdbd2cSJim Jagielski             break;
1329*b1cdbd2cSJim Jagielski        }
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski         return NULL;
1332*b1cdbd2cSJim Jagielski     }
1333*b1cdbd2cSJim Jagielski }
1334*b1cdbd2cSJim Jagielski 
1335*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1336*b1cdbd2cSJim Jagielski 
DbgRegisterUserChannel(DbgPrintLine pProc)1337*b1cdbd2cSJim Jagielski DbgChannelId DbgRegisterUserChannel( DbgPrintLine pProc )
1338*b1cdbd2cSJim Jagielski {
1339*b1cdbd2cSJim Jagielski     DebugData* pData = ImplGetDebugData();
1340*b1cdbd2cSJim Jagielski     pData->aDbgPrintUserChannels.push_back( pProc );
1341*b1cdbd2cSJim Jagielski     return (DbgChannelId)( pData->aDbgPrintUserChannels.size() - 1 + DBG_OUT_USER_CHANNEL_0 );
1342*b1cdbd2cSJim Jagielski }
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1345*b1cdbd2cSJim Jagielski 
DbgProf(sal_uInt16 nAction,DbgDataType * pDbgData)1346*b1cdbd2cSJim Jagielski void DbgProf( sal_uInt16 nAction, DbgDataType* pDbgData )
1347*b1cdbd2cSJim Jagielski {
1348*b1cdbd2cSJim Jagielski     // Ueberhaupt Profiling-Test an
1349*b1cdbd2cSJim Jagielski     DebugData* pData = ImplGetDebugData();
1350*b1cdbd2cSJim Jagielski 
1351*b1cdbd2cSJim Jagielski     if ( !(pData->aDbgData.nTestFlags & DBG_TEST_PROFILING) )
1352*b1cdbd2cSJim Jagielski         return;
1353*b1cdbd2cSJim Jagielski 
1354*b1cdbd2cSJim Jagielski     sal_Char    aBuf[DBG_BUF_MAXLEN];
1355*b1cdbd2cSJim Jagielski     ProfType*   pProfData = (ProfType*)pDbgData->pData;
1356*b1cdbd2cSJim Jagielski     sal_uIntPtr       nTime;
1357*b1cdbd2cSJim Jagielski     if ( (nAction != DBG_PROF_START) && !pProfData )
1358*b1cdbd2cSJim Jagielski     {
1359*b1cdbd2cSJim Jagielski         strcpy( aBuf, DbgError_ProfEnd1 );
1360*b1cdbd2cSJim Jagielski         strcat( aBuf, pDbgData->pName );
1361*b1cdbd2cSJim Jagielski         DbgError( aBuf );
1362*b1cdbd2cSJim Jagielski         return;
1363*b1cdbd2cSJim Jagielski     }
1364*b1cdbd2cSJim Jagielski 
1365*b1cdbd2cSJim Jagielski     switch ( nAction )
1366*b1cdbd2cSJim Jagielski     {
1367*b1cdbd2cSJim Jagielski         case DBG_PROF_START:
1368*b1cdbd2cSJim Jagielski             if ( !pDbgData->pData )
1369*b1cdbd2cSJim Jagielski             {
1370*b1cdbd2cSJim Jagielski                 pDbgData->pData = (void*)new ProfType;
1371*b1cdbd2cSJim Jagielski                 pProfData = (ProfType*)pDbgData->pData;
1372*b1cdbd2cSJim Jagielski                 strncpy( pProfData->aName, pDbgData->pName, DBG_MAXNAME );
1373*b1cdbd2cSJim Jagielski                 pProfData->aName[DBG_MAXNAME] = '\0';
1374*b1cdbd2cSJim Jagielski                 pProfData->nCount           = 0;
1375*b1cdbd2cSJim Jagielski                 pProfData->nTime            = 0;
1376*b1cdbd2cSJim Jagielski                 pProfData->nMinTime         = 0xFFFFFFFF;
1377*b1cdbd2cSJim Jagielski                 pProfData->nMaxTime         = 0;
1378*b1cdbd2cSJim Jagielski                 pProfData->nStart           = 0xFFFFFFFF;
1379*b1cdbd2cSJim Jagielski                 pProfData->nContinueTime    = 0;
1380*b1cdbd2cSJim Jagielski                 pProfData->nContinueStart   = 0xFFFFFFFF;
1381*b1cdbd2cSJim Jagielski                 pData->pProfList->Add( (void*)pProfData );
1382*b1cdbd2cSJim Jagielski             }
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski             if ( pProfData->nStart == 0xFFFFFFFF )
1385*b1cdbd2cSJim Jagielski             {
1386*b1cdbd2cSJim Jagielski                 pProfData->nStart = ImplGetPerfTime();
1387*b1cdbd2cSJim Jagielski                 pProfData->nCount++;
1388*b1cdbd2cSJim Jagielski             }
1389*b1cdbd2cSJim Jagielski             break;
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski         case DBG_PROF_STOP:
1392*b1cdbd2cSJim Jagielski             nTime = ImplGetPerfTime();
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski             if ( pProfData->nStart == 0xFFFFFFFF )
1395*b1cdbd2cSJim Jagielski             {
1396*b1cdbd2cSJim Jagielski                 DbgError( DbgError_ProfEnd1 );
1397*b1cdbd2cSJim Jagielski                 return;
1398*b1cdbd2cSJim Jagielski             }
1399*b1cdbd2cSJim Jagielski 
1400*b1cdbd2cSJim Jagielski             if ( pProfData->nContinueStart != 0xFFFFFFFF )
1401*b1cdbd2cSJim Jagielski             {
1402*b1cdbd2cSJim Jagielski                 pProfData->nContinueTime += ImplGetPerfTime() - pProfData->nContinueStart;
1403*b1cdbd2cSJim Jagielski                 pProfData->nContinueStart = 0xFFFFFFFF;
1404*b1cdbd2cSJim Jagielski             }
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski             nTime -= pProfData->nStart;
1407*b1cdbd2cSJim Jagielski             nTime -= pProfData->nContinueTime;
1408*b1cdbd2cSJim Jagielski 
1409*b1cdbd2cSJim Jagielski             if ( nTime < pProfData->nMinTime )
1410*b1cdbd2cSJim Jagielski                 pProfData->nMinTime = nTime;
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski             if ( nTime > pProfData->nMaxTime )
1413*b1cdbd2cSJim Jagielski                 pProfData->nMaxTime = nTime;
1414*b1cdbd2cSJim Jagielski 
1415*b1cdbd2cSJim Jagielski             pProfData->nTime += nTime;
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski             pProfData->nStart         = 0xFFFFFFFF;
1418*b1cdbd2cSJim Jagielski             pProfData->nContinueTime  = 0;
1419*b1cdbd2cSJim Jagielski             pProfData->nContinueStart = 0xFFFFFFFF;
1420*b1cdbd2cSJim Jagielski             break;
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski         case DBG_PROF_CONTINUE:
1423*b1cdbd2cSJim Jagielski             if ( pProfData->nContinueStart != 0xFFFFFFFF )
1424*b1cdbd2cSJim Jagielski             {
1425*b1cdbd2cSJim Jagielski                 pProfData->nContinueTime += ImplGetPerfTime() - pProfData->nContinueStart;
1426*b1cdbd2cSJim Jagielski                 pProfData->nContinueStart = 0xFFFFFFFF;
1427*b1cdbd2cSJim Jagielski             }
1428*b1cdbd2cSJim Jagielski             break;
1429*b1cdbd2cSJim Jagielski 
1430*b1cdbd2cSJim Jagielski         case DBG_PROF_PAUSE:
1431*b1cdbd2cSJim Jagielski             if ( pProfData->nContinueStart == 0xFFFFFFFF )
1432*b1cdbd2cSJim Jagielski                 pProfData->nContinueStart = ImplGetPerfTime();
1433*b1cdbd2cSJim Jagielski             break;
1434*b1cdbd2cSJim Jagielski     }
1435*b1cdbd2cSJim Jagielski }
1436*b1cdbd2cSJim Jagielski 
1437*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1438*b1cdbd2cSJim Jagielski 
DbgXtor(DbgDataType * pDbgData,sal_uInt16 nAction,const void * pThis,DbgUsr fDbgUsr)1439*b1cdbd2cSJim Jagielski void DbgXtor( DbgDataType* pDbgData, sal_uInt16 nAction, const void* pThis,
1440*b1cdbd2cSJim Jagielski               DbgUsr fDbgUsr )
1441*b1cdbd2cSJim Jagielski {
1442*b1cdbd2cSJim Jagielski     DebugData* pData = ImplGetDebugData();
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski     // Verbindung zu Debug-Memory-Manager testen
1445*b1cdbd2cSJim Jagielski #ifdef SV_MEMMGR
1446*b1cdbd2cSJim Jagielski     if ( pData->aDbgData.nTestFlags & DBG_TEST_MEM_XTOR )
1447*b1cdbd2cSJim Jagielski         DbgImpCheckMemory();
1448*b1cdbd2cSJim Jagielski #endif
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski     // Schnell-Test
1451*b1cdbd2cSJim Jagielski     if ( !(pData->aDbgData.nTestFlags & DBG_TEST_XTOR) )
1452*b1cdbd2cSJim Jagielski         return;
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski     XtorType* pXtorData = (XtorType*)pDbgData->pData;
1455*b1cdbd2cSJim Jagielski     if ( !pXtorData )
1456*b1cdbd2cSJim Jagielski     {
1457*b1cdbd2cSJim Jagielski         pDbgData->pData = (void*)new XtorType;
1458*b1cdbd2cSJim Jagielski         pXtorData = (XtorType*)pDbgData->pData;
1459*b1cdbd2cSJim Jagielski         strncpy( pXtorData->aName, pDbgData->pName, DBG_MAXNAME );
1460*b1cdbd2cSJim Jagielski         pXtorData->aName[DBG_MAXNAME] = '\0';
1461*b1cdbd2cSJim Jagielski         pXtorData->nCtorCalls   = 0;
1462*b1cdbd2cSJim Jagielski         pXtorData->nDtorCalls   = 0;
1463*b1cdbd2cSJim Jagielski         pXtorData->nMaxCount    = 0;
1464*b1cdbd2cSJim Jagielski         pXtorData->nStatics     = 0;
1465*b1cdbd2cSJim Jagielski         pXtorData->bTest        = sal_True;
1466*b1cdbd2cSJim Jagielski         pData->pXtorList->Add( (void*)pXtorData );
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski         if ( !ImplDbgFilter( pData->aDbgData.aInclClassFilter, pXtorData->aName, sal_True ) )
1469*b1cdbd2cSJim Jagielski             pXtorData->bTest = sal_False;
1470*b1cdbd2cSJim Jagielski         if ( ImplDbgFilter( pData->aDbgData.aExclClassFilter, pXtorData->aName, sal_False ) )
1471*b1cdbd2cSJim Jagielski             pXtorData->bTest = sal_False;
1472*b1cdbd2cSJim Jagielski     }
1473*b1cdbd2cSJim Jagielski     if ( !pXtorData->bTest )
1474*b1cdbd2cSJim Jagielski         return;
1475*b1cdbd2cSJim Jagielski 
1476*b1cdbd2cSJim Jagielski     sal_Char    aBuf[DBG_BUF_MAXLEN];
1477*b1cdbd2cSJim Jagielski     sal_uInt16      nAct = nAction & ~DBG_XTOR_DTOROBJ;
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski     // Trace (Enter)
1480*b1cdbd2cSJim Jagielski     if ( (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_TRACE) &&
1481*b1cdbd2cSJim Jagielski          !(nAction & DBG_XTOR_DTOROBJ) )
1482*b1cdbd2cSJim Jagielski     {
1483*b1cdbd2cSJim Jagielski         if ( nAct != DBG_XTOR_CHKOBJ )
1484*b1cdbd2cSJim Jagielski         {
1485*b1cdbd2cSJim Jagielski             if ( nAct == DBG_XTOR_CTOR )
1486*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_EnterCtor );
1487*b1cdbd2cSJim Jagielski             else if ( nAct == DBG_XTOR_DTOR )
1488*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_EnterDtor );
1489*b1cdbd2cSJim Jagielski             else
1490*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_EnterMeth );
1491*b1cdbd2cSJim Jagielski             strcat( aBuf, pDbgData->pName );
1492*b1cdbd2cSJim Jagielski             DbgTrace( aBuf );
1493*b1cdbd2cSJim Jagielski         }
1494*b1cdbd2cSJim Jagielski     }
1495*b1cdbd2cSJim Jagielski 
1496*b1cdbd2cSJim Jagielski     // Sind noch Xtor-Tests als Trace an
1497*b1cdbd2cSJim Jagielski     if ( pData->aDbgData.nTestFlags & DBG_TEST_XTOR_EXTRA )
1498*b1cdbd2cSJim Jagielski     {
1499*b1cdbd2cSJim Jagielski         // DBG_CTOR-Aufruf vor allen anderen DBG_XTOR-Aufrufen
1500*b1cdbd2cSJim Jagielski         if ( ((nAction & ~DBG_XTOR_DTOROBJ) != DBG_XTOR_CTOR) && !pDbgData->pData )
1501*b1cdbd2cSJim Jagielski         {
1502*b1cdbd2cSJim Jagielski             strcpy( aBuf, DbgError_Xtor1 );
1503*b1cdbd2cSJim Jagielski             strcat( aBuf, pDbgData->pName );
1504*b1cdbd2cSJim Jagielski             DbgError( aBuf );
1505*b1cdbd2cSJim Jagielski             return;
1506*b1cdbd2cSJim Jagielski         }
1507*b1cdbd2cSJim Jagielski 
1508*b1cdbd2cSJim Jagielski         // Testen, ob This-Pointer gueltig
1509*b1cdbd2cSJim Jagielski         if ( pData->aDbgData.nTestFlags & DBG_TEST_XTOR_THIS )
1510*b1cdbd2cSJim Jagielski         {
1511*b1cdbd2cSJim Jagielski             if ( (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_EXIT) ||
1512*b1cdbd2cSJim Jagielski                  !(nAction & DBG_XTOR_DTOROBJ) )
1513*b1cdbd2cSJim Jagielski             {
1514*b1cdbd2cSJim Jagielski                 // This-Pointer == NULL
1515*b1cdbd2cSJim Jagielski                 if ( !pThis )
1516*b1cdbd2cSJim Jagielski                 {
1517*b1cdbd2cSJim Jagielski                     strcpy( aBuf, DbgError_CtorDtor1 );
1518*b1cdbd2cSJim Jagielski                     strcat( aBuf, pDbgData->pName );
1519*b1cdbd2cSJim Jagielski                     DbgError( aBuf );
1520*b1cdbd2cSJim Jagielski                     return;
1521*b1cdbd2cSJim Jagielski                 }
1522*b1cdbd2cSJim Jagielski 
1523*b1cdbd2cSJim Jagielski                 if ( (nAction & ~DBG_XTOR_DTOROBJ) != DBG_XTOR_CTOR )
1524*b1cdbd2cSJim Jagielski                 {
1525*b1cdbd2cSJim Jagielski                     if ( !pXtorData->aThisList.IsIn( pThis ) )
1526*b1cdbd2cSJim Jagielski                     {
1527*b1cdbd2cSJim Jagielski                         sprintf( aBuf, DbgError_CtorDtor2, pThis );
1528*b1cdbd2cSJim Jagielski                         strcat( aBuf, pDbgData->pName );
1529*b1cdbd2cSJim Jagielski                         DbgError( aBuf );
1530*b1cdbd2cSJim Jagielski                     }
1531*b1cdbd2cSJim Jagielski                 }
1532*b1cdbd2cSJim Jagielski             }
1533*b1cdbd2cSJim Jagielski         }
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski         // Function-Test durchfuehren und Verwaltungsdaten updaten
1536*b1cdbd2cSJim Jagielski         const sal_Char* pMsg = NULL;
1537*b1cdbd2cSJim Jagielski         switch ( nAction & ~DBG_XTOR_DTOROBJ )
1538*b1cdbd2cSJim Jagielski         {
1539*b1cdbd2cSJim Jagielski             case DBG_XTOR_CTOR:
1540*b1cdbd2cSJim Jagielski                 if ( nAction & DBG_XTOR_DTOROBJ )
1541*b1cdbd2cSJim Jagielski                 {
1542*b1cdbd2cSJim Jagielski                     if ( fDbgUsr &&
1543*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_EXIT) &&
1544*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_FUNC) )
1545*b1cdbd2cSJim Jagielski                         pMsg = fDbgUsr( pThis );
1546*b1cdbd2cSJim Jagielski                 }
1547*b1cdbd2cSJim Jagielski                 else
1548*b1cdbd2cSJim Jagielski                 {
1549*b1cdbd2cSJim Jagielski                     pXtorData->nCtorCalls++;
1550*b1cdbd2cSJim Jagielski                     if ( !bDbgImplInMain )
1551*b1cdbd2cSJim Jagielski                         pXtorData->nStatics++;
1552*b1cdbd2cSJim Jagielski                     if ( (pXtorData->nCtorCalls-pXtorData->nDtorCalls) > pXtorData->nMaxCount )
1553*b1cdbd2cSJim Jagielski                         pXtorData->nMaxCount = pXtorData->nCtorCalls - pXtorData->nDtorCalls;
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski                     if ( pData->aDbgData.nTestFlags & DBG_TEST_XTOR_THIS )
1556*b1cdbd2cSJim Jagielski                         pXtorData->aThisList.Add( pThis );
1557*b1cdbd2cSJim Jagielski                 }
1558*b1cdbd2cSJim Jagielski                 break;
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski             case DBG_XTOR_DTOR:
1561*b1cdbd2cSJim Jagielski                 if ( nAction & DBG_XTOR_DTOROBJ )
1562*b1cdbd2cSJim Jagielski                 {
1563*b1cdbd2cSJim Jagielski                     pXtorData->nDtorCalls++;
1564*b1cdbd2cSJim Jagielski                     if ( pData->aDbgData.nTestFlags & DBG_TEST_XTOR_THIS )
1565*b1cdbd2cSJim Jagielski                         pXtorData->aThisList.Remove( pThis );
1566*b1cdbd2cSJim Jagielski                 }
1567*b1cdbd2cSJim Jagielski                 else
1568*b1cdbd2cSJim Jagielski                 {
1569*b1cdbd2cSJim Jagielski                     if ( fDbgUsr &&
1570*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_FUNC) )
1571*b1cdbd2cSJim Jagielski                         pMsg = fDbgUsr( pThis );
1572*b1cdbd2cSJim Jagielski                 }
1573*b1cdbd2cSJim Jagielski                 break;
1574*b1cdbd2cSJim Jagielski 
1575*b1cdbd2cSJim Jagielski             case DBG_XTOR_CHKTHIS:
1576*b1cdbd2cSJim Jagielski             case DBG_XTOR_CHKOBJ:
1577*b1cdbd2cSJim Jagielski                 if ( nAction & DBG_XTOR_DTOROBJ )
1578*b1cdbd2cSJim Jagielski                 {
1579*b1cdbd2cSJim Jagielski                     if ( fDbgUsr &&
1580*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_EXIT) &&
1581*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_FUNC) )
1582*b1cdbd2cSJim Jagielski                         pMsg = fDbgUsr( pThis );
1583*b1cdbd2cSJim Jagielski                 }
1584*b1cdbd2cSJim Jagielski                 else
1585*b1cdbd2cSJim Jagielski                 {
1586*b1cdbd2cSJim Jagielski                     if ( fDbgUsr &&
1587*b1cdbd2cSJim Jagielski                          (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_FUNC) )
1588*b1cdbd2cSJim Jagielski                         pMsg = fDbgUsr( pThis );
1589*b1cdbd2cSJim Jagielski                 }
1590*b1cdbd2cSJim Jagielski                 break;
1591*b1cdbd2cSJim Jagielski         }
1592*b1cdbd2cSJim Jagielski 
1593*b1cdbd2cSJim Jagielski         // Gegebenenfalls Fehlermeldung ausgeben
1594*b1cdbd2cSJim Jagielski         if ( pMsg )
1595*b1cdbd2cSJim Jagielski         {
1596*b1cdbd2cSJim Jagielski             sprintf( aBuf, DbgError_CtorDtor3, pThis );
1597*b1cdbd2cSJim Jagielski             strcat( aBuf, pDbgData->pName );
1598*b1cdbd2cSJim Jagielski             strcat( aBuf, ": \n" );
1599*b1cdbd2cSJim Jagielski             strcat( aBuf, pMsg );
1600*b1cdbd2cSJim Jagielski             DbgError( aBuf );
1601*b1cdbd2cSJim Jagielski         }
1602*b1cdbd2cSJim Jagielski     }
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski     // Trace (Leave)
1605*b1cdbd2cSJim Jagielski     if ( (pData->aDbgData.nTestFlags & DBG_TEST_XTOR_TRACE) &&
1606*b1cdbd2cSJim Jagielski          (nAction & DBG_XTOR_DTOROBJ) )
1607*b1cdbd2cSJim Jagielski     {
1608*b1cdbd2cSJim Jagielski         if ( nAct != DBG_XTOR_CHKOBJ )
1609*b1cdbd2cSJim Jagielski         {
1610*b1cdbd2cSJim Jagielski             if ( nAct == DBG_XTOR_CTOR )
1611*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_LeaveCtor );
1612*b1cdbd2cSJim Jagielski             else if ( nAct == DBG_XTOR_DTOR )
1613*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_LeaveDtor );
1614*b1cdbd2cSJim Jagielski             else
1615*b1cdbd2cSJim Jagielski                 strcpy( aBuf, DbgTrace_LeaveMeth );
1616*b1cdbd2cSJim Jagielski             strcat( aBuf, pDbgData->pName );
1617*b1cdbd2cSJim Jagielski             DbgTrace( aBuf );
1618*b1cdbd2cSJim Jagielski         }
1619*b1cdbd2cSJim Jagielski     }
1620*b1cdbd2cSJim Jagielski }
1621*b1cdbd2cSJim Jagielski 
1622*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1623*b1cdbd2cSJim Jagielski 
DbgOut(const sal_Char * pMsg,sal_uInt16 nDbgOut,const sal_Char * pFile,sal_uInt16 nLine)1624*b1cdbd2cSJim Jagielski void DbgOut( const sal_Char* pMsg, sal_uInt16 nDbgOut, const sal_Char* pFile, sal_uInt16 nLine )
1625*b1cdbd2cSJim Jagielski {
1626*b1cdbd2cSJim Jagielski     static sal_Bool bIn = sal_False;
1627*b1cdbd2cSJim Jagielski     if ( bIn )
1628*b1cdbd2cSJim Jagielski         return;
1629*b1cdbd2cSJim Jagielski     bIn = sal_True;
1630*b1cdbd2cSJim Jagielski 
1631*b1cdbd2cSJim Jagielski     DebugData*  pData = GetDebugData();
1632*b1cdbd2cSJim Jagielski     sal_Char const *   pStr;
1633*b1cdbd2cSJim Jagielski     sal_uIntPtr       nOut;
1634*b1cdbd2cSJim Jagielski     int         nBufLen = 0;
1635*b1cdbd2cSJim Jagielski 
1636*b1cdbd2cSJim Jagielski     if ( nDbgOut == DBG_OUT_ERROR )
1637*b1cdbd2cSJim Jagielski     {
1638*b1cdbd2cSJim Jagielski         nOut = pData->aDbgData.nErrorOut;
1639*b1cdbd2cSJim Jagielski         pStr = "Error: ";
1640*b1cdbd2cSJim Jagielski         if ( pData->aDbgData.nErrorOut == DBG_OUT_FILE )
1641*b1cdbd2cSJim Jagielski             DbgDebugBeep();
1642*b1cdbd2cSJim Jagielski     }
1643*b1cdbd2cSJim Jagielski     else if ( nDbgOut == DBG_OUT_WARNING )
1644*b1cdbd2cSJim Jagielski     {
1645*b1cdbd2cSJim Jagielski         nOut = pData->aDbgData.nWarningOut;
1646*b1cdbd2cSJim Jagielski         pStr = "Warning: ";
1647*b1cdbd2cSJim Jagielski     }
1648*b1cdbd2cSJim Jagielski     else
1649*b1cdbd2cSJim Jagielski     {
1650*b1cdbd2cSJim Jagielski         nOut = pData->aDbgData.nTraceOut;
1651*b1cdbd2cSJim Jagielski         pStr = NULL;
1652*b1cdbd2cSJim Jagielski     }
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_NULL )
1655*b1cdbd2cSJim Jagielski     {
1656*b1cdbd2cSJim Jagielski         bIn = sal_False;
1657*b1cdbd2cSJim Jagielski         return;
1658*b1cdbd2cSJim Jagielski     }
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski     if ( ImplDbgFilterMessage( pMsg ) )
1661*b1cdbd2cSJim Jagielski     {
1662*b1cdbd2cSJim Jagielski         bIn = sal_False;
1663*b1cdbd2cSJim Jagielski         return;
1664*b1cdbd2cSJim Jagielski     }
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski     ImplDbgLock();
1667*b1cdbd2cSJim Jagielski 
1668*b1cdbd2cSJim Jagielski     sal_Char aBufOut[DBG_BUF_MAXLEN];
1669*b1cdbd2cSJim Jagielski     if ( pStr )
1670*b1cdbd2cSJim Jagielski     {
1671*b1cdbd2cSJim Jagielski         strcpy( aBufOut, pStr );
1672*b1cdbd2cSJim Jagielski         nBufLen = strlen( pStr );
1673*b1cdbd2cSJim Jagielski     }
1674*b1cdbd2cSJim Jagielski     else
1675*b1cdbd2cSJim Jagielski         aBufOut[0] = '\0';
1676*b1cdbd2cSJim Jagielski 
1677*b1cdbd2cSJim Jagielski     int nMsgLen = strlen( pMsg );
1678*b1cdbd2cSJim Jagielski     if ( nBufLen+nMsgLen > DBG_BUF_MAXLEN )
1679*b1cdbd2cSJim Jagielski     {
1680*b1cdbd2cSJim Jagielski         int nCopyLen = DBG_BUF_MAXLEN-nBufLen-3;
1681*b1cdbd2cSJim Jagielski         strncpy( &(aBufOut[nBufLen]), pMsg, nCopyLen );
1682*b1cdbd2cSJim Jagielski         strcpy( &(aBufOut[nBufLen+nCopyLen]), "..." );
1683*b1cdbd2cSJim Jagielski     }
1684*b1cdbd2cSJim Jagielski     else
1685*b1cdbd2cSJim Jagielski         strcpy( &(aBufOut[nBufLen]), pMsg );
1686*b1cdbd2cSJim Jagielski 
1687*b1cdbd2cSJim Jagielski     if ( pFile && nLine && (nBufLen+nMsgLen < DBG_BUF_MAXLEN) )
1688*b1cdbd2cSJim Jagielski     {
1689*b1cdbd2cSJim Jagielski         if ( nOut == DBG_OUT_MSGBOX )
1690*b1cdbd2cSJim Jagielski             strcat( aBufOut, "\n" );
1691*b1cdbd2cSJim Jagielski         else
1692*b1cdbd2cSJim Jagielski             strcat( aBufOut, " " );
1693*b1cdbd2cSJim Jagielski         strcat( aBufOut, "From File " );
1694*b1cdbd2cSJim Jagielski         strcat( aBufOut, pFile );
1695*b1cdbd2cSJim Jagielski         strcat( aBufOut, " at Line " );
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski         // Line in String umwandeln und dranhaengen
1698*b1cdbd2cSJim Jagielski         sal_Char    aLine[9];
1699*b1cdbd2cSJim Jagielski         sal_Char*   pLine = &aLine[7];
1700*b1cdbd2cSJim Jagielski         sal_uInt16      i;
1701*b1cdbd2cSJim Jagielski         memset( aLine, 0, sizeof( aLine ) );
1702*b1cdbd2cSJim Jagielski         do
1703*b1cdbd2cSJim Jagielski         {
1704*b1cdbd2cSJim Jagielski             i = nLine % 10;
1705*b1cdbd2cSJim Jagielski             pLine--;
1706*b1cdbd2cSJim Jagielski             *(pLine) = (sal_Char)i + 48;
1707*b1cdbd2cSJim Jagielski             nLine /= 10;
1708*b1cdbd2cSJim Jagielski         }
1709*b1cdbd2cSJim Jagielski         while ( nLine );
1710*b1cdbd2cSJim Jagielski         strcat( aBufOut, pLine );
1711*b1cdbd2cSJim Jagielski     }
1712*b1cdbd2cSJim Jagielski 
1713*b1cdbd2cSJim Jagielski     if ( ( nOut >= DBG_OUT_USER_CHANNEL_0 ) && ( nOut - DBG_OUT_USER_CHANNEL_0 < pData->aDbgPrintUserChannels.size() ) )
1714*b1cdbd2cSJim Jagielski     {
1715*b1cdbd2cSJim Jagielski         DbgPrintLine pPrinter = pData->aDbgPrintUserChannels[ nOut - DBG_OUT_USER_CHANNEL_0 ];
1716*b1cdbd2cSJim Jagielski         if ( pPrinter )
1717*b1cdbd2cSJim Jagielski             pPrinter( aBufOut );
1718*b1cdbd2cSJim Jagielski         else
1719*b1cdbd2cSJim Jagielski             nOut = DBG_OUT_DEBUGGER;
1720*b1cdbd2cSJim Jagielski     }
1721*b1cdbd2cSJim Jagielski 
1722*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_ABORT )
1723*b1cdbd2cSJim Jagielski     {
1724*b1cdbd2cSJim Jagielski         if ( pData->pDbgAbort != NULL )
1725*b1cdbd2cSJim Jagielski             pData->pDbgAbort( aBufOut );
1726*b1cdbd2cSJim Jagielski         abort();
1727*b1cdbd2cSJim Jagielski     }
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_DEBUGGER )
1730*b1cdbd2cSJim Jagielski     {
1731*b1cdbd2cSJim Jagielski         if ( !ImplActivateDebugger( aBufOut ) )
1732*b1cdbd2cSJim Jagielski             nOut = DBG_OUT_TESTTOOL;
1733*b1cdbd2cSJim Jagielski     }
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_TESTTOOL )
1736*b1cdbd2cSJim Jagielski     {
1737*b1cdbd2cSJim Jagielski         if ( pData->pDbgPrintTestTool )
1738*b1cdbd2cSJim Jagielski             pData->pDbgPrintTestTool( aBufOut );
1739*b1cdbd2cSJim Jagielski         else
1740*b1cdbd2cSJim Jagielski             nOut = DBG_OUT_MSGBOX;
1741*b1cdbd2cSJim Jagielski     }
1742*b1cdbd2cSJim Jagielski 
1743*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_MSGBOX )
1744*b1cdbd2cSJim Jagielski     {
1745*b1cdbd2cSJim Jagielski         if ( pData->pDbgPrintMsgBox )
1746*b1cdbd2cSJim Jagielski             pData->pDbgPrintMsgBox( aBufOut );
1747*b1cdbd2cSJim Jagielski         else
1748*b1cdbd2cSJim Jagielski             nOut = DBG_OUT_WINDOW;
1749*b1cdbd2cSJim Jagielski     }
1750*b1cdbd2cSJim Jagielski 
1751*b1cdbd2cSJim Jagielski     if ( nOut == DBG_OUT_WINDOW )
1752*b1cdbd2cSJim Jagielski     {
1753*b1cdbd2cSJim Jagielski         if ( pData->pDbgPrintWindow )
1754*b1cdbd2cSJim Jagielski             pData->pDbgPrintWindow( aBufOut );
1755*b1cdbd2cSJim Jagielski         else
1756*b1cdbd2cSJim Jagielski             nOut = DBG_OUT_FILE;
1757*b1cdbd2cSJim Jagielski     }
1758*b1cdbd2cSJim Jagielski 
1759*b1cdbd2cSJim Jagielski     switch ( nOut )
1760*b1cdbd2cSJim Jagielski     {
1761*b1cdbd2cSJim Jagielski     case DBG_OUT_SHELL:
1762*b1cdbd2cSJim Jagielski         DbgPrintShell( aBufOut );
1763*b1cdbd2cSJim Jagielski         break;
1764*b1cdbd2cSJim Jagielski     case DBG_OUT_FILE:
1765*b1cdbd2cSJim Jagielski         ImplDbgPrintFile( aBufOut );
1766*b1cdbd2cSJim Jagielski         break;
1767*b1cdbd2cSJim Jagielski     }
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski     ImplDbgUnlock();
1770*b1cdbd2cSJim Jagielski 
1771*b1cdbd2cSJim Jagielski     bIn = sal_False;
1772*b1cdbd2cSJim Jagielski }
1773*b1cdbd2cSJim Jagielski 
DbgPrintShell(char const * message)1774*b1cdbd2cSJim Jagielski void DbgPrintShell(char const * message) {
1775*b1cdbd2cSJim Jagielski     fprintf(stderr, "%s\n", message);
1776*b1cdbd2cSJim Jagielski #if defined WNT
1777*b1cdbd2cSJim Jagielski     OutputDebugStringA(message);
1778*b1cdbd2cSJim Jagielski #endif
1779*b1cdbd2cSJim Jagielski }
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1782*b1cdbd2cSJim Jagielski 
DbgOutTypef(sal_uInt16 nDbgOut,const sal_Char * pFStr,...)1783*b1cdbd2cSJim Jagielski void DbgOutTypef( sal_uInt16 nDbgOut, const sal_Char* pFStr, ... )
1784*b1cdbd2cSJim Jagielski {
1785*b1cdbd2cSJim Jagielski     va_list pList;
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski     va_start( pList, pFStr );
1788*b1cdbd2cSJim Jagielski     sal_Char aBuf[DBG_BUF_MAXLEN];
1789*b1cdbd2cSJim Jagielski     vsprintf( aBuf, pFStr, pList );
1790*b1cdbd2cSJim Jagielski     va_end( pList );
1791*b1cdbd2cSJim Jagielski 
1792*b1cdbd2cSJim Jagielski     DbgOut( aBuf, nDbgOut );
1793*b1cdbd2cSJim Jagielski }
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1796*b1cdbd2cSJim Jagielski 
DbgOutf(const sal_Char * pFStr,...)1797*b1cdbd2cSJim Jagielski void DbgOutf( const sal_Char* pFStr, ... )
1798*b1cdbd2cSJim Jagielski {
1799*b1cdbd2cSJim Jagielski     va_list pList;
1800*b1cdbd2cSJim Jagielski 
1801*b1cdbd2cSJim Jagielski     va_start( pList, pFStr );
1802*b1cdbd2cSJim Jagielski     sal_Char aBuf[DBG_BUF_MAXLEN];
1803*b1cdbd2cSJim Jagielski     vsprintf( aBuf, pFStr, pList );
1804*b1cdbd2cSJim Jagielski     va_end( pList );
1805*b1cdbd2cSJim Jagielski 
1806*b1cdbd2cSJim Jagielski     DbgOut( aBuf );
1807*b1cdbd2cSJim Jagielski }
1808*b1cdbd2cSJim Jagielski 
1809*b1cdbd2cSJim Jagielski // =======================================================================
1810*b1cdbd2cSJim Jagielski 
1811*b1cdbd2cSJim Jagielski #else
1812*b1cdbd2cSJim Jagielski 
DbgFunc(sal_uInt16,void *)1813*b1cdbd2cSJim Jagielski void* DbgFunc( sal_uInt16, void* ) { return NULL; }
1814*b1cdbd2cSJim Jagielski 
DbgProf(sal_uInt16,DbgDataType *)1815*b1cdbd2cSJim Jagielski void DbgProf( sal_uInt16, DbgDataType* ) {}
DbgXtor(DbgDataType *,sal_uInt16,const void *,DbgUsr)1816*b1cdbd2cSJim Jagielski void DbgXtor( DbgDataType*, sal_uInt16, const void*, DbgUsr ) {}
1817*b1cdbd2cSJim Jagielski 
DbgOut(const sal_Char *,sal_uInt16,const sal_Char *,sal_uInt16)1818*b1cdbd2cSJim Jagielski void DbgOut( const sal_Char*, sal_uInt16, const sal_Char*, sal_uInt16 ) {}
DbgOutTypef(sal_uInt16,const sal_Char *,...)1819*b1cdbd2cSJim Jagielski void DbgOutTypef( sal_uInt16, const sal_Char*, ... ) {}
DbgOutf(const sal_Char *,...)1820*b1cdbd2cSJim Jagielski void DbgOutf( const sal_Char*, ... ) {}
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski #endif
1823