/* ----------------------------------------------------------------------------
 *         ATMEL Microcontroller Software Support 
 * ----------------------------------------------------------------------------
 * Copyright (c) 2008, Atmel Corporation
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the disclaimer below.
 *
 * Atmel's name may not be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * ----------------------------------------------------------------------------
 */

//------------------------------------------------------------------------------
/// \unit
///
/// !Purpose
///
/// Definition of the ASSERT() and SANITY_CHECK() macros, which are used for
/// runtime condition & parameter verifying.
///
/// !Usage
///
/// -# Use ASSERT() in your code to check the value of function parameters,
///    return values, etc. *Warning:* the ASSERT() condition must not have
///    any side-effect; otherwise, the program may not work properly
///    anymore when assertions are disabled.
/// -# Use SANITY_CHECK() to perform checks with a default error message
///    (outputs the file and line number where the error occured). This 
///    reduces memory overhead caused by assertion error strings.
/// -# Initialize the dbgu to see failed assertions at run-time.
/// -# Assertions can be entirely disabled by defining the NOASSERT symbol
///    at compilation time.
//------------------------------------------------------------------------------

#ifndef ASSERT_H
#define ASSERT_H

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include <stdio.h>
#include "trace.h"

#define assert ASSERT

//------------------------------------------------------------------------------
//         Definitions
//------------------------------------------------------------------------------
#if defined(NOASSERT)
    #define ASSERT(...)
    #define SANITY_CHECK(...)
#else

    #if (TRACE_LEVEL == 0)
        /// Checks that the given condition is true, 
        /// otherwise stops the program execution.
        /// \param condition  Condition to verify.
        #define ASSERT(condition)  { \
            if (!(condition)) { \
                while (1); \
            } \
        }

        /// Performs the same duty as the ASSERT() macro
        /// \param condition  Condition to verify.
        #define SANITY_CHECK(condition) ASSERT(condition, ...)

    #else
        /// Checks that the given condition is true, otherwise displays an error
        /// message and stops the program execution.
        /// \param condition  Condition to verify.
        #define ASSERT(condition)  { \
            if (!(condition)) { \
                printf("-F- ASSERT: %s %s:%d\n\r", #condition, __BASE_FILE__, __LINE__); \
                while (1); \
            } \
        }
        #define SANITY_ERROR            "Sanity check failed at %s:%d\n\r"
    
        /// Performs the same duty as the ASSERT() macro, except a default error
        /// message is output if the condition is false.
        /// \param condition  Condition to verify.
        #define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__)
    #endif
#endif










#endif //#ifndef ASSERT_H

