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