/************************************************************************************************** FILENAME: ErrMacro.h COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc. DESCRIPTION: Error handling macros. **************************************************************************************************/ #include // set up some aliases #define require(exp) assert(exp) #define ensure(exp) assert(exp) #define invariant(exp) assert(exp) #define LOG_ERR() LogErrForMacro(TEXT(__FILE__), TEXT(__TIMESTAMP__), __LINE__) // handle logging to message window and or error log file void LogErrForMacro(LPTSTR filename, LPTSTR timestamp, UINT lineno); /****************************** EF DEFINITIONS ***************************************/ //EF's will return debugging information in debug mode, but will not compile in for release builds. //If an error occurs, handle and return FALSE #define EF(FunctionCall) \ { \ if (!(FunctionCall)) { \ LOG_ERR(); \ return FALSE; \ } \ } //If an error occurs, handle and continue on without returning #define EH(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ } \ } //If an error occurs, handle and return NULL #define EN(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ return NULL; \ } \ } //If an error occurs, handle and return VOID #define EV(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ return; \ } \ } //If an error occurs, handle and break (not return) #define EB(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ break; \ } \ } //If an error occurs, handle and continue (not return) #define EC(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ continue; \ } \ } //If an error occurs, handle and return E_FAIL #define EE(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ return E_FAIL; \ } \ } //If an error occurs, handle and return -1 #define EM(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ return -1; \ } \ } /****************************** EF DEFINITIONS ***************************************/ //EF_ASSERTS's are the same as EF's, except they assert before returning. //If an error occurs, handle and return FALSE #define EF_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ return FALSE; \ } \ } //If an error occurs, handle and continue on without returning #define EH_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ } \ } //If an error occurs, handle and return NULL #define EN_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ return NULL; \ } \ } //If an error occurs, handle and return VOID #define EV_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ return; \ } \ } //If an error occurs, handle and break (not return) #define EB_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ break; \ } \ } //If an error occurs, handle and continue (not return) #define EC_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ continue; \ } \ } //If an error occurs, handle and return E_FAIL #define EE_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ return E_FAIL; \ } \ } //If an error occurs, handle and return -1 #define EM_ASSERT(FunctionCall) \ { \ if(!(FunctionCall)) { \ LOG_ERR(); \ assert(FALSE); \ return -1; \ } \ }