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