1    	/* Copyright (C) 1991,1992,1994-2001,2003,2004,2007
2    	   Free Software Foundation, Inc.
3    	   This file is part of the GNU C Library.
4    	
5    	   The GNU C Library is free software; you can redistribute it and/or
6    	   modify it under the terms of the GNU Lesser General Public
7    	   License as published by the Free Software Foundation; either
8    	   version 2.1 of the License, or (at your option) any later version.
9    	
10   	   The GNU C Library is distributed in the hope that it will be useful,
11   	   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   	   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13   	   Lesser General Public License for more details.
14   	
15   	   You should have received a copy of the GNU Lesser General Public
16   	   License along with the GNU C Library; if not, write to the Free
17   	   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18   	   02111-1307 USA.  */
19   	
20   	/*
21   	 *	ISO C99 Standard: 7.2 Diagnostics	<assert.h>
22   	 */
23   	
24   	#ifdef	_ASSERT_H
25   	
26   	# undef	_ASSERT_H
27   	# undef	assert
28   	# undef __ASSERT_VOID_CAST
29   	
30   	# ifdef	__USE_GNU
31   	#  undef assert_perror
32   	# endif
33   	
34   	#endif /* assert.h	*/
35   	
36   	#define	_ASSERT_H	1
37   	#include <features.h>
38   	
39   	#if defined __cplusplus && __GNUC_PREREQ (2,95)
40   	# define __ASSERT_VOID_CAST static_cast<void>
41   	#else
42   	# define __ASSERT_VOID_CAST (void)
43   	#endif
44   	
45   	/* void assert (int expression);
46   	
47   	   If NDEBUG is defined, do nothing.
48   	   If not, and EXPRESSION is zero, print an error message and abort.  */
49   	
50   	#ifdef	NDEBUG
51   	
52   	# define assert(expr)		(__ASSERT_VOID_CAST (0))
53   	
54   	/* void assert_perror (int errnum);
55   	
56   	   If NDEBUG is defined, do nothing.  If not, and ERRNUM is not zero, print an
57   	   error message with the error text for ERRNUM and abort.
58   	   (This is a GNU extension.) */
59   	
60   	# ifdef	__USE_GNU
61   	#  define assert_perror(errnum)	(__ASSERT_VOID_CAST (0))
62   	# endif
63   	
64   	#else /* Not NDEBUG.  */
65   	
66   	__BEGIN_DECLS
67   	
68   	/* This prints an "Assertion failed" message and aborts.  */
69   	extern void __assert_fail (__const char *__assertion, __const char *__file,
70   				   unsigned int __line, __const char *__function)
71   	     __THROW __attribute__ ((__noreturn__));
72   	
73   	/* Likewise, but prints the error text for ERRNUM.  */
74   	extern void __assert_perror_fail (int __errnum, __const char *__file,
75   					  unsigned int __line,
76   					  __const char *__function)
77   	     __THROW __attribute__ ((__noreturn__));
78   	
79   	
80   	/* The following is not at all used here but needed for standard
81   	   compliance.  */
82   	extern void __assert (const char *__assertion, const char *__file, int __line)
83   	     __THROW __attribute__ ((__noreturn__));
84   	
85   	
86   	__END_DECLS
87   	
88   	# define assert(expr)							\
89   	  ((expr)								\
90   	   ? __ASSERT_VOID_CAST (0)						\
91   	   : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
92   	
93   	# ifdef	__USE_GNU
94   	#  define assert_perror(errnum)						\
95   	  (!(errnum)								\
96   	   ? __ASSERT_VOID_CAST (0)						\
97   	   : __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION))
98   	# endif
99   	
100  	/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
101  	   which contains the name of the function currently being defined.
102  	   This is broken in G++ before version 2.6.
103  	   C9x has a similar variable called __func__, but prefer the GCC one since
104  	   it demangles C++ function names.  */
105  	# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
106  	#   define __ASSERT_FUNCTION	__PRETTY_FUNCTION__
107  	# else
108  	#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
109  	#   define __ASSERT_FUNCTION	__func__
110  	#  else
111  	#   define __ASSERT_FUNCTION	((__const char *) 0)
112  	#  endif
113  	# endif
114  	
115  	#endif /* NDEBUG.  */
116