/*!
* COPYRIGHT (C) 2010-2020 Emeric Grange - All Rights Reserved
*
* This file is part of MiniTraces.
*
* MiniTraces is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MiniTraces is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with MiniTraces. If not, see .
*
* \file minitraces.h
* \author Emeric Grange
* \date 2018
* \version 0.53
*/
#ifndef MINITRACES_H
#define MINITRACES_H
/* ************************************************************************** */
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/* ************************************************************************** */
/*!
* This function displays informations about MiniTraces, which "trace levels"
* and "trace modules" are currently enabled. Its output is quite heavy so you
* should keep this for debug builds.
*/
void MiniTraces_info(void);
/*!
* \brief This function formats and output traces.
* \param file: current file where the trace call originated.
* \param line: line in file.
* \param func: current function.
* \param level: trace level.
* \param module: module called.
* \param payload: the actual trace string.
*
* \note You sould never call this function directly, please use TRACE_xxx macros instead!
*/
void MiniTraces_print(const char *file, const int line, const char *func,
const unsigned level, const unsigned module, const char *payload, ...);
/* ************************************************************************** */
// TRACE LEVELS
#define TRACE_LEVEL_ERR (1 << 0)
#define TRACE_LEVEL_WARN (1 << 1)
#define TRACE_LEVEL_INFO (1 << 2)
#define TRACE_LEVEL_1 (1 << 3)
#define TRACE_LEVEL_2 (1 << 4)
#define TRACE_LEVEL_3 (1 << 5)
#define TRACE_LEVEL_DEFAULT (TRACE_LEVEL_ERR | TRACE_LEVEL_WARN)
#define TRACE_LEVEL_DEBUG (TRACE_LEVEL_ERR | TRACE_LEVEL_WARN | TRACE_LEVEL_INFO)
#define TRACE_LEVEL_ALL (TRACE_LEVEL_ERR | TRACE_LEVEL_WARN | TRACE_LEVEL_INFO | TRACE_LEVEL_1 | TRACE_LEVEL_2 | TRACE_LEVEL_3)
/* ************************************************************************** */
typedef struct TraceModule_t
{
char module_name[8]; //!< Module name.
char module_description[32]; //!< Module description.
unsigned module_output_mask; //!< Stores the level of traces a module can output, using one or a concatenation of TRACE_LEVEL_xxx macros.
} TraceModule_t;
/* ************************************************************************** */
// Load settings and trace modules
#include "minitraces_conf.h"
/* ************************************************************************** */
#if MINITRACES_LEVEL == 2
// TRACE MACROS, fully enabled
#define TRACE_ERROR( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_ERR, MODULE, __VA_ARGS__ )
#define TRACE_WARNING( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_WARN, MODULE, __VA_ARGS__ )
#define TRACE_INFO( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_INFO, MODULE, __VA_ARGS__ )
#define TRACE_1( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_1, MODULE, __VA_ARGS__ )
#define TRACE_2( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_2, MODULE, __VA_ARGS__ )
#define TRACE_3( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_3, MODULE, __VA_ARGS__ )
#elif MINITRACES_LEVEL == 1
// TRACE MACROS, release config
#define TRACE_ERROR( MODULE, ... ) MiniTraces_print( __FILE__, __LINE__, __FUNCTION__, TRACE_LEVEL_ERR, MODULE, __VA_ARGS__ )
#define TRACE_WARNING( MODULE, ... )
#define TRACE_INFO( MODULE, ... )
#define TRACE_1( MODULE, ... )
#define TRACE_2( MODULE, ... )
#define TRACE_3( MODULE, ... )
#else // MINITRACES_LEVEL == 0
// TRACE MACROS disabled
#define TRACE_ERROR( MODULE, ... )
#define TRACE_WARNING( MODULE, ... )
#define TRACE_INFO( MODULE, ... )
#define TRACE_1( MODULE, ... )
#define TRACE_2( MODULE, ... )
#define TRACE_3( MODULE, ... )
#endif // MINITRACES_LEVEL
/* ************************************************************************** */
#if MINITRACES_COLORS == 1
#define CLR_RESET "\033[0m" //!< Reset colored output to default color of the terminal
// Regular colored text
#define CLR_BLACK "\033[0;30m"
#define CLR_RED "\033[0;31m"
#define CLR_GREEN "\033[0;32m"
#define CLR_YELLOW "\033[0;33m"
#define CLR_BLUE "\033[0;34m"
#define CLR_PURPLE "\033[0;35m"
#define CLR_CYAN "\033[0;36m"
#define CLR_WHITE "\033[0;37m"
// Bold colored text
#define BLD_BLACK "\033[1;30m"
#define BLD_RED "\033[1;31m"
#define BLD_GREEN "\033[1;32m"
#define BLD_YELLOW "\033[1;33m"
#define BLD_BLUE "\033[1;34m"
#define BLD_PURPLE "\033[1;35m"
#define BLD_CYAN "\033[1;36m"
#define BLD_WHITE "\033[1;37m"
// Bold white text, colored outline
#define OUT_BLACK "\033[1;37;40m"
#define OUT_RED "\033[1;37;41m"
#define OUT_GREEN "\033[1;37;42m"
#define OUT_YELLOW "\033[1;30;43m"
#define OUT_BLUE "\033[1;37;44m"
#define OUT_PURPLE "\033[1;37;45m"
#define OUT_CYAN "\033[1;37;46m"
#define OUT_WHITE "\033[1;30;47m"
#else // MINITRACES_COLORS == 0
#define CLR_RESET
#define CLR_BLACK
#define CLR_RED
#define CLR_GREEN
#define CLR_YELLOW
#define CLR_BLUE
#define CLR_PURPLE
#define CLR_CYAN
#define CLR_WHITE
#define BLD_BLACK
#define BLD_RED
#define BLD_GREEN
#define BLD_YELLOW
#define BLD_BLUE
#define BLD_PURPLE
#define BLD_CYAN
#define BLD_WHITE
#define OUT_BLACK
#define OUT_RED
#define OUT_GREEN
#define OUT_YELLOW
#define OUT_BLUE
#define OUT_PURPLE
#define OUT_CYAN
#define OUT_WHITE
#endif // MINITRACES_COLORS
/* ************************************************************************** */
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // MINITRACES_H