1135446Strhodes/* 2224092Sdougb * Copyright (C) 2004-2009 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 1997-2001 Internet Software Consortium. 4135446Strhodes * 5186462Sdougb * Permission to use, copy, modify, and/or distribute this software for any 6135446Strhodes * purpose with or without fee is hereby granted, provided that the above 7135446Strhodes * copyright notice and this permission notice appear in all copies. 8135446Strhodes * 9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11135446Strhodes * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15135446Strhodes * PERFORMANCE OF THIS SOFTWARE. 16135446Strhodes */ 17135446Strhodes 18135446Strhodes/* 19234010Sdougb * $Id: assertions.h,v 1.28 2009/09/29 23:48:04 tbox Exp $ 20135446Strhodes */ 21193149Sdougb/*! \file isc/assertions.h 22170222Sdougb */ 23135446Strhodes 24135446Strhodes#ifndef ISC_ASSERTIONS_H 25135446Strhodes#define ISC_ASSERTIONS_H 1 26135446Strhodes 27135446Strhodes#include <isc/lang.h> 28135446Strhodes#include <isc/platform.h> 29135446Strhodes 30135446StrhodesISC_LANG_BEGINDECLS 31135446Strhodes 32170222Sdougb/*% isc assertion type */ 33135446Strhodestypedef enum { 34135446Strhodes isc_assertiontype_require, 35135446Strhodes isc_assertiontype_ensure, 36135446Strhodes isc_assertiontype_insist, 37135446Strhodes isc_assertiontype_invariant 38135446Strhodes} isc_assertiontype_t; 39135446Strhodes 40135446Strhodestypedef void (*isc_assertioncallback_t)(const char *, int, isc_assertiontype_t, 41135446Strhodes const char *); 42135446Strhodes 43186462Sdougb/* coverity[+kill] */ 44224092SdougbISC_PLATFORM_NORETURN_PRE 45224092Sdougbvoid isc_assertion_failed(const char *, int, isc_assertiontype_t, 46224092Sdougb const char *) ISC_PLATFORM_NORETURN_POST; 47135446Strhodes 48135446Strhodesvoid 49135446Strhodesisc_assertion_setcallback(isc_assertioncallback_t); 50135446Strhodes 51135446Strhodesconst char * 52135446Strhodesisc_assertion_typetotext(isc_assertiontype_t type); 53135446Strhodes 54186462Sdougb#if defined(ISC_CHECK_ALL) || defined(__COVERITY__) 55135446Strhodes#define ISC_CHECK_REQUIRE 1 56135446Strhodes#define ISC_CHECK_ENSURE 1 57135446Strhodes#define ISC_CHECK_INSIST 1 58135446Strhodes#define ISC_CHECK_INVARIANT 1 59135446Strhodes#endif 60135446Strhodes 61186462Sdougb#if defined(ISC_CHECK_NONE) && !defined(__COVERITY__) 62135446Strhodes#define ISC_CHECK_REQUIRE 0 63135446Strhodes#define ISC_CHECK_ENSURE 0 64135446Strhodes#define ISC_CHECK_INSIST 0 65135446Strhodes#define ISC_CHECK_INVARIANT 0 66135446Strhodes#endif 67135446Strhodes 68135446Strhodes#ifndef ISC_CHECK_REQUIRE 69135446Strhodes#define ISC_CHECK_REQUIRE 1 70135446Strhodes#endif 71135446Strhodes 72135446Strhodes#ifndef ISC_CHECK_ENSURE 73135446Strhodes#define ISC_CHECK_ENSURE 1 74135446Strhodes#endif 75135446Strhodes 76135446Strhodes#ifndef ISC_CHECK_INSIST 77135446Strhodes#define ISC_CHECK_INSIST 1 78135446Strhodes#endif 79135446Strhodes 80135446Strhodes#ifndef ISC_CHECK_INVARIANT 81135446Strhodes#define ISC_CHECK_INVARIANT 1 82135446Strhodes#endif 83135446Strhodes 84135446Strhodes#if ISC_CHECK_REQUIRE != 0 85135446Strhodes#define ISC_REQUIRE(cond) \ 86135446Strhodes ((void) ((cond) || \ 87135446Strhodes ((isc_assertion_failed)(__FILE__, __LINE__, \ 88135446Strhodes isc_assertiontype_require, \ 89135446Strhodes #cond), 0))) 90135446Strhodes#else 91135446Strhodes#define ISC_REQUIRE(cond) ((void) 0) 92135446Strhodes#endif /* ISC_CHECK_REQUIRE */ 93135446Strhodes 94135446Strhodes#if ISC_CHECK_ENSURE != 0 95135446Strhodes#define ISC_ENSURE(cond) \ 96135446Strhodes ((void) ((cond) || \ 97135446Strhodes ((isc_assertion_failed)(__FILE__, __LINE__, \ 98135446Strhodes isc_assertiontype_ensure, \ 99135446Strhodes #cond), 0))) 100135446Strhodes#else 101135446Strhodes#define ISC_ENSURE(cond) ((void) 0) 102135446Strhodes#endif /* ISC_CHECK_ENSURE */ 103135446Strhodes 104135446Strhodes#if ISC_CHECK_INSIST != 0 105135446Strhodes#define ISC_INSIST(cond) \ 106135446Strhodes ((void) ((cond) || \ 107135446Strhodes ((isc_assertion_failed)(__FILE__, __LINE__, \ 108135446Strhodes isc_assertiontype_insist, \ 109135446Strhodes #cond), 0))) 110135446Strhodes#else 111135446Strhodes#define ISC_INSIST(cond) ((void) 0) 112135446Strhodes#endif /* ISC_CHECK_INSIST */ 113135446Strhodes 114135446Strhodes#if ISC_CHECK_INVARIANT != 0 115135446Strhodes#define ISC_INVARIANT(cond) \ 116135446Strhodes ((void) ((cond) || \ 117135446Strhodes ((isc_assertion_failed)(__FILE__, __LINE__, \ 118135446Strhodes isc_assertiontype_invariant, \ 119135446Strhodes #cond), 0))) 120135446Strhodes#else 121135446Strhodes#define ISC_INVARIANT(cond) ((void) 0) 122135446Strhodes#endif /* ISC_CHECK_INVARIANT */ 123135446Strhodes 124135446StrhodesISC_LANG_ENDDECLS 125135446Strhodes 126135446Strhodes#endif /* ISC_ASSERTIONS_H */ 127