xref: /netbsd-src/lib/libc/include/isc/assertions.h (revision b5677b36047b601b9addaaa494a58ceae82c2a6c)
1 /*	$NetBSD: assertions.h,v 1.4 2009/02/13 04:01:46 lukem Exp $	*/
2 
3 /*
4  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5  * Copyright (c) 1997-1999 by Internet Software Consortium.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * Id: assertions.h,v 1.3 2005/04/27 04:56:17 sra Exp
22  */
23 
24 #ifndef ASSERTIONS_H
25 #define ASSERTIONS_H		1
26 
27 typedef enum {
28 	assert_require, assert_ensure, assert_insist, assert_invariant
29 } assertion_type;
30 
31 typedef void (*assertion_failure_callback)(const char *, int, assertion_type,
32 					   const char *, int);
33 
34 extern assertion_failure_callback __assertion_failed;
35 void set_assertion_failure_callback(assertion_failure_callback f);
36 const char *assertion_type_to_text(assertion_type type);
37 
38 #ifdef CHECK_ALL
39 #define CHECK_REQUIRE		1
40 #define CHECK_ENSURE		1
41 #define CHECK_INSIST		1
42 #define CHECK_INVARIANT		1
43 #endif
44 
45 #ifdef CHECK_NONE
46 #define CHECK_REQUIRE		0
47 #define CHECK_ENSURE		0
48 #define CHECK_INSIST		0
49 #define CHECK_INVARIANT		0
50 #endif
51 
52 #ifdef _DIAGNOSTIC
53 #ifndef CHECK_REQUIRE
54 #define CHECK_REQUIRE		1
55 #endif
56 
57 #ifndef CHECK_ENSURE
58 #define CHECK_ENSURE		1
59 #endif
60 
61 #ifndef CHECK_INSIST
62 #define CHECK_INSIST		1
63 #endif
64 
65 #ifndef CHECK_INVARIANT
66 #define CHECK_INVARIANT		1
67 #endif
68 #endif	/* _DIAGNOSTIC */
69 
70 #if CHECK_REQUIRE != 0
71 #define REQUIRE(cond) \
72 	((void) ((cond) || \
73 		 ((__assertion_failed)(__FILE__, __LINE__, assert_require, \
74 				       #cond, 0), 0)))
75 #define REQUIRE_ERR(cond) \
76 	((void) ((cond) || \
77 		 ((__assertion_failed)(__FILE__, __LINE__, assert_require, \
78 				       #cond, 1), 0)))
79 #else
80 #define REQUIRE(cond)		((void) (cond))
81 #define REQUIRE_ERR(cond)	((void) (cond))
82 #endif /* CHECK_REQUIRE */
83 
84 #if CHECK_ENSURE != 0
85 #define ENSURE(cond) \
86 	((void) ((cond) || \
87 		 ((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
88 				       #cond, 0), 0)))
89 #define ENSURE_ERR(cond) \
90 	((void) ((cond) || \
91 		 ((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
92 				       #cond, 1), 0)))
93 #else
94 #define ENSURE(cond)		((void) (cond))
95 #define ENSURE_ERR(cond)	((void) (cond))
96 #endif /* CHECK_ENSURE */
97 
98 #if CHECK_INSIST != 0
99 #define INSIST(cond) \
100 	((void) ((cond) || \
101 		 ((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
102 				       #cond, 0), 0)))
103 #define INSIST_ERR(cond) \
104 	((void) ((cond) || \
105 		 ((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
106 				       #cond, 1), 0)))
107 #else
108 #if !defined(__lint__)
109 #define INSIST(cond)		((void) (cond))
110 #define INSIST_ERR(cond)	((void) (cond))
111 #else /* !__lint__ */
112 #define INSIST(cond)
113 #define INSIST_ERR(cond)
114 #endif /* !__lint__ */
115 #endif /* CHECK_INSIST */
116 
117 #if CHECK_INVARIANT != 0
118 #define INVARIANT(cond) \
119 	((void) ((cond) || \
120 		 ((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
121 				       #cond, 0), 0)))
122 #define INVARIANT_ERR(cond) \
123 	((void) ((cond) || \
124 		 ((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
125 				       #cond, 1), 0)))
126 #else
127 #define INVARIANT(cond)		((void) (cond))
128 #define INVARIANT_ERR(cond)	((void) (cond))
129 #endif /* CHECK_INVARIANT */
130 #endif /* ASSERTIONS_H */
131 /*! \file */
132