190792Sgshapiro/*
2261194Sgshapiro * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro *
9266527Sgshapiro *	$Id: assert.h,v 1.11 2013-11-22 20:51:31 ca Exp $
1090792Sgshapiro */
1190792Sgshapiro
1290792Sgshapiro/*
1390792Sgshapiro**  libsm abnormal program termination and assertion checking
1490792Sgshapiro**  See libsm/assert.html for documentation.
1590792Sgshapiro*/
1690792Sgshapiro
1790792Sgshapiro#ifndef SM_ASSERT_H
1890792Sgshapiro# define SM_ASSERT_H
1990792Sgshapiro
2090792Sgshapiro# include <sm/gen.h>
2190792Sgshapiro# include <sm/debug.h>
2290792Sgshapiro
2390792Sgshapiro/*
2490792Sgshapiro**  abnormal program termination
2590792Sgshapiro*/
2690792Sgshapiro
2790792Sgshapirotypedef void (*SM_ABORT_HANDLER_T) __P((const char *, int, const char *));
2890792Sgshapiro
2990792Sgshapiroextern SM_DEAD(void
3090792Sgshapirosm_abort_at __P((
3190792Sgshapiro	const char *,
3290792Sgshapiro	int,
3390792Sgshapiro	const char *)));
3490792Sgshapiro
3590792Sgshapiroextern void
3690792Sgshapirosm_abort_sethandler __P((
3790792Sgshapiro	SM_ABORT_HANDLER_T));
3890792Sgshapiro
3990792Sgshapiroextern SM_DEAD(void PRINTFLIKE(1, 2)
4090792Sgshapirosm_abort __P((
4190792Sgshapiro	char *,
4290792Sgshapiro	...)));
4390792Sgshapiro
4490792Sgshapiro/*
4590792Sgshapiro**  assertion checking
4690792Sgshapiro*/
4790792Sgshapiro
4890792Sgshapiro# ifndef SM_CHECK_ALL
4990792Sgshapiro#  define SM_CHECK_ALL		1
5090792Sgshapiro# endif /* ! SM_CHECK_ALL */
5190792Sgshapiro
5290792Sgshapiro# ifndef SM_CHECK_REQUIRE
5390792Sgshapiro#  define SM_CHECK_REQUIRE	SM_CHECK_ALL
5490792Sgshapiro# endif /* ! SM_CHECK_REQUIRE */
5590792Sgshapiro
5690792Sgshapiro# ifndef SM_CHECK_ENSURE
5790792Sgshapiro#  define SM_CHECK_ENSURE	SM_CHECK_ALL
5890792Sgshapiro# endif /* ! SM_CHECK_ENSURE */
5990792Sgshapiro
6090792Sgshapiro# ifndef SM_CHECK_ASSERT
6190792Sgshapiro#  define SM_CHECK_ASSERT	SM_CHECK_ALL
6290792Sgshapiro# endif /* ! SM_CHECK_ASSERT */
6390792Sgshapiro
6490792Sgshapiro# if SM_CHECK_REQUIRE
6590792Sgshapiro#  if defined(__STDC__) || defined(__cplusplus)
6690792Sgshapiro#   define SM_REQUIRE(cond) \
6790792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
6890792Sgshapiro	"SM_REQUIRE(" #cond ") failed"), 0)))
6990792Sgshapiro#  else /* defined(__STDC__) || defined(__cplusplus) */
7090792Sgshapiro#   define SM_REQUIRE(cond) \
7190792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
7290792Sgshapiro	"SM_REQUIRE(cond) failed"), 0)))
7390792Sgshapiro#  endif /* defined(__STDC__) || defined(__cplusplus) */
7490792Sgshapiro# else /* SM_CHECK_REQUIRE */
7590792Sgshapiro#  define SM_REQUIRE(cond)	((void) 0)
7690792Sgshapiro# endif /* SM_CHECK_REQUIRE */
7790792Sgshapiro
7890792Sgshapiro# define SM_REQUIRE_ISA(obj, magic) \
7990792Sgshapiro		SM_REQUIRE((obj) != NULL && (obj)->sm_magic == (magic))
8090792Sgshapiro
8190792Sgshapiro# if SM_CHECK_ENSURE
8290792Sgshapiro#  if defined(__STDC__) || defined(__cplusplus)
8390792Sgshapiro#   define SM_ENSURE(cond) \
8490792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
8590792Sgshapiro	"SM_ENSURE(" #cond ") failed"), 0)))
8690792Sgshapiro#  else /* defined(__STDC__) || defined(__cplusplus) */
8790792Sgshapiro#   define SM_ENSURE(cond) \
8890792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
8990792Sgshapiro	"SM_ENSURE(cond) failed"), 0)))
9090792Sgshapiro#  endif /* defined(__STDC__) || defined(__cplusplus) */
9190792Sgshapiro# else /* SM_CHECK_ENSURE */
9290792Sgshapiro#  define SM_ENSURE(cond)	((void) 0)
9390792Sgshapiro# endif /* SM_CHECK_ENSURE */
9490792Sgshapiro
9590792Sgshapiro# if SM_CHECK_ASSERT
9690792Sgshapiro#  if defined(__STDC__) || defined(__cplusplus)
9790792Sgshapiro#   define SM_ASSERT(cond) \
9890792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
9990792Sgshapiro	"SM_ASSERT(" #cond ") failed"), 0)))
10090792Sgshapiro#  else /* defined(__STDC__) || defined(__cplusplus) */
10190792Sgshapiro#   define SM_ASSERT(cond) \
10290792Sgshapiro	((void) ((cond) || (sm_abort_at(__FILE__, __LINE__, \
10390792Sgshapiro	"SM_ASSERT(cond) failed"), 0)))
10490792Sgshapiro#  endif /* defined(__STDC__) || defined(__cplusplus) */
10590792Sgshapiro# else /* SM_CHECK_ASSERT */
10690792Sgshapiro#  define SM_ASSERT(cond)	((void) 0)
10790792Sgshapiro# endif /* SM_CHECK_ASSERT */
10890792Sgshapiro
10990792Sgshapiroextern SM_DEBUG_T SmExpensiveRequire;
11090792Sgshapiroextern SM_DEBUG_T SmExpensiveEnsure;
11190792Sgshapiroextern SM_DEBUG_T SmExpensiveAssert;
11290792Sgshapiro
11390792Sgshapiro#endif /* ! SM_ASSERT_H */
114