summaryrefslogblamecommitdiffstats
path: root/private/windows/diamond/asrt.c
blob: 3a1966786622a016d38d4340af062e53a9e18123 (plain) (tree)





















































































































































































                                                                               
/***    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