1 /*
2  * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
3  *	All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  *
9  *	$Id: assert.h,v 1.10 2001/06/07 20:04:53 ca Exp $
10  */
11 
12 /*
13 **  libsm abnormal program termination and assertion checking
14 **  See libsm/assert.html for documentation.
15 */
16 
17 #ifndef SM_ASSERT_H
18 # define SM_ASSERT_H
19 
20 # include <sm/gen.h>
21 # include <sm/debug.h>
22 
23 /*
24 **  abnormal program termination
25 */
26 
27 typedef void (*SM_ABORT_HANDLER_T) __P((const char *, int, const char *));
28 
29 extern SM_DEAD(void
30 sm_abort_at __P((
31 	const char *,
32 	int,
33 	const char *)));
34 
35 extern void
36 sm_abort_sethandler __P((
37 	SM_ABORT_HANDLER_T));
38 
39 extern SM_DEAD(void PRINTFLIKE(1, 2)
40 sm_abort __P((
41 	char *,
42 	...)));
43 
44 /*
45 **  assertion checking
46 */
47 
48 # ifndef SM_CHECK_ALL
49 #  define SM_CHECK_ALL		1
50 # endif /* ! SM_CHECK_ALL */
51 
52 # ifndef SM_CHECK_REQUIRE
53 #  define SM_CHECK_REQUIRE	SM_CHECK_ALL
54 # endif /* ! SM_CHECK_REQUIRE */
55 
56 # ifndef SM_CHECK_ENSURE
57 #  define SM_CHECK_ENSURE	SM_CHECK_ALL
58 # endif /* ! SM_CHECK_ENSURE */
59 
60 # ifndef SM_CHECK_ASSERT
61 #  define SM_CHECK_ASSERT	SM_CHECK_ALL
62 # endif /* ! SM_CHECK_ASSERT */
63 
64 # if SM_CHECK_REQUIRE
65 #  if defined(__STDC__) || defined(__cplusplus)
66 #   define SM_REQUIRE(cond) \
67 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
68 	"SM_REQUIRE(" #cond ") failed"), 0)))
69 #  else /* defined(__STDC__) || defined(__cplusplus) */
70 #   define SM_REQUIRE(cond) \
71 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
72 	"SM_REQUIRE(cond) failed"), 0)))
73 #  endif /* defined(__STDC__) || defined(__cplusplus) */
74 # else /* SM_CHECK_REQUIRE */
75 #  define SM_REQUIRE(cond)	((void) 0)
76 # endif /* SM_CHECK_REQUIRE */
77 
78 # define SM_REQUIRE_ISA(obj, magic) \
79 		SM_REQUIRE((obj) != NULL && (obj)->sm_magic == (magic))
80 
81 # if SM_CHECK_ENSURE
82 #  if defined(__STDC__) || defined(__cplusplus)
83 #   define SM_ENSURE(cond) \
84 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
85 	"SM_ENSURE(" #cond ") failed"), 0)))
86 #  else /* defined(__STDC__) || defined(__cplusplus) */
87 #   define SM_ENSURE(cond) \
88 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
89 	"SM_ENSURE(cond) failed"), 0)))
90 #  endif /* defined(__STDC__) || defined(__cplusplus) */
91 # else /* SM_CHECK_ENSURE */
92 #  define SM_ENSURE(cond)	((void) 0)
93 # endif /* SM_CHECK_ENSURE */
94 
95 # if SM_CHECK_ASSERT
96 #  if defined(__STDC__) || defined(__cplusplus)
97 #   define SM_ASSERT(cond) \
98 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
99 	"SM_ASSERT(" #cond ") failed"), 0)))
100 #  else /* defined(__STDC__) || defined(__cplusplus) */
101 #   define SM_ASSERT(cond) \
102 	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
103 	"SM_ASSERT(cond) failed"), 0)))
104 #  endif /* defined(__STDC__) || defined(__cplusplus) */
105 # else /* SM_CHECK_ASSERT */
106 #  define SM_ASSERT(cond)	((void) 0)
107 # endif /* SM_CHECK_ASSERT */
108 
109 extern SM_DEBUG_T SmExpensiveRequire;
110 extern SM_DEBUG_T SmExpensiveEnsure;
111 extern SM_DEBUG_T SmExpensiveAssert;
112 
113 #endif /* ! SM_ASSERT_H */
114