/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : WWDebug * * * * $Archive:: /Commando/Code/wwdebug/wwdebug.h $* * * * $Author:: Jani_p $* * * * $Modtime:: 9/03/01 1:59p $* * * * $Revision:: 19 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 #ifndef WWDEBUG_H #define WWDEBUG_H // The macro MESSAGE allows user to put: // #pragma MESSAGE("Hello world") // anywhere in a source file. The message: // sourcefname.cpp (123) : Hello world // would be printed if put in sourcefname.cpp on line 123 in compile window like an error. // You can then use next/prev error hot keys to see where comment is. It is not an error and // will be printed everytime it is compiled. Very useful to put comments in code that cannot // be forgoten. #define STRING_IT(a) #a #define TOKEN_IT(a) STRING_IT(,##a) #define MESSAGE(a) message (__FILE__ "(" TOKEN_IT(__LINE__) ") : " a) void Convert_System_Error_To_String(int error_id, char* buffer, int buf_len); int Get_Last_System_Error(); /* ** If 'WWDEBUG' is turned off, all WWDEBUG_xxx macros will ** be discarded. */ typedef enum { WWDEBUG_TYPE_INFORMATION, WWDEBUG_TYPE_WARNING, WWDEBUG_TYPE_ERROR, WWDEBUG_TYPE_USER } DebugType; typedef void (*PrintFunc)(DebugType type, const char * message); typedef void (*AssertPrintFunc)(const char * message); typedef bool (*TriggerFunc)(int trigger_num); typedef void (*ProfileFunc)(const char * title); PrintFunc WWDebug_Install_Message_Handler(PrintFunc func); AssertPrintFunc WWDebug_Install_Assert_Handler(AssertPrintFunc func); TriggerFunc WWDebug_Install_Trigger_Handler(TriggerFunc func); ProfileFunc WWDebug_Install_Profile_Start_Handler(ProfileFunc func); ProfileFunc WWDebug_Install_Profile_Stop_Handler(ProfileFunc func); /* ** Users should not call the following three functions directly! Use the macros below instead... */ void WWDebug_Printf(const char * format,...); void WWDebug_Printf_Warning(const char * format,...); void WWDebug_Printf_Error(const char * format,...); #ifdef WWDEBUG void WWDebug_Assert_Fail(const char * expr,const char * file, int line); void WWDebug_Assert_Fail_Print(const char * expr,const char * file, int line,const char * string); bool WWDebug_Check_Trigger(int trigger_num); void WWDebug_Profile_Start( const char * title); void WWDebug_Profile_Stop( const char * title); /* ** A message handler to display to DBWIN32 */ void WWDebug_DBWin32_Message_Handler( const char * message); #endif /* ** Use the following #define so that all of the debugging messages ** and strings go away when the release version is built. ** WWDEBUG_SAY(("dir = %f\n",dir)); */ #ifdef WWDEBUG #define WWDEBUG_SAY(x) WWDebug_Printf x #define WWDEBUG_WARNING(x) WWDebug_Printf_Warning x #define WWDEBUG_ERROR(x) WWDebug_Printf_Error x #else #define WWDEBUG_SAY(x) #define WWDEBUG_WARNING(x) #define WWDEBUG_ERROR(x) #endif #define WWRELEASE_SAY(x) WWDebug_Printf x #define WWRELEASE_WARNING(x) WWDebug_Printf_Warning x #define WWRELEASE_ERROR(x) WWDebug_Printf_Error x /* ** The WWASSERT and WWASSERT_PRINT macros will send messages to your ** assert handler. */ #ifdef WWDEBUG #define WWASSERT(expr) ((expr)?(void)0:WWDebug_Assert_Fail(#expr,__FILE__,__LINE__)) #define WWASSERT_PRINT( expr, string ) ((expr)?(void)0:WWDebug_Assert_Fail_Print(#expr,__FILE__,__LINE__,string)) #define DIE (WWDebug_Assert_Fail("DIE",__FILE__,__LINE__)) #else #define WWASSERT( expr ) #define WWASSERT_PRINT( expr, string ) #define DIE #endif /* ** The WWDEBUG_BREAK macro will cause the application to break into ** the debugger... */ #ifdef WWDEBUG #define WWDEBUG_BREAK _asm int 0x03 #else #define WWDEBUG_BREAK _asm int 0x03 #endif /* ** The WWDEBUG_TRIGGER macro can be used to ask the application if ** a debug trigger is set. We define a couple of generic triggers ** for casual use. */ #define WWDEBUG_TRIGGER_GENERIC0 0 #define WWDEBUG_TRIGGER_GENERIC1 1 #ifdef WWDEBUG #define WWDEBUG_TRIGGER(x) WWDebug_Check_Trigger(x) #else #define WWDEBUG_TRIGGER(x) (0) #endif /* ** The WWDEBUG_PROFILE macros can be used to time blocks of code */ #ifdef WWDEBUG #define WWDEBUG_PROFILE_START(x) WWDebug_Profile_Start(x) #define WWDEBUG_PROFILE_STOP(x) WWDebug_Profile_Stop(x) #else #define WWDEBUG_PROFILE_START(x) #define WWDEBUG_PROFILE_STOP(x) #endif #endif