1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright 2016, Fuzhou Rockchip Electronics Co.Ltd . All rights reserved. 4*4882a593Smuzhiyun * No part of this work may be reproduced, modified, distributed, transmitted, 5*4882a593Smuzhiyun * transcribed, or translated into any language or computer format, in any form 6*4882a593Smuzhiyun * or by any means without written permission of: 7*4882a593Smuzhiyun * Fuzhou Rockchip Electronics Co.Ltd . 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun *****************************************************************************/ 11*4882a593Smuzhiyun /** 12*4882a593Smuzhiyun * @file dct_assert.h 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * This file defines the API for the assertion facility of the embedded lib. 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun *****************************************************************************/ 17*4882a593Smuzhiyun /*****************************************************************************/ 18*4882a593Smuzhiyun /** 19*4882a593Smuzhiyun * @defgroup module_assert Assert macros 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Example use of the assert system: 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * - In your source file just use the macro 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * @code 28*4882a593Smuzhiyun * void foo( uint8_t* pData, size_t size) 29*4882a593Smuzhiyun * { 30*4882a593Smuzhiyun * DCT_ASSERT(pData != NULL); 31*4882a593Smuzhiyun * DCT_ASSERT(size > 0); 32*4882a593Smuzhiyun * } 33*4882a593Smuzhiyun * @endcode 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * @{ 36*4882a593Smuzhiyun * 37*4882a593Smuzhiyun *****************************************************************************/ 38*4882a593Smuzhiyun #ifndef ASSERT_H_ 39*4882a593Smuzhiyun #define ASSERT_H_ 40*4882a593Smuzhiyun typedef char CHAR; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /** 43*4882a593Smuzhiyun * @brief The type of the assert handler. @see assert_handler 44*4882a593Smuzhiyun * 45*4882a593Smuzhiyun *****************************************************************************/ 46*4882a593Smuzhiyun typedef void (*ASSERT_HANDLER)(void); 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /** 50*4882a593Smuzhiyun * The assert handler is a function that is called in case an 51*4882a593Smuzhiyun * assertion failed. If no handler is registered, which is the 52*4882a593Smuzhiyun * default, exit() is called. 53*4882a593Smuzhiyun * 54*4882a593Smuzhiyun *****************************************************************************/ 55*4882a593Smuzhiyun extern ASSERT_HANDLER assert_handler; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /** 58*4882a593Smuzhiyun * Compile time assert. Use e.g. to check the size of certain data 59*4882a593Smuzhiyun * types. As this is evaluated at compile time, it will neither cause 60*4882a593Smuzhiyun * size nor speed overhead, and thus is does not need to be inside 61*4882a593Smuzhiyun * the NDEBUG. 62*4882a593Smuzhiyun * 63*4882a593Smuzhiyun *****************************************************************************/ 64*4882a593Smuzhiyun /* we need several levels of indirection to make unique enum names working 65*4882a593Smuzhiyun * we need unique enum names to be able to use DCT_ASSERT_STATIC more than 66*4882a593Smuzhiyun * one time per compilation unit 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun #define UNIQUE_ENUM_NAME(u) assert_static__ ## u 69*4882a593Smuzhiyun #define GET_ENUM_NAME(x) UNIQUE_ENUM_NAME(x) 70*4882a593Smuzhiyun #define DCT_ASSERT_STATIC(e) enum { GET_ENUM_NAME(__LINE__) = 1/(e) } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #if defined(ENABLE_ASSERT) || !defined(NDEBUG) 73*4882a593Smuzhiyun /** 74*4882a593Smuzhiyun * Dump information on stderr and exit. 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * @param file Filename where assertion occured. 77*4882a593Smuzhiyun * @param line Linenumber where assertion occured. 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun *****************************************************************************/ 80*4882a593Smuzhiyun #ifdef __cplusplus 81*4882a593Smuzhiyun extern "C" 82*4882a593Smuzhiyun #endif 83*4882a593Smuzhiyun void exit_(const char* file, int line); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /** 87*4882a593Smuzhiyun * The assert macro. 88*4882a593Smuzhiyun * 89*4882a593Smuzhiyun * @param exp Expression which assumed to be true. 90*4882a593Smuzhiyun * 91*4882a593Smuzhiyun *****************************************************************************/ 92*4882a593Smuzhiyun #define DCT_ASSERT(exp) ((void)0) 93*4882a593Smuzhiyun #else 94*4882a593Smuzhiyun #define DCT_ASSERT(exp) ((void)0) 95*4882a593Smuzhiyun #endif 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* @} module_tracer*/ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #endif /*ASSERT_H_*/ 100