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