You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.7 KiB
182 lines
4.7 KiB
/*** 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
|