4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides a definition of the assert macro used to insert diagnostic messages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync into code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This header file defines the assert macro and refers to the NDEBUG macro,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which is NOT defined in this file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Unlike other header files, assert.h is designed to be included multiple
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync times, with potentially different behavior on each inclusion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the NDEBUG macro is defined at the point where assert.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is included, the assert macro is defined so as to not produce code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Otherwise, the assertion is tested and if the assertion is FALSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (e.g. evaluates to 0) a diagnostic message of the form<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Assertion failed: (EXPR), file FILE, function FUNC, line LINE.\n"<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is produced.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A FALSE evaluation will also result in the application being aborted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available under
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the terms and conditions of the BSD License that accompanies this distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/EfiCdefs.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#undef assert ///< Remove any existing definition for assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Internal helper function for the assert macro.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The __assert function prints a diagnostic message then exits the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync currently running application.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function should NEVER be called directly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Some pre-processors do not provide the __func__ identifier. When that is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the case, __func__ will be NULL. This function accounts for this and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will modify the diagnostic message appropriately.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] file The name of the file containing the assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] func The name of the function containing the assert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] line The line number the assert is located on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] failedexpr A literal representation of the assert's expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The __assert function will never return. It aborts the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current application and returns to the environment that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the application was launched from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern void
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__assert(const char *file, const char *func, int line, const char *failedexpr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** The assert macro puts diagnostic tests into programs; it expands to a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When it is executed, if expression (which must have a scalar type) is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE (that is, compares equal to 0), the assert macro writes information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync about the particular call that failed (including the text of the argument,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the name of the source file, the source line number, and the name of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync enclosing function - the latter are respectively the values of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync preprocessing macros __FILE__ and __LINE__ and of the identifier __func__)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the standard error stream. It then calls the abort function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If NDEBUG is not defined, Expression is evaluated. If Expression evaluates to FALSE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then __assert is called passing in the source filename, source function, source
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync line number, and the Expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Expression Boolean expression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync@{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef NDEBUG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define assert(Expression) /* ignored */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define assert(Expression) ((Expression) ? (void)0 :\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync __assert(__FILE__, __func__, __LINE__, #Expression) )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// @}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* END of file assert.h */