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 #pragma ident "%Z%%M% %I% %E% SMI" 13 14 /* 15 ** libsm abnormal program termination and assertion checking 16 ** See libsm/assert.html for documentation. 17 */ 18 19 #ifndef SM_ASSERT_H 20 # define SM_ASSERT_H 21 22 # include <sm/gen.h> 23 # include <sm/debug.h> 24 25 /* 26 ** abnormal program termination 27 */ 28 29 typedef void (*SM_ABORT_HANDLER_T) __P((const char *, int, const char *)); 30 31 extern SM_DEAD(void 32 sm_abort_at __P(( 33 const char *, 34 int, 35 const char *))); 36 37 extern void 38 sm_abort_sethandler __P(( 39 SM_ABORT_HANDLER_T)); 40 41 extern SM_DEAD(void PRINTFLIKE(1, 2) 42 sm_abort __P(( 43 char *, 44 ...))); 45 46 /* 47 ** assertion checking 48 */ 49 50 # ifndef SM_CHECK_ALL 51 # define SM_CHECK_ALL 1 52 # endif /* ! SM_CHECK_ALL */ 53 54 # ifndef SM_CHECK_REQUIRE 55 # define SM_CHECK_REQUIRE SM_CHECK_ALL 56 # endif /* ! SM_CHECK_REQUIRE */ 57 58 # ifndef SM_CHECK_ENSURE 59 # define SM_CHECK_ENSURE SM_CHECK_ALL 60 # endif /* ! SM_CHECK_ENSURE */ 61 62 # ifndef SM_CHECK_ASSERT 63 # define SM_CHECK_ASSERT SM_CHECK_ALL 64 # endif /* ! SM_CHECK_ASSERT */ 65 66 # if SM_CHECK_REQUIRE 67 # if defined(__STDC__) || defined(__cplusplus) 68 # define SM_REQUIRE(cond) \ 69 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 70 "SM_REQUIRE(" #cond ") failed"), 0))) 71 # else /* defined(__STDC__) || defined(__cplusplus) */ 72 # define SM_REQUIRE(cond) \ 73 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 74 "SM_REQUIRE(cond) failed"), 0))) 75 # endif /* defined(__STDC__) || defined(__cplusplus) */ 76 # else /* SM_CHECK_REQUIRE */ 77 # define SM_REQUIRE(cond) ((void) 0) 78 # endif /* SM_CHECK_REQUIRE */ 79 80 # define SM_REQUIRE_ISA(obj, magic) \ 81 SM_REQUIRE((obj) != NULL && (obj)->sm_magic == (magic)) 82 83 # if SM_CHECK_ENSURE 84 # if defined(__STDC__) || defined(__cplusplus) 85 # define SM_ENSURE(cond) \ 86 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 87 "SM_ENSURE(" #cond ") failed"), 0))) 88 # else /* defined(__STDC__) || defined(__cplusplus) */ 89 # define SM_ENSURE(cond) \ 90 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 91 "SM_ENSURE(cond) failed"), 0))) 92 # endif /* defined(__STDC__) || defined(__cplusplus) */ 93 # else /* SM_CHECK_ENSURE */ 94 # define SM_ENSURE(cond) ((void) 0) 95 # endif /* SM_CHECK_ENSURE */ 96 97 # if SM_CHECK_ASSERT 98 # if defined(__STDC__) || defined(__cplusplus) 99 # define SM_ASSERT(cond) \ 100 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 101 "SM_ASSERT(" #cond ") failed"), 0))) 102 # else /* defined(__STDC__) || defined(__cplusplus) */ 103 # define SM_ASSERT(cond) \ 104 ((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \ 105 "SM_ASSERT(cond) failed"), 0))) 106 # endif /* defined(__STDC__) || defined(__cplusplus) */ 107 # else /* SM_CHECK_ASSERT */ 108 # define SM_ASSERT(cond) ((void) 0) 109 # endif /* SM_CHECK_ASSERT */ 110 111 extern SM_DEBUG_T SmExpensiveRequire; 112 extern SM_DEBUG_T SmExpensiveEnsure; 113 extern SM_DEBUG_T SmExpensiveAssert; 114 115 #endif /* ! SM_ASSERT_H */ 116