blob: a58a75f22d175e2795be1c5cbf78cf72ac8081dd [file] [log] [blame]
/*
*
* Copyright 2019 NXP
* SPDX-License-Identifier: Apache-2.0
*/
/** @file
*
* @addtogroup param_check
*
* @{
*
* nxEnsure.h: Helper parameter assertion check macros.
*
* Pre Condition: The source file must have included nxLog
* header file.
*
* Project: SecureIoTMW
*
*
*/
#ifndef HOSTLIB_HOSTLIB_INC_NXENSURE_H_
#define HOSTLIB_HOSTLIB_INC_NXENSURE_H_
/* *****************************************************************************************************************
* Includes
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* MACROS/Defines
* ***************************************************************************************************************** */
/** Build time over-ride if we want to enable/disable Warning Prints
*
* During debug builds, it makes sense to print them,
* During retail builds, such loggings would be of any use and remove and reduce code size.
*
*/
#ifndef NX_ENSURE_DO_LOG_MESSAGE
#define NX_ENSURE_DO_LOG_MESSAGE 1
#endif /* NX_ENSURE_DO_LOG_MESSAGE */
/**
* @brief Waring print of the parameter ``strCONDITION``
*
* @warning NX_ENSURE_MESSAGE is an internal message/API to this file.
* Do not use directly.
*
*/
#if NX_ENSURE_DO_LOG_MESSAGE
# define NX_ENSURE_MESSAGE(strCONDITION) \
LOG_W("nxEnsure:'" strCONDITION "' failed. At Line:%d Function:%s", __LINE__, __FUNCTION__)
#else /* NX_ENSURE_DO_LOG_MESSAGE */
# define NX_ENSURE_MESSAGE(strCONDITION) /* No Message */
#endif /* NX_ENSURE_DO_LOG_MESSAGE */
/**
* @brief Waring print of the parameter ``strCONDITION``
*
* @warning NX_ENSURE_MESSAGE is an internal message/API to this file.
* Do not use directly.
*
*/
#if NX_ENSURE_DO_LOG_MESSAGE
# define NX_ENSURE_MESSAGE(strCONDITION) \
LOG_W("nxEnsure:'" strCONDITION "' failed. At Line:%d Function:%s", __LINE__, __FUNCTION__)
#else /* NX_ENSURE_DO_LOG_MESSAGE */
# define NX_ENSURE_MESSAGE(strCONDITION) /* No Message */
#endif /* NX_ENSURE_DO_LOG_MESSAGE */
/** If condition fails, goto :cleanup label
*
* @code{.c}
*
* {
* ...
*
* status = Operation1();
* ENSURE_OR_GO_CLEANUP(0 == status);
*
* status = Operation2();
* ENSURE_OR_GO_CLEANUP(0 == status);
*
* ...
*
* cleanup:
* return status;
* }
*
* @endcode
*
*/
#define ENSURE_OR_GO_CLEANUP(CONDITION) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
goto cleanup; \
}
/** If condition fails, goto :exit label
*
* @code{.c}
*
* {
* ...
*
* status = Operation1();
* ENSURE_OR_GO_EXIT(0 == status);
*
* status = Operation2();
* ENSURE_OR_GO_EXIT(0 == status);
*
* ...
*
* exit:
* return status;
* }
*
* @endcode
*
*/
#define ENSURE_OR_GO_EXIT(CONDITION) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
goto exit; \
}
/** If condition fails, break.
*
* Sample Usage:
*
* @code{.c}
*
* int SomeAPI()
* {
* ...
*
* do {
* status = Operation1();
* ENSURE_OR_BREAK(0 == status);
*
* status = Operation2();
* ENSURE_OR_BREAK(0 == status);
*
* ...
*
* } while(0);
*
* return status;
* }
*
* @endcode
*
*/
#define ENSURE_OR_BREAK(CONDITION) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
break; \
}
/** If condition fails, return
*
*
* @code{.c}
*
* void SomeAPI()
* {
* ...
*
* status = Operation1();
* ENSURE_OR_RETURN(0 == status);
*
* status = Operation2();
* ENSURE_OR_RETURN(0 == status);
*
* ...
*
* return;
* }
*
* @endcode
*
* @warning This macro introduces system of mutliple
* returns from a function which is not
* easy to debug/trace through and hence
* not recommended.
*
*/
#define ENSURE_OR_RETURN(CONDITION) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
return; \
}
/** If condition fails, return
*
*
* @code{.c}
*
* int SomeAPI()
* {
* ...
*
* status = Operation1();
* ENSURE_OR_RETURN_ON_ERROR(0 == status, ERR_FAIL);
*
* status = Operation2();
* ENSURE_OR_RETURN_ON_ERROR(0 == status, ERR_NOT_ENOUGH_SPACE);
*
* ...
*
* return 0;
* }
*
* @endcode
*
* @warning This macro introduces system of mutliple
* returns from a function which is not
* easy to debug/trace through and hence
* not recommended.
*
*/
#define ENSURE_OR_RETURN_ON_ERROR(CONDITION, RETURN_VALUE) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
return RETURN_VALUE; \
}
/** If condition fails, goto quit with return value status updated.
*
*
* @code{.c}
*
* int SomeAPI()
* {
int status = 0;
* ...
*
* value = Operation1();
* ENSURE_OR_QUIT_WITH_STATUS_ON_ERROR(0 == value, status, ERR_FAIL);
*
* value = Operation2();
* ENSURE_OR_QUIT_WITH_STATUS_ON_ERROR(0 == value, status, ERR_NOT_ENOUGH_SPACE);
*
* ...
* quit:
* return status;
* }
*
* @endcode
*
* @warning This macro introduces system of mutliple
* returns from a function which is not
* easy to debug/trace through and hence
* not recommended.
*
*/
#define ENSURE_OR_EXIT_WITH_STATUS_ON_ERROR(CONDITION, STATUS, RETURN_VALUE) \
if (!(CONDITION)) { \
NX_ENSURE_MESSAGE(#CONDITION); \
STATUS = RETURN_VALUE; \
goto exit; \
}
/* *****************************************************************************************************************
* Types/Structure Declarations
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* Extern Variables
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* Function Prototypes
* ***************************************************************************************************************** */
/** @} */
#endif /* HOSTLIB_HOSTLIB_INC_NXENSURE_H_ */