diff options
Diffstat (limited to 'private/windows/diamond/asrt.h')
-rw-r--r-- | private/windows/diamond/asrt.h | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/private/windows/diamond/asrt.h b/private/windows/diamond/asrt.h new file mode 100644 index 000000000..b9f56c6c2 --- /dev/null +++ b/private/windows/diamond/asrt.h @@ -0,0 +1,304 @@ +/*** asrt.h - Definitions for 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 Lifted old code from 1988 PSCHAR.EXE + * 14-Aug-1993 bens Added Get/Set functions + * 01-Sep-1993 bens Added AssertSub function + * 10-Feb-1994 bens Added Set/ClearAssertSignature + * 15-Mar-1994 bens Put back AssertMessage macro + * + * Notes: + * o Every data structure must have a signature as first member. + * o Signatures MUST be unique over all structures. + * o sigBAD is a reserved signature. + * o When freeing a structure, blast the signature field with sigBAD. + * o Put an AssertXXX prior to dereferencing any pointer. + * o Signatures in structures and private Assert definitions should only + * be generated if ASSERT is defined. + * + * Functions available in ASSERT build: + * AssertRegisterFunc - Register assertion failure call back function + * AssertGetFunc - Get registered call back function + * + * AssertSetFlags - Set Assertion Manager flags + * AssertGetFlags - Get Assertion Manager flags + * + * Assert - Check that parameter is TRUE + * AssertSub - Check that parameter is TRUE, take explicit filename & line number + * AssertStrucure - Check that pointer points to specified structure + * AssertForce - Force an assertion failure + * AssertErrPath - Error Path assertion failure + * + * SetAssertSignature - Set the signature for a structure + * ClearAssertSignature - Clear the signature for a structure + * + * Other definitions available in ASSERT build: + * PFNASSERTFAILURE - Assertion failure call back function type + * FNASSERTFAILURE - Macro to simplify declaration of call back function + * SIGNATURE - Structure signature type + */ + +#ifndef INCLUDED_ASSERT +#define INCLUDED_ASSERT 1 + +#ifdef _DEBUG +#ifndef ASSERT +#define ASSERT 1 +#endif // !ASSERT +#endif // _DEBUG + +#ifdef ASSERT + +typedef unsigned long ASSERTFLAGS; /* asf - Assertion Manager Flags */ +#define asfNONE 0x00 +#define asfSKIP_ERROR_PATH_ASSERTS 0x01 /* Some clients may wish to set + * assertions in error paths, to + * ensure that the problem is + * noticed in a debug build. But, + * in order to support automated + * testing of error paths, these + * assertions must be disabled. + * This flag allows a test program + * to disable these informational + * asserts! + */ + +typedef unsigned long SIGNATURE; /* sig - structure signature */ +typedef SIGNATURE *PSIGNATURE; /* psig */ +#define sigBAD 0 // Invalid signature for ALL structs + +/*** MAKESIG - construct a structure signature + * + * Entry: + * ch1,ch2,ch3,ch4 - four characters + * + * Exit: + * returns SIGNATURE + */ +#define MAKESIG(ch1,ch2,ch3,ch4) \ + ( ((SIGNATURE)ch1) + \ + (((SIGNATURE)ch2)<< 8) + \ + (((SIGNATURE)ch3)<<16) + \ + (((SIGNATURE)ch4)<<24) ) + +/*** AssertMessage -- Force an Assertion with supplied message + * + * Entry: + * pszMsg -- message to display + * + * Exit: + * none + */ + +#define AssertMessage(pszMsg) AssertForce(pszMsg,__FILE__,__LINE__) + + +/*** PFNASSERTFAILURE - Assertion Failure call back function + *** FNASSERTFAILURE - Define Assertion Failure call back function + * + * Entry: + * pszMsg - Description of failure + * pszFile - File where assertion failed + * iLine - Line number in file where assertion failed + * + * Exit-Success: + * Returns; ignore failure and continue + * + * Exit-Failure: + * Function does not return, but cleans up and exits program. + */ +typedef void (*PFNASSERTFAILURE)(char *pszMsg, char *pszFile, int iLine); +#define FNASSERTFAILURE(fn) void fn(char *pszMsg, char *pszFile, int iLine) + + +/*** AssertRegisterFunc - Register assertion failure call back function + * + * Entry: + * pfnaf - Call back function + * + * Exit-Success: + * Returns; pfnaf is stored in the Assertion Manager + * + * NOTES: + * (1) This function *must* be called prior to executing an assertion + * checks. If not, and an assertion check fails, then the Assertion + * Manager will sit in a spin loop to catch the developer's attention. + */ +void AssertRegisterFunc(PFNASSERTFAILURE pfnaf); + + +/*** AssertGetFunc - Get current assertion failure call back function + * + * Entry: + * none + * + * Exit-Success: + * Returns current call back function registerd in Assertion Manager. + */ +PFNASSERTFAILURE AssertGetFunc(void); + + +/*** AssertSetFlags - Set special assertion control flags + * + * Entry: + * flags - Set with combination of asfXXXX flags + * + * Exit-Success: + * Returns; Flags are modified in Assertion Manager. + */ +void AssertSetFlags(ASSERTFLAGS asf); + + +/*** AssertGetFlags - Get special assertion control flags + * + * Entry: + * none + * + * Exit-Success: + * Returns current Assertion Manager flags. + */ +ASSERTFLAGS AssertGetFlags(void); + + +/*** Assert - Check assertion that argument is true + * + * Entry: + * b - Boolean value to check + * + * Exit-Success: + * Returns; b was TRUE + * + * Exit-Failure: + * Calls assertion failure callback function; b was FALSE + */ +#define Assert(b) AsrtCheck(b,__FILE__,__LINE__) + + +/*** AssertSub - Check assertion, use passed in filename and line number + * + * Entry: + * b - Boolean value to check + * pszFile - File where assertion occurred + * iLine - Line in file where assertion occurred + * + * Exit-Success: + * Returns; b was TRUE + * + * Exit-Failure: + * Calls assertion failure callback function; b was FALSE + */ +#define AssertSub(b,pszFile,iLine) AsrtCheck(b,pszFile,iLine) + + +/*** AssertStructure - Check assertion that pointer is of correct type + * + * Entry: + * pv - Pointer to structure + * sig - Expected signature + * + * Exit-Success: + * Returns; pv != NULL, and pv->sig == sig. + * + * Exit-Failure: + * Calls assertion failure callback function; pv was bad. + */ +#define AssertStructure(pv,sig) AsrtStruct(pv, sig, __FILE__, __LINE__) + + +/*** AssertForce - Force an assertion failure + * + * Entry: + * pszMsg - Message to display + * pszFile - File where assertion occurred + * iLine - Line in file where assertion occurred + * + * Exit-Success: + * Returns; client wanted to ignore assertion. + * + * Exit-Failure: + * Does not return. + */ +void AssertForce(char *pszMsg, char *pszFile, int iLine); + + +/*** AssertErrorPath - Report an internal error path + * + * Entry: + * pszMsg - Message to display + * pszFile - File where assertion occurred + * iLine - Line in file where assertion occurred + * + * Exit-Success: + * Returns; client wanted to ignore assertion. + * + * Exit-Failure: + * Does not return. + */ +void AssertErrPath(char *pszMsg, char *pszFile, int iLine); + + +/*** SetAssertSignature - Set the signature for a structure + * + * Entry: + * p - Structure with member "sigValue" + * sig - Signature to set + * + * Exit: + * p->sig = sig + */ +#define SetAssertSignature(p,sigValue) p->sig = sigValue + + +/*** ClearAssertSignature - Clear the signature for a structure + * + * Entry: + * p - Structure with member "sig" + * + * Exit: + * p->sig = sigBAD + */ +#define ClearAssertSignature(p) p->sig = sigBAD + + +//** Internal assertion manager worker routines + +void AsrtCheck(BOOL f, char *pszFile, int iLine); +void AsrtStruct(void *pv, SIGNATURE sig, char *pszFile, int iLine); + + +#else // !ASSERT + +//** Assertion checking is turned off, so it all evaporates! + +#define FNASSERTFAILURE(fn) +#define AssertRegisterFunc(pfnaf) +#define Assert(b) +#define AssertSub(b,pszFile,iLine) +#define AssertStructure(pv,sig) +#define AssertMessage(pszMsg) +#define AssertForce(pszMsg,pszFile,iLine) +#define AssertErrPath(pszMsg,pszFile,iLine) +#define SetAssertSignature(p,sig) +#define ClearAssertSignature(p) + +/** The following functions are not defined away, because any valid use + * of them requires a typedef'd variable or function that is not available + * in a non-ASSERT build. So we don't define them so that if a client + * has used these outside of an #ifdef ASSERT, a compiler error/warning + * will be generated: + * + * AssertGetFunc + * AssertSetFlags + * AssertGetFlags + */ + +#endif // ASSERT +#endif // !INCLUDED_ASSERT |