log_wrapper.h
#ifndef LOG_WRAPPER_H_
#define LOG_WRAPPER_H_
#include "stdio.h"
/**
* \brief Contains macro that wrap standard logging calls.
*
* Macros are used because passing variable argument lists are much easier
* than passing them through functions.
*/
namespace log_wrapper
{
#define STDIOLOG // enable log_wrapper
#define LOG_LEVEL_INFO // log level control:
// LOG_LEVEL_COMM LOG_LEVEL_DEBUG LOG_LEVEL_INFO
// LOG_LEVEL_WARN LOG_LEVEL_ERROR LOG_LEVEL_FATAL
#ifdef STDIOLOG
#define LOG(level, format, ...) \
do \
{ \
printf(level); \
printf(": "); \
printf(format, ##__VA_ARGS__); \
printf("\n"); \
} while (0)
#ifdef LOG_LEVEL_COMM
// WARNING: LOG_COMM produces many messages and could slow down program
// execution on the robot.
#define LOG_COMM(format, ...) LOG("COMM", format, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) LOG("DEBUG", format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) LOG("INFO", format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) LOG("WARNING", format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG("ERROR", format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#elif defined(LOG_LEVEL_DEBUG)
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...) LOG("DEBUG", format, ##__VA_ARGS__)
#define LOG_INFO(format, ...) LOG("INFO", format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) LOG("WARNING", format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG("ERROR", format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#elif defined(LOG_LEVEL_INFO)
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...) LOG("INFO", format, ##__VA_ARGS__)
#define LOG_WARN(format, ...) LOG("WARNING", format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG("ERROR", format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#elif defined(LOG_LEVEL_WARN)
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...)
#define LOG_WARN(format, ...) LOG("WARNING", format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) LOG("ERROR", format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#elif defined(LOG_LEVEL_ERROR)
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...)
#define LOG_WARN(format, ...)
#define LOG_ERROR(format, ...) LOG("ERROR", format, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#elif defined(LOG_LEVEL_FATAL)
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...)
#define LOG_WARN(format, ...)
#define LOG_ERROR(format, ...)
#define LOG_FATAL(format, ...) LOG("FATAL", format, ##__VA_ARGS__)
#endif // #ifdef LOG_LEVEL_COMM
#else
// LOG DISABLED
#define LOG_COMM(format, ...)
#define LOG_DEBUG(format, ...)
#define LOG_INFO(format, ...)
#define LOG_WARN(format, ...)
#define LOG_ERROR(format, ...)
#define LOG_FATAL(format, ...)
#endif // #ifdef STDIOLOG
} // namespace loge_wrapper
#endif /* LOG_WRAPPER_H_ */