2018-03-12 14:31:22 -04:00
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Debug Routines
|
|
|
|
***********************************************************************************************************************************/
|
|
|
|
#ifndef COMMON_DEBUG_H
|
|
|
|
#define COMMON_DEBUG_H
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#include "common/assert.h"
|
2018-05-18 11:57:32 -04:00
|
|
|
#include "common/stackTrace.h"
|
|
|
|
#include "common/type/convert.h"
|
2021-08-19 11:57:37 -04:00
|
|
|
#include "common/type/stringZ.h"
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2018-03-12 17:15:14 -04:00
|
|
|
/***********************************************************************************************************************************
|
2018-05-18 11:57:32 -04:00
|
|
|
Base function debugging macros
|
|
|
|
|
|
|
|
In debug mode parameters will always be recorded in the stack trace while in production mode they will only be recorded when the log
|
|
|
|
level is set to debug or trace.
|
|
|
|
***********************************************************************************************************************************/
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_LEVEL() \
|
|
|
|
FUNCTION_LOG_logLevel
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-05-11 07:57:49 -04:00
|
|
|
#ifdef DEBUG_TEST_TRACE
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_BEGIN_BASE(logLevel) \
|
|
|
|
LogLevel FUNCTION_LOG_LEVEL() = STACK_TRACE_PUSH(logLevel); \
|
2018-05-18 11:57:32 -04:00
|
|
|
\
|
|
|
|
{ \
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceParamLog(); \
|
|
|
|
stackTraceTestStop();
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_END_BASE() \
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceTestStart(); \
|
2019-11-22 13:33:26 -05:00
|
|
|
LOG_FMT(FUNCTION_LOG_LEVEL(), 0, "(%s)", stackTraceParam()); \
|
2018-05-18 11:57:32 -04:00
|
|
|
}
|
|
|
|
#else
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_BEGIN_BASE(logLevel) \
|
|
|
|
LogLevel FUNCTION_LOG_LEVEL() = STACK_TRACE_PUSH(logLevel); \
|
2018-05-18 11:57:32 -04:00
|
|
|
\
|
2019-05-11 18:20:57 -04:00
|
|
|
if (logAny(FUNCTION_LOG_LEVEL())) \
|
2018-05-18 11:57:32 -04:00
|
|
|
{ \
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceParamLog();
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_END_BASE() \
|
2019-11-22 13:33:26 -05:00
|
|
|
LOG_FMT(FUNCTION_LOG_LEVEL(), 0, "(%s)", stackTraceParam()); \
|
2018-05-18 11:57:32 -04:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
General purpose function debugging macros
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
FUNCTION_LOG_VOID() is provided as a shortcut for functions that have no parameters.
|
2018-05-18 11:57:32 -04:00
|
|
|
***********************************************************************************************************************************/
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_BEGIN(logLevel) \
|
|
|
|
FUNCTION_LOG_BEGIN_BASE(logLevel)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_END() \
|
|
|
|
FUNCTION_LOG_END_BASE()
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_VOID(logLevel) \
|
|
|
|
FUNCTION_LOG_BEGIN_BASE(logLevel); \
|
|
|
|
FUNCTION_LOG_END_BASE()
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_PARAM(typeMacroPrefix, param) \
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceParamAdd(FUNCTION_LOG_##typeMacroPrefix##_FORMAT(param, stackTraceParamBuffer(#param), STACK_TRACE_PARAM_MAX))
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_LOG_PARAM_P(typeMacroPrefix, param) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
char *buffer = stackTraceParamBuffer(#param); \
|
|
|
|
\
|
|
|
|
if (param == NULL) \
|
2019-12-09 17:55:20 -05:00
|
|
|
stackTraceParamAdd(typeToLog(NULL_Z, buffer, STACK_TRACE_PARAM_MAX)); \
|
2019-01-28 22:33:29 +02:00
|
|
|
else \
|
|
|
|
{ \
|
|
|
|
buffer[0] = '*'; \
|
|
|
|
stackTraceParamAdd(FUNCTION_LOG_##typeMacroPrefix##_FORMAT(*param, buffer + 1, STACK_TRACE_PARAM_MAX - 1) + 1); \
|
|
|
|
} \
|
|
|
|
} \
|
2019-09-07 12:32:25 -04:00
|
|
|
while (0)
|
2019-01-28 22:33:29 +02:00
|
|
|
|
|
|
|
#define FUNCTION_LOG_PARAM_PP(typeMacroPrefix, param) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
char *buffer = stackTraceParamBuffer(#param); \
|
|
|
|
\
|
|
|
|
if (param == NULL) \
|
2019-12-09 17:55:20 -05:00
|
|
|
stackTraceParamAdd(typeToLog(NULL_Z, buffer, STACK_TRACE_PARAM_MAX)); \
|
2019-01-28 22:33:29 +02:00
|
|
|
else if (*param == NULL) \
|
|
|
|
stackTraceParamAdd(typeToLog("*null", buffer, STACK_TRACE_PARAM_MAX)); \
|
|
|
|
else \
|
|
|
|
{ \
|
|
|
|
buffer[0] = '*'; \
|
|
|
|
buffer[1] = '*'; \
|
|
|
|
stackTraceParamAdd(FUNCTION_LOG_##typeMacroPrefix##_FORMAT(**param, buffer + 2, STACK_TRACE_PARAM_MAX - 2) + 2); \
|
|
|
|
} \
|
|
|
|
} \
|
2019-09-07 12:32:25 -04:00
|
|
|
while (0)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Functions and macros to render various data types
|
|
|
|
***********************************************************************************************************************************/
|
2020-04-03 18:01:28 -04:00
|
|
|
// Convert object to a zero-terminated string for logging
|
2018-05-18 11:57:32 -04:00
|
|
|
size_t objToLog(const void *object, const char *objectName, char *buffer, size_t bufferSize);
|
2020-04-03 18:01:28 -04:00
|
|
|
|
|
|
|
// Convert pointer to a zero-terminated string for logging
|
2018-05-18 11:57:32 -04:00
|
|
|
size_t ptrToLog(const void *pointer, const char *pointerName, char *buffer, size_t bufferSize);
|
2020-04-03 18:01:28 -04:00
|
|
|
|
|
|
|
// Convert zero-terminated string for logging
|
2018-05-18 11:57:32 -04:00
|
|
|
size_t strzToLog(const char *string, char *buffer, size_t bufferSize);
|
2020-04-03 18:01:28 -04:00
|
|
|
|
|
|
|
// Convert a type name to a zero-terminated string for logging
|
2019-01-28 22:33:29 +02:00
|
|
|
size_t typeToLog(const char *typeName, char *buffer, size_t bufferSize);
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_BOOL_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
bool
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_BOOL_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtBoolToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_CHAR_TYPE \
|
2018-08-14 16:18:17 -04:00
|
|
|
char
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_CHAR_FORMAT(value, buffer, bufferSize) \
|
2018-08-14 16:18:17 -04:00
|
|
|
cvtCharToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_LOG_CHARDATA_TYPE \
|
|
|
|
char
|
|
|
|
#define FUNCTION_LOG_CHARDATA_FORMAT(value, buffer, bufferSize) \
|
|
|
|
typeToLog("(char)", buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_CHARPY_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
char *[]
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_CHARPY_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
ptrToLog(value, "char *[]", buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_DOUBLE_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
double
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_DOUBLE_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtDoubleToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_INT_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
int
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_INT_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtIntToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_INT64_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
int64_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_INT64_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtInt64ToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_ENUM_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
unsigned int
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_ENUM_FORMAT(value, buffer, bufferSize) \
|
|
|
|
FUNCTION_LOG_UINT_FORMAT(value, buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_FUNCTIONP_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
ptrToLog(value == NULL ? NULL : (void *)1, "function *", buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_MODE_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
mode_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_MODE_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtModeToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_TIMEMSEC_TYPE \
|
2018-11-08 08:37:57 -05:00
|
|
|
TimeMSec
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_TIMEMSEC_FORMAT(value, buffer, bufferSize) \
|
2018-11-08 08:37:57 -05:00
|
|
|
cvtUInt64ToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_LOG_UCHARDATA_TYPE \
|
|
|
|
unsigned char
|
|
|
|
#define FUNCTION_LOG_UCHARDATA_FORMAT(value, buffer, bufferSize) \
|
|
|
|
typeToLog("(unsigned char)", buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_SIZE_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
size_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_SIZE_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtSizeToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-11-08 09:46:00 -05:00
|
|
|
#define FUNCTION_LOG_TIME_TYPE \
|
|
|
|
time_t
|
|
|
|
#define FUNCTION_LOG_TIME_FORMAT(value, buffer, bufferSize) \
|
|
|
|
cvtTimeToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
unsigned int
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtUIntToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT16_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
uint16_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT16_FORMAT(value, buffer, bufferSize) \
|
|
|
|
FUNCTION_LOG_UINT_FORMAT(value, buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT32_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
uint32_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT32_FORMAT(value, buffer, bufferSize) \
|
|
|
|
FUNCTION_LOG_UINT_FORMAT(value, buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT64_TYPE \
|
2018-05-18 11:57:32 -04:00
|
|
|
uint64_t
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_UINT64_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
cvtUInt64ToZ(value, buffer, bufferSize)
|
|
|
|
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_LOG_VOID_TYPE \
|
|
|
|
void
|
|
|
|
#define FUNCTION_LOG_VOID_FORMAT(value, buffer, bufferSize) \
|
|
|
|
typeToLog("void", buffer, bufferSize)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_STRINGZ_TYPE \
|
2019-01-28 22:33:29 +02:00
|
|
|
char *
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_STRINGZ_FORMAT(value, buffer, bufferSize) \
|
2018-05-18 11:57:32 -04:00
|
|
|
strzToLog(value, buffer, bufferSize)
|
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Macros to return function results (or void)
|
|
|
|
***********************************************************************************************************************************/
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_BASE(typePre, typeMacroPrefix, typePost, ...) \
|
2018-05-18 11:57:32 -04:00
|
|
|
do \
|
|
|
|
{ \
|
2022-04-21 07:45:59 -04:00
|
|
|
typePre FUNCTION_LOG_##typeMacroPrefix##_TYPE typePost FUNCTION_LOG_RETURN_result = __VA_ARGS__; \
|
2018-05-18 11:57:32 -04:00
|
|
|
\
|
2019-05-11 14:51:51 -04:00
|
|
|
STACK_TRACE_POP(false); \
|
2018-05-18 11:57:32 -04:00
|
|
|
\
|
2019-05-11 18:20:57 -04:00
|
|
|
IF_LOG_ANY(FUNCTION_LOG_LEVEL()) \
|
2018-05-18 11:57:32 -04:00
|
|
|
{ \
|
|
|
|
char buffer[STACK_TRACE_PARAM_MAX]; \
|
|
|
|
\
|
2019-01-21 17:41:59 +02:00
|
|
|
FUNCTION_LOG_##typeMacroPrefix##_FORMAT(FUNCTION_LOG_RETURN_result, buffer, sizeof(buffer)); \
|
2019-11-22 13:33:26 -05:00
|
|
|
LOG_FMT(FUNCTION_LOG_LEVEL(), 0, "=> %s", buffer); \
|
2018-05-18 11:57:32 -04:00
|
|
|
} \
|
|
|
|
\
|
2019-01-21 17:41:59 +02:00
|
|
|
return FUNCTION_LOG_RETURN_result; \
|
2018-05-18 11:57:32 -04:00
|
|
|
} \
|
2019-09-07 12:32:25 -04:00
|
|
|
while (0)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(, typeMacroPrefix, , __VA_ARGS__)
|
2019-01-28 22:33:29 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_P(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(, typeMacroPrefix, *, __VA_ARGS__)
|
2019-01-28 22:33:29 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_PP(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(, typeMacroPrefix, **, __VA_ARGS__)
|
2019-01-28 09:44:10 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_CONST(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(const, typeMacroPrefix, , __VA_ARGS__)
|
2019-01-28 22:33:29 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_CONST_P(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(const, typeMacroPrefix, *, __VA_ARGS__)
|
2019-01-28 22:33:29 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_CONST_PP(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_LOG_RETURN_BASE(const, typeMacroPrefix, **, __VA_ARGS__)
|
2019-01-28 09:44:10 +02:00
|
|
|
|
2022-04-21 07:45:59 -04:00
|
|
|
#define FUNCTION_LOG_RETURN_STRUCT(...) \
|
2021-01-13 07:49:47 -05:00
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
STACK_TRACE_POP(false); \
|
|
|
|
\
|
|
|
|
IF_LOG_ANY(FUNCTION_LOG_LEVEL()) \
|
|
|
|
LOG_FMT(FUNCTION_LOG_LEVEL(), 0, "=> struct"); \
|
|
|
|
\
|
2022-04-21 07:45:59 -04:00
|
|
|
return __VA_ARGS__; \
|
2021-01-13 07:49:47 -05:00
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_LOG_RETURN_VOID() \
|
2018-05-18 11:57:32 -04:00
|
|
|
do \
|
|
|
|
{ \
|
2019-05-11 14:51:51 -04:00
|
|
|
STACK_TRACE_POP(false); \
|
2018-05-18 11:57:32 -04:00
|
|
|
\
|
2019-05-11 18:20:57 -04:00
|
|
|
LOG(FUNCTION_LOG_LEVEL(), 0, "=> void"); \
|
2018-05-18 11:57:32 -04:00
|
|
|
} \
|
2019-09-07 12:32:25 -04:00
|
|
|
while (0)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Function Test Macros
|
|
|
|
|
2021-01-27 10:29:23 -05:00
|
|
|
In debug builds these macros will update the stack trace with function names and parameters but will not log. In production builds
|
|
|
|
all test macros are compiled out (except for return statements).
|
|
|
|
|
2021-04-13 18:06:07 -04:00
|
|
|
Ignore DEBUG_TEST_TRACE_MACRO if DEBUG is not defined because the underlying functions that support the macros will not be present.
|
2018-05-18 11:57:32 -04:00
|
|
|
***********************************************************************************************************************************/
|
2021-04-13 18:06:07 -04:00
|
|
|
#ifdef DEBUG
|
2019-02-27 17:09:19 +02:00
|
|
|
#ifdef DEBUG_TEST_TRACE
|
2021-01-27 10:29:23 -05:00
|
|
|
#define DEBUG_TEST_TRACE_MACRO
|
|
|
|
#endif // DEBUG_TEST_TRACE
|
2021-04-13 18:06:07 -04:00
|
|
|
#endif // DEBUG
|
2021-01-27 10:29:23 -05:00
|
|
|
|
2022-04-20 14:09:49 -04:00
|
|
|
// Annotate functions that do not return so it is clear why there is no FUNCTION_TEST_RETURN*() macro
|
|
|
|
#define FUNCTION_TEST_NO_RETURN()
|
|
|
|
|
2021-01-27 10:29:23 -05:00
|
|
|
#ifdef DEBUG_TEST_TRACE_MACRO
|
2018-05-18 11:57:32 -04:00
|
|
|
#define FUNCTION_TEST_BEGIN() \
|
2021-08-09 17:29:09 -04:00
|
|
|
/* Ensure that FUNCTION_LOG_BEGIN() and FUNCTION_TEST_BEGIN() are not both used in a single function by declaring the */ \
|
|
|
|
/* same variable that FUNCTION_LOG_BEGIN() uses to track logging */ \
|
|
|
|
LogLevel FUNCTION_LOG_LEVEL(); \
|
|
|
|
(void)FUNCTION_LOG_LEVEL(); \
|
|
|
|
\
|
|
|
|
/* Ensure that FUNCTION_TEST_RETURN*() is not used with FUNCTION_LOG_BEGIN*() by declaring a variable that will be */ \
|
|
|
|
/* referenced in FUNCTION_TEST_RETURN*() */ \
|
|
|
|
bool FUNCTION_TEST_BEGIN_exists; \
|
|
|
|
\
|
2018-05-18 11:57:32 -04:00
|
|
|
if (stackTraceTest()) \
|
|
|
|
{ \
|
|
|
|
STACK_TRACE_PUSH(logLevelDebug); \
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceParamLog(); \
|
|
|
|
stackTraceTestStop()
|
2018-05-18 11:57:32 -04:00
|
|
|
|
|
|
|
#define FUNCTION_TEST_PARAM(typeMacroPrefix, param) \
|
2019-01-21 17:41:59 +02:00
|
|
|
FUNCTION_LOG_PARAM(typeMacroPrefix, param)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_TEST_PARAM_P(typeName, param) \
|
|
|
|
FUNCTION_LOG_PARAM_P(typeName, param)
|
|
|
|
|
|
|
|
#define FUNCTION_TEST_PARAM_PP(typeName, param) \
|
|
|
|
FUNCTION_LOG_PARAM_PP(typeName, param)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
|
|
|
#define FUNCTION_TEST_END() \
|
2021-08-09 17:29:09 -04:00
|
|
|
/* CHECK for presense of FUNCTION_TEST_BEGIN*() */ \
|
|
|
|
(void)FUNCTION_TEST_BEGIN_exists; \
|
|
|
|
\
|
2019-05-11 07:57:49 -04:00
|
|
|
stackTraceTestStart(); \
|
2018-05-18 11:57:32 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#define FUNCTION_TEST_VOID() \
|
|
|
|
FUNCTION_TEST_BEGIN(); \
|
|
|
|
FUNCTION_TEST_END();
|
|
|
|
|
2022-04-24 19:19:46 -04:00
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_BASE(typePre, type, typePost, ...) \
|
2018-05-18 11:57:32 -04:00
|
|
|
do \
|
|
|
|
{ \
|
2021-08-09 17:29:09 -04:00
|
|
|
/* CHECK for presense of FUNCTION_TEST_BEGIN*() */ \
|
|
|
|
(void)FUNCTION_TEST_BEGIN_exists; \
|
|
|
|
\
|
2022-04-24 19:19:46 -04:00
|
|
|
typePre type typePost FUNCTION_TEST_result = __VA_ARGS__; \
|
|
|
|
\
|
2019-05-11 14:51:51 -04:00
|
|
|
STACK_TRACE_POP(true); \
|
2022-04-24 19:19:46 -04:00
|
|
|
\
|
|
|
|
return FUNCTION_TEST_result; \
|
2018-05-18 11:57:32 -04:00
|
|
|
} \
|
2019-09-07 12:32:25 -04:00
|
|
|
while (0)
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2022-04-24 19:19:46 -04:00
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(typePre, typeMacroPrefix, typePost, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(typePre, FUNCTION_LOG_##typeMacroPrefix##_TYPE, typePost, __VA_ARGS__)
|
|
|
|
|
|
|
|
#define FUNCTION_TEST_RETURN(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(, typeMacroPrefix, , __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_P(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(, typeMacroPrefix, *, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_PP(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(, typeMacroPrefix, **, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(const, typeMacroPrefix, , __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST_P(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(const, typeMacroPrefix, *, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST_PP(typeMacroPrefix, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_MACRO_BASE(const, typeMacroPrefix, **, __VA_ARGS__)
|
|
|
|
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(, type, , __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_P(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(, type, *, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_PP(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(, type, **, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(const, type, , __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST_P(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(const, type, *, __VA_ARGS__)
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST_PP(type, ...) \
|
|
|
|
FUNCTION_TEST_RETURN_TYPE_BASE(const, type, **, __VA_ARGS__)
|
|
|
|
|
2019-01-21 17:41:59 +02:00
|
|
|
#define FUNCTION_TEST_RETURN_VOID() \
|
2021-08-09 17:29:09 -04:00
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
/* CHECK for presense of FUNCTION_TEST_BEGIN*() */ \
|
|
|
|
(void)FUNCTION_TEST_BEGIN_exists; \
|
|
|
|
\
|
|
|
|
STACK_TRACE_POP(true); \
|
2022-04-20 14:09:49 -04:00
|
|
|
return; \
|
2021-08-09 17:29:09 -04:00
|
|
|
} \
|
|
|
|
while (0)
|
2018-05-18 11:57:32 -04:00
|
|
|
#else
|
|
|
|
#define FUNCTION_TEST_BEGIN()
|
|
|
|
#define FUNCTION_TEST_PARAM(typeMacroPrefix, param)
|
2019-01-28 22:33:29 +02:00
|
|
|
#define FUNCTION_TEST_PARAM_P(typeMacroPrefix, param)
|
|
|
|
#define FUNCTION_TEST_PARAM_PP(typeMacroPrefix, param)
|
2018-05-18 11:57:32 -04:00
|
|
|
#define FUNCTION_TEST_END()
|
|
|
|
#define FUNCTION_TEST_VOID()
|
2022-04-24 19:19:46 -04:00
|
|
|
|
|
|
|
#define FUNCTION_TEST_RETURN(typeMacroPrefix, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_P(typeMacroPrefix, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_PP(typeMacroPrefix, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST(typeMacroPrefix, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST_P(typeMacroPrefix, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_CONST_PP(typeMacroPrefix, ...) \
|
2022-04-21 07:45:59 -04:00
|
|
|
return __VA_ARGS__
|
2022-04-24 19:19:46 -04:00
|
|
|
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_P(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_PP(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST_P(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
#define FUNCTION_TEST_RETURN_TYPE_CONST_PP(type, ...) \
|
|
|
|
return __VA_ARGS__
|
|
|
|
|
2022-04-20 14:09:49 -04:00
|
|
|
#define FUNCTION_TEST_RETURN_VOID() \
|
|
|
|
return
|
2021-01-27 10:29:23 -05:00
|
|
|
#endif // DEBUG_TEST_TRACE_MACRO
|
2018-05-18 11:57:32 -04:00
|
|
|
|
2018-03-12 14:31:22 -04:00
|
|
|
#endif
|