|
|
1.1 ! root 1: #ifndef _ASSERT_H ! 2: #define _ASSERT_H ! 3: ! 4: /** @file ! 5: * ! 6: * Assertions ! 7: * ! 8: * This file provides two assertion macros: assert() (for run-time ! 9: * assertions) and linker_assert() (for link-time assertions). ! 10: * ! 11: */ ! 12: ! 13: FILE_LICENCE ( GPL2_OR_LATER ); ! 14: ! 15: #ifdef NDEBUG ! 16: #define ASSERTING 0 ! 17: #else ! 18: #define ASSERTING 1 ! 19: #endif ! 20: ! 21: /** printf() for assertions ! 22: * ! 23: * This function exists so that the assert() macro can expand to ! 24: * printf() calls without dragging the printf() prototype into scope. ! 25: * ! 26: * As far as the compiler is concerned, assert_printf() and printf() are ! 27: * completely unrelated calls; it's only at the assembly stage that ! 28: * references to the assert_printf symbol are collapsed into references ! 29: * to the printf symbol. ! 30: */ ! 31: extern int __attribute__ (( format ( printf, 1, 2 ) )) ! 32: assert_printf ( const char *fmt, ... ) asm ( "printf" ); ! 33: ! 34: /** ! 35: * Assert a condition at run-time. ! 36: * ! 37: * If the condition is not true, a debug message will be printed. ! 38: * Assertions only take effect in debug-enabled builds (see DBG()). ! 39: * ! 40: * @todo Make an assertion failure abort the program ! 41: * ! 42: */ ! 43: #define assert( condition ) \ ! 44: do { \ ! 45: if ( ASSERTING && ! (condition) ) { \ ! 46: assert_printf ( "assert(%s) failed at %s line %d\n", \ ! 47: #condition, __FILE__, __LINE__ ); \ ! 48: } \ ! 49: } while ( 0 ) ! 50: ! 51: /** ! 52: * Assert a condition at link-time. ! 53: * ! 54: * If the condition is not true, the link will fail with an unresolved ! 55: * symbol (error_symbol). ! 56: * ! 57: * This macro is iPXE-specific. Do not use this macro in code ! 58: * intended to be portable. ! 59: * ! 60: */ ! 61: #define linker_assert( condition, error_symbol ) \ ! 62: if ( ! (condition) ) { \ ! 63: extern void error_symbol ( void ); \ ! 64: error_symbol(); \ ! 65: } ! 66: ! 67: #endif /* _ASSERT_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.