1258945Sroberto/*
2280849Scy * Copyright (C) 2004-2009  Internet Systems Consortium, Inc. ("ISC")
3258945Sroberto * Copyright (C) 1997-2001  Internet Software Consortium.
4258945Sroberto *
5258945Sroberto * Permission to use, copy, modify, and/or distribute this software for any
6258945Sroberto * purpose with or without fee is hereby granted, provided that the above
7258945Sroberto * copyright notice and this permission notice appear in all copies.
8258945Sroberto *
9258945Sroberto * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10258945Sroberto * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11258945Sroberto * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12258945Sroberto * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13258945Sroberto * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14258945Sroberto * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15258945Sroberto * PERFORMANCE OF THIS SOFTWARE.
16258945Sroberto */
17258945Sroberto
18258945Sroberto/*
19280849Scy * $Id: assertions.h,v 1.28 2009/09/29 23:48:04 tbox Exp $
20258945Sroberto */
21258945Sroberto/*! \file isc/assertions.h
22258945Sroberto */
23258945Sroberto
24258945Sroberto#ifndef ISC_ASSERTIONS_H
25258945Sroberto#define ISC_ASSERTIONS_H 1
26258945Sroberto
27258945Sroberto#include <isc/lang.h>
28258945Sroberto#include <isc/platform.h>
29258945Sroberto
30258945SrobertoISC_LANG_BEGINDECLS
31258945Sroberto
32258945Sroberto/*% isc assertion type */
33258945Srobertotypedef enum {
34258945Sroberto	isc_assertiontype_require,
35258945Sroberto	isc_assertiontype_ensure,
36258945Sroberto	isc_assertiontype_insist,
37258945Sroberto	isc_assertiontype_invariant
38258945Sroberto} isc_assertiontype_t;
39258945Sroberto
40258945Srobertotypedef void (*isc_assertioncallback_t)(const char *, int, isc_assertiontype_t,
41258945Sroberto					const char *);
42258945Sroberto
43258945Sroberto/* coverity[+kill] */
44280849ScyISC_PLATFORM_NORETURN_PRE
45280849Scyvoid isc_assertion_failed(const char *, int, isc_assertiontype_t,
46280849Scy			  const char *) ISC_PLATFORM_NORETURN_POST;
47258945Sroberto
48258945Srobertovoid
49258945Srobertoisc_assertion_setcallback(isc_assertioncallback_t);
50258945Sroberto
51258945Srobertoconst char *
52258945Srobertoisc_assertion_typetotext(isc_assertiontype_t type);
53258945Sroberto
54258945Sroberto#if defined(ISC_CHECK_ALL) || defined(__COVERITY__)
55258945Sroberto#define ISC_CHECK_REQUIRE		1
56258945Sroberto#define ISC_CHECK_ENSURE		1
57258945Sroberto#define ISC_CHECK_INSIST		1
58258945Sroberto#define ISC_CHECK_INVARIANT		1
59258945Sroberto#endif
60258945Sroberto
61258945Sroberto#if defined(ISC_CHECK_NONE) && !defined(__COVERITY__)
62258945Sroberto#define ISC_CHECK_REQUIRE		0
63258945Sroberto#define ISC_CHECK_ENSURE		0
64258945Sroberto#define ISC_CHECK_INSIST		0
65258945Sroberto#define ISC_CHECK_INVARIANT		0
66258945Sroberto#endif
67258945Sroberto
68258945Sroberto#ifndef ISC_CHECK_REQUIRE
69258945Sroberto#define ISC_CHECK_REQUIRE		1
70258945Sroberto#endif
71258945Sroberto
72258945Sroberto#ifndef ISC_CHECK_ENSURE
73258945Sroberto#define ISC_CHECK_ENSURE		1
74258945Sroberto#endif
75258945Sroberto
76258945Sroberto#ifndef ISC_CHECK_INSIST
77258945Sroberto#define ISC_CHECK_INSIST		1
78258945Sroberto#endif
79258945Sroberto
80258945Sroberto#ifndef ISC_CHECK_INVARIANT
81258945Sroberto#define ISC_CHECK_INVARIANT		1
82258945Sroberto#endif
83258945Sroberto
84258945Sroberto#if ISC_CHECK_REQUIRE != 0
85258945Sroberto#define ISC_REQUIRE(cond) \
86258945Sroberto	((void) ((cond) || \
87258945Sroberto		 ((isc_assertion_failed)(__FILE__, __LINE__, \
88258945Sroberto					 isc_assertiontype_require, \
89258945Sroberto					 #cond), 0)))
90258945Sroberto#else
91258945Sroberto#define ISC_REQUIRE(cond)	((void) 0)
92258945Sroberto#endif /* ISC_CHECK_REQUIRE */
93258945Sroberto
94258945Sroberto#if ISC_CHECK_ENSURE != 0
95258945Sroberto#define ISC_ENSURE(cond) \
96258945Sroberto	((void) ((cond) || \
97258945Sroberto		 ((isc_assertion_failed)(__FILE__, __LINE__, \
98258945Sroberto					 isc_assertiontype_ensure, \
99258945Sroberto					 #cond), 0)))
100258945Sroberto#else
101258945Sroberto#define ISC_ENSURE(cond)	((void) 0)
102258945Sroberto#endif /* ISC_CHECK_ENSURE */
103258945Sroberto
104258945Sroberto#if ISC_CHECK_INSIST != 0
105258945Sroberto#define ISC_INSIST(cond) \
106258945Sroberto	((void) ((cond) || \
107258945Sroberto		 ((isc_assertion_failed)(__FILE__, __LINE__, \
108258945Sroberto					 isc_assertiontype_insist, \
109258945Sroberto					 #cond), 0)))
110258945Sroberto#else
111258945Sroberto#define ISC_INSIST(cond)	((void) 0)
112258945Sroberto#endif /* ISC_CHECK_INSIST */
113258945Sroberto
114258945Sroberto#if ISC_CHECK_INVARIANT != 0
115258945Sroberto#define ISC_INVARIANT(cond) \
116258945Sroberto	((void) ((cond) || \
117258945Sroberto		 ((isc_assertion_failed)(__FILE__, __LINE__, \
118258945Sroberto					 isc_assertiontype_invariant, \
119258945Sroberto					 #cond), 0)))
120258945Sroberto#else
121258945Sroberto#define ISC_INVARIANT(cond)	((void) 0)
122258945Sroberto#endif /* ISC_CHECK_INVARIANT */
123258945Sroberto
124258945SrobertoISC_LANG_ENDDECLS
125258945Sroberto
126258945Sroberto#endif /* ISC_ASSERTIONS_H */
127