/*** asrt.c - Assertion Manager
*
* Microsoft Confidential
* Copyright (C) Microsoft Corporation 1993-1994
* All Rights Reserved.
*
* Author:
* Benjamin W. Slivka
*
* History:
* 10-Aug-1993 bens Initial version
* 11-Aug-1993 bens Lift code from 1988 PSCHAR.EXE
* 12-Aug-1993 bens Improve documentation, move messages to asrt.msg
* 14-Aug-1993 bens Add assertion flags, query calls
*
* Functions available in ASSERT build:
* AssertRegisterFunc - Register assertion failure call back function
* AsrtCheck - Check that parameter is TRUE
* AsrtStruct - Check that pointer points to specified structure
* AssertForce - Force an assertion failure
*/
#include "types.h"
#include "asrt.h"
#ifdef ASSERT // Must be after asrt.h!
#include "asrt.msg"
void doFailure(char *pszMsg, char *pszFile, int iLine);
STATIC PFNASSERTFAILURE pfnafClient=NULL; // Assertion call back function
STATIC ASSERTFLAGS asfClient=asfNONE; // Assertion flags
/*** AssertRegisterFunc - Register assertion failure call back function
*
* NOTE: See asrt.h for entry/exit conditions.
*/
void AssertRegisterFunc(PFNASSERTFAILURE pfnaf)
{
pfnafClient = pfnaf; // Store for future use
}
/*** AssertGetFunc - Get current assertion failure call back function
*
* NOTE: See asrt.h for entry/exit conditions.
*/
PFNASSERTFAILURE AssertGetFunc(void)
{
return pfnafClient;
}
/*** AssertSetFlags - Set special assertion control flags
*
* NOTE: See asrt.h for entry/exit conditions.
*/
void AssertSetFlags(ASSERTFLAGS asf)
{
asfClient = asf;
}
/*** AssertGetFlags - Get special assertion control flags
*
* NOTE: See asrt.h for entry/exit conditions.
*/
ASSERTFLAGS AssertGetFlags(void)
{
return asfClient;
}
/*** AsrtCheck - Check assertion that argument is TRUE
*
* Entry:
* f - Boolean value to check
* pszFile - name of source file
* iLine - source line number
*
* Exit-Success:
* Returns; f was TRUE
*
* Exit-Failure:
* Calls assertion failure callback function; f was false.
*/
void AsrtCheck(BOOL f, char *pszFile, int iLine)
{
if (!f) {
doFailure(pszASRTERR_FALSE,pszFile,iLine); // Inform client
// Client returned, ignore error!
}
}
/*** AsrtStruct - Check assertion that pointer is of correct type
*
* Entry:
* pv - Pointer to structure
* sig - Expected signature
* pszFile - name of source file
* iLine - source line number
*
* Exit-Success:
* Returns; pv != NULL, and pv->sig == sig.
*
* Exit-Failure:
* Calls assertion failure callback function; pv was bad.
*/
void AsrtStruct(void *pv, SIGNATURE sig, char *pszFile, int iLine)
{
if (pv == NULL) {
doFailure(pszASRTERR_NULL_POINTER,pszFile,iLine); // Inform client
// Client returned, ignore error!
}
else if (*((PSIGNATURE)pv) != sig) {
(*pfnafClient)(pszASRTERR_SIGNATURE_BAD,pszFile,iLine);// Inform client
// Client returned, ignore error!
}
}
/*** AssertForce - Force an assertion failure
*
* NOTE: See asrt.h for entry/exit conditions.
*/
void AssertForce(char *pszMsg, char *pszFile, int iLine)
{
doFailure(pszMsg,pszFile,iLine); // Inform client
// Client returned, ignore error!
}
/*** AssertErrPath - Report an internal error path
*
* NOTE: See asrt.h for entry/exit conditions.
*/
void AssertErrPath(char *pszMsg, char *pszFile, int iLine)
{
//** Only assert if we are not skipping error path assertions
if (!(asfClient & asfSKIP_ERROR_PATH_ASSERTS)) {
doFailure(pszMsg,pszFile,iLine); // Inform client
}
// Client returned, ignore error!
}
/*** doFailure - Call registered call back function
*
* Entry:
* pszMsg - Message to display
* pszFile - Name of source file
* iLine - Source line number
*
* Exit-Success:
* Returns; client wanted to ignore assertion.
*
* Exit-Failure:
* Does not return.
*/
void doFailure(char *pszMsg, char *pszFile, int iLine)
{
if (pfnafClient == NULL) {
//** Call back not registered!
//
// We don't have any output mechanism of our own, since we
// are platform-independent. So, just spin in a loop and
// hope the developer can break in with a debugger to see
// what is wrong!
for (;;)
;
}
else { //** Call back registered
(*pfnafClient)(pszMsg,pszFile,iLine); // Inform client
}
}
#endif // !ASSERT