summaryrefslogtreecommitdiffstats
path: root/private/windows/diamond/asrt.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/windows/diamond/asrt.h')
-rw-r--r--private/windows/diamond/asrt.h304
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