// Copyright (c) 1996-1999 Microsoft Corporation

//+-------------------------------------------------------------------------
//
//  File:       debug.hxx
//
//  Contents:   Debug declarations.
//
//  Classes:
//
//  Functions:  
//
//  History:    18-Nov-96  BillMo      Created.
//
//  Notes:      
//
//  Codework:
//
//--------------------------------------------------------------------------

#if !DBG || defined(lint) || defined(_lint)
#define DBGSTATIC static        // hidden function
#else
#define DBGSTATIC               // visible for use in debugger.
#endif


#if DBG
VOID TrkDebugCreate( ULONG grfFlags, CHAR *ptszModuleName );
VOID TrkDebugDelete( VOID);
#else
#define TrkDebugCreate( grf, ptsz )
#define TrkDebugDelete()
#endif

enum TRK_DBG_FLAGS
{
    TRK_DBG_FLAGS_WRITE_TO_DBG      = 1,
    TRK_DBG_FLAGS_WRITE_TO_FILE     = 2,
    TRK_DBG_FLAGS_APPEND_TO_FILE    = 4,
    TRK_DBG_FLAGS_WRITE_TO_STDOUT   = 8
};

#if DBG == 1

extern CHAR                     TrkGlobalDebugBuffer[ 1024];     //  arbitrary
extern DWORD                    TrkGlobalDebug;

////////////////////////////////////////////////////////////////////////
//
// Debug Definititions
//
////////////////////////////////////////////////////////////////////////


extern CRITICAL_SECTION         g_ProtectLogFile;
extern HANDLE                   g_LogFile;
extern ULONG                    g_grfDebugFlags;
extern CHAR                     g_DebugBuffer[];


//
// Control bits.
//


VOID TrkAssertFailed(
    IN PVOID FailedAssertion,
    IN PVOID FileName,
    IN ULONG LineNumber,
    IN PCHAR Message OPTIONAL
    );

#define TrkAssert( Predicate) \
    { \
        if (!(Predicate)) \
            TrkAssertFailed( #Predicate, __FILE__, __LINE__, NULL ); \
    }

#define TrkVerify TrkAssert

VOID TrkLogErrorRoutine(
    IN      DWORD       DebugFlag,
    IN      HRESULT     hr,
    IN      LPTSTR      Format,         // PRINTF()-STYLE FORMAT STRING. 
    ...                                 // OTHER ARGUMENTS ARE POSSIBLE. 
    );
VOID TrkLogRoutine(
    IN      DWORD       DebugFlag,
    IN      LPTSTR      Format,         // PRINTF()-STYLE FORMAT STRING. 
    ...                                 // OTHER ARGUMENTS ARE POSSIBLE. 
    );
VOID TrkLogErrorRoutineInternal(
    IN      DWORD       DebugFlag,
    IN      LPSTR       pszHR,      
    IN      LPTSTR      Format,
    IN      va_list     Arguments
    );

VOID TrkLogRuntimeList( IN PCHAR Comment);
VOID TrkLogTimeout( IN DWORD timeout);

#define TrkLog( _x_)     TrkLogRoutine _x_

#else //  #if DBG == 1

#define TrkAssert(condition)
#define TrkVerify(condition) condition
#define TrkLog( _x_)
#define TrkLogRuntimeList( _x_)
#define TrkLogTimeout( _x_)

#endif //  #if DBG == 1 ... #else