105 #define CONCAT_(x, y) x ## y 106 #define CONCAT(x, y) CONCAT_(x, y)
108 #define MKSTR(x) MKSTR_(x)
117 #define LOGNS_NAME ""
120 #else // user defined namespace 123 #define LOGNS_NAME MKSTR(LOGNS)
124 #define LOGNS_PREFACE LOGNS_NAME
128 #define LOGNS_PUT(id) CONCAT(LOGNS, id) 134 #define LOG_PREFACE_TEXT LOGMOD ": " 135 #elif defined(LOGNS_PREFACE)
136 #define LOG_PREFACE_TEXT LOGNS_PREFACE ": " 139 #define LOG_PREFACE_TEXT ""
146 #define LOG_VAR_THRESHOLD LOGNS_PUT(LogThresholdLevel) 149 #define LOG_SET_THRESHOLD LOGNS_PUT(LogSetThresholdLevel) 152 #define LOG_GET_THRESHOLD LOGNS_PUT(LogGetThresholdLevel) 155 #define LOG_VAR_COLOR_EN LOGNS_PUT(LogColorEnable) 158 #define LOG_SET_LOGFILE LogSetLogFile 160 #define LOG_GET_LOGFILE LogGetLogFile 162 #define LOG_SET_COLOR_ENABLE LogSetColorEnable 164 #define LOG_SET_TIMESTAMP_ENABLE LogSetTimestampEnable 166 #define LOG_ATTACH_LOGFP LogAttachLogFp 168 #define LOG_GET_LOGFP LogGetLogFp 170 #define LOGGER LogPrintf 172 #define LOGGER_CALL LogCallPrintf 178 #define LOGGING_NA -1 179 #define LOG_LEVEL_OFF 0
180 #define LOG_LEVEL_ERROR 1
181 #define LOG_LEVEL_DIAG1 2
182 #define LOG_LEVEL_DIAG2 3
183 #define LOG_LEVEL_DIAG3 4
184 #define LOG_LEVEL_DIAG4 5
185 #define LOG_LEVEL_DIAG5 6
186 #ifndef LOG_LEVEL_DFT
187 #define LOG_LEVEL_DFT 0 195 #define LOGABLE(level) ((level) <= LOG_VAR_THRESHOLD) 200 #define LOG_IN_COLOR() (LOG_VAR_COLOR_EN) 205 #define LOG_WITH_TIMESTAMP() (LOG_VAR_TIMESTAMP_EN) 210 #define LOG_FILENAME_STDERR "stderr" 211 #define LOG_FILENAME_STDOUT "stdout"
212 #define LOG_FILENAME_DFT LOG_FILENAME_STDERR
213 #define LOG_FP_DFT stderr
218 #define LOG_COLOR_EN_DFT true 219 #define LOG_TIMESTAMP_EN_DFT true
225 #define LOGFUNCNAME __func__ 230 #define LOG_COLOR_PRE "\033[" 231 #define LOG_COLOR_POST "\033[0m"
232 #define LOG_COLOR_RED "0;31m"
233 #define LOG_COLOR_GREEN "0;32m"
234 #define LOG_COLOR_YELLOW "0;33m"
235 #define LOG_COLOR_BLUE "0;34m"
236 #define LOG_COLOR_MAGENTA "0;35m"
237 #define LOG_COLOR_CYAN "0;36m"
238 #define LOG_COLOR_LIGHT_RED "1;31m"
239 #define LOG_COLOR_LIGHT_GREEN "1;32m"
240 #define LOG_COLOR_LIGHT_YELLOW "1;33m"
241 #define LOG_COLOR_LIGHT_BLUE "1;34m"
242 #define LOG_COLOR_LIGHT_MAGENTA "1;35m"
243 #define LOG_COLOR_LIGHT_CYAN "1;36m"
245 #define LOG_COLOR_ERROR LOG_COLOR_PRE LOG_COLOR_RED 246 #define LOG_COLOR_WARN LOG_COLOR_PRE LOG_COLOR_YELLOW
247 #define LOG_COLOR_DIAG LOG_COLOR_PRE LOG_COLOR_GREEN
250 #define LOG_PREFACE LOG_COLOR_PRE LOGMOD_COLOR LOG_PREFACE_TEXT LOG_COLOR_POST 253 #define LOG_PREFACE LOG_PREFACE_TEXT 256 #define LOG_PREFACE_PLAIN LOG_PREFACE_TEXT 269 #define LOGARGS_DIAG(level, fmt, ...) \ 270 LOG_PREFACE LOG_COLOR_DIAG "Diag%d: %s[%d] " LOG_COLOR_POST fmt, \ 271 (level-1), __FILE__, __LINE__, ##__VA_ARGS__ 279 #define LOGARGS_DIAG_PLAIN(level, fmt, ...) \ 280 LOG_PREFACE_PLAIN "Diag%d: %s[%d] " fmt, \ 281 (level-1), __FILE__, __LINE__, ##__VA_ARGS__ 288 #define LOGARGS_WARN(fmt, ...) \ 289 LOG_PREFACE LOG_COLOR_WARN "Warning: %s[%d] " LOG_COLOR_POST fmt, \ 290 __FILE__, __LINE__, ##__VA_ARGS__ 297 #define LOGARGS_WARN_PLAIN(fmt, ...) \ 298 LOG_PREFACE_PLAIN "Warning: %s[%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__ 305 #define LOGARGS_ERR(fmt, ...) \ 306 LOG_PREFACE LOG_COLOR_ERROR "Error: %s[%d] " LOG_COLOR_POST fmt, \ 307 __FILE__, __LINE__, ##__VA_ARGS__ 314 #define LOGARGS_ERR_PLAIN(fmt, ...) \ 315 LOG_PREFACE_PLAIN "Error: %s[%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__ 322 #define LOGARGS_SYSERR(fmt, ...) \ 323 LOG_PREFACE LOG_COLOR_ERROR "Error: %s[%d] " LOG_COLOR_POST "%s(errno=%d): " \ 324 fmt, __FILE__, __LINE__, strerror(errno), errno, ##__VA_ARGS__ 331 #define LOGARGS_SYSERR_PLAIN(fmt, ...) \ 332 LOG_PREFACE_PLAIN "Error: %s[%d] " "%s(errno=%d): " fmt, \ 333 __FILE__, __LINE__, strerror(errno), errno, ##__VA_ARGS__ 348 #define LOGDIAG(level, fmt, ...) \ 351 if( LOGABLE(level) ) \ 353 if( LOG_IN_COLOR() ) \ 355 LOGGER(LOGARGS_DIAG(level, fmt), ##__VA_ARGS__); \ 359 LOGGER(LOGARGS_DIAG_PLAIN(level, fmt), ##__VA_ARGS__); \ 371 #define LOGUSER(level, fmt, ...) \ 372 LOGDIAG(level+LOG_LEVEL_DIAG3+1, fmt, ##__VA_ARGS__) 379 #define LOGDIAG5(fmt, ...) LOGDIAG(LOG_LEVEL_DIAG5, fmt, ##__VA_ARGS__) 386 #define LOGDIAG4(fmt, ...) LOGDIAG(LOG_LEVEL_DIAG4, fmt, ##__VA_ARGS__) 393 #define LOGDIAG3(fmt, ...) LOGDIAG(LOG_LEVEL_DIAG3, fmt, ##__VA_ARGS__) 400 #define LOGDIAG2(fmt, ...) LOGDIAG(LOG_LEVEL_DIAG2, fmt, ##__VA_ARGS__) 407 #define LOGDIAG1(fmt, ...) LOGDIAG(LOG_LEVEL_DIAG1, fmt, ##__VA_ARGS__) 414 #define LOGDIAGCALL(level, ...) \ 417 if( LOGABLE(level) ) \ 419 if( LOG_IN_COLOR() ) \ 421 LOGGER_CALL(LOG_PREFACE, level, __FILE__, __LINE__, \ 422 LOGFUNCNAME, ##__VA_ARGS__, NULL, 0); \ 426 LOGGER_CALL(LOG_PREFACE_PLAIN, level, __FILE__, __LINE__, \ 427 LOGFUNCNAME, ##__VA_ARGS__, NULL, 0); \ 436 #define LOGDIAG5CALL(...) LOGDIAGCALL(LOG_LEVEL_DIAG5, ##__VA_ARGS__) 442 #define LOGDIAG4CALL(...) LOGDIAGCALL(LOG_LEVEL_DIAG4, ##__VA_ARGS__) 448 #define LOGDIAG3CALL(...) LOGDIAGCALL(LOG_LEVEL_DIAG3, ##__VA_ARGS__) 454 #define LOGDIAG2CALL(...) LOGDIAGCALL(LOG_LEVEL_DIAG2, ##__VA_ARGS__) 460 #define LOGDIAG1CALL(...) LOGDIAGCALL(LOG_LEVEL_DIAG1, ##__VA_ARGS__) 467 #define LOGWARN(fmt, ...) \ 470 if( LOGABLE(LOG_LEVEL_ERROR) ) \ 472 if( LOG_IN_COLOR() ) \ 474 LOGGER(LOGARGS_WARN(fmt), ##__VA_ARGS__); \ 478 LOGGER(LOGARGS_WARN_PLAIN(fmt), ##__VA_ARGS__); \ 488 #define LOGERROR(fmt, ...) \ 491 if( LOGABLE(LOG_LEVEL_ERROR) ) \ 493 if( LOG_IN_COLOR() ) \ 495 LOGGER(LOGARGS_ERR(fmt), ##__VA_ARGS__); \ 499 LOGGER(LOGARGS_ERR_PLAIN(fmt), ##__VA_ARGS__); \ 509 #define LOGSYSERROR(fmt, ...) \ 512 if( LOGABLE(LOG_LEVEL_ERROR) ) \ 514 int errsave = errno; \ 515 if( LOG_IN_COLOR() ) \ 517 LOGGER(LOGARGS_SYSERR(fmt), ##__VA_ARGS__); \ 521 LOGGER(LOGARGS_SYSERR_PLAIN(fmt), ##__VA_ARGS__); \ 527 #else // do not compile logging 531 #define LOGDIAG5(...) 532 #define LOGDIAG4(...) 533 #define LOGDIAG3(...) 534 #define LOGDIAG2(...) 535 #define LOGDIAG1(...) 536 #define LOGDIAG5CALL(...) 537 #define LOGDIAG4CALL(...) 538 #define LOGDIAG3CALL(...) 539 #define LOGDIAG2CALL(...) 540 #define LOGDIAG1CALL(...) 542 #define LOGERROR(...) 543 #define LOGSYSERROR(...) 555 #define _VARFMT(var, fmt) #var "=" fmt 556 #define _TF(b) ((b)? "true": "false")
557 #define _CHARFMT(var) (isprint(var)? #var "='%c'": #var "=0x%02x")
576 #define _TFMT(var, fmt) #var "=" fmt, var 577 #define _TSTR(var) _TFMT(var, "\"%s\"")
578 #define _TLONG(var) _TFMT(var, "%ld")
579 #define _TULONG(var) _TFMT(var, "%lu")
580 #define _THEX(var) _TFMT(var, "0x%x")
581 #define _TINT(var) _TFMT(var, "%d")
582 #define _TUINT(var) _TFMT(var, "%u")
583 #define _TSHORT(var) _TFMT(var, "%hd")
584 #define _TUSHORT(var) _TFMT(var, "%hu")
585 #define _TFLOAT(var) _TFMT(var, "%f")
586 #define _TPTR(var) _TFMT(var, "%p")
587 #define _TBOOL(var) _VARFMT(var, "%s"), _TF(var)
588 #define _TCHAR(var) _CHARFMT(var), var
589 #define _TVEC(var, i, fmt) #var "[%d]=" fmt, i, var[i]
590 #define _TVEC_UINT(var, i) _TVEC(var, i, "%u")
596 #define LFF "%s()", LOGFUNCNAME 606 #define LFF_ARGS(fmt, ...) \ 607 "%s(" fmt "%s", LOGFUNCNAME, ##__VA_ARGS__, ")" 619 #define LFF_BADARG(var, fmt, postfmt, ...) \ 620 "%s(" #var "=" fmt "): " postfmt, LOGFUNCNAME, var, ##__VA_ARGS__ 633 #define LFF_BADARG_VEC(var, i, fmt, postfmt, ...) \ 634 "%s(" #var "[%d]=" fmt "): " postfmt, LOGFUNCNAME, i, var[i], ##__VA_ARGS__ 650 #define CHKPTR(p, ...) \ 655 LOGERROR(_TPTR(p)); return __VA_ARGS__; \ 672 #define CHKEXPR(val, expr, valfmt, ...) \ 677 LOGERROR(_VARFMT(val, valfmt) ": failed check: %s", val, #expr); \ 678 return __VA_ARGS__; \ 687 #define CHKEXPR_INT(val, expr, ...) CHKEXPR(val, expr, "%d", ##__VA_ARGS__) 690 #define CHKEXPR_STR(val, expr, ...) CHKEXPR(val, expr, "'%s'", ##__VA_ARGS__) 693 #define CHKEXPR_LONG(val, expr, ...) CHKEXPR(val, expr, "%ld", ##__VA_ARGS__) 696 #define CHKEXPR_ULONG(val, expr, ...) CHKEXPR(val, expr, "%lu", ##__VA_ARGS__) 699 #define CHKEXPR_HEX(val, expr, ...) CHKEXPR(val, expr, "0x%x", ##__VA_ARGS__) 702 #define CHKEXPR_UINT(val, expr, ...) CHKEXPR(val, expr, "%u", ##__VA_ARGS__) 705 #define CHKEXPR_SHORT(val, expr, ...) CHKEXPR(val, expr, "%hd",## __VA_ARGS__) 708 #define CHKEXPR_USHORT(val, expr, ...) CHKEXPR(val, expr, "%hu", ##__VA_ARGS__) 711 #define CHKEXPR_PTR(val, expr, ...) CHKEXPR(val, expr, "%p", ##__VA_ARGS__) 733 #if defined(LOGNS_DEF) 735 #define LOGNS_DEF_BLOCK \ 737 int LOG_VAR_THRESHOLD = LOG_LEVEL_OFF; \ 738 int LOG_SET_THRESHOLD(int nLevel) \ 740 LOG_VAR_THRESHOLD = nLevel; \ 741 if( LOG_VAR_THRESHOLD >= LOG_LEVEL_DIAG1 ) \ 743 LOGGER(LOGARGS_DIAG(2, "Logging level set to %d", LOG_VAR_THRESHOLD)); \ 745 return LOG_VAR_THRESHOLD; \ 747 int LOG_GET_THRESHOLD() \ 749 return LOG_VAR_THRESHOLD; \ 753 #define LOGNS_DEF_BLOCK \ 755 int LOG_VAR_THRESHOLD = LOG_LEVEL_NA; \ 756 int LOG_SET_THRESHOLD(int nLevel) 767 #define LOGNS_DEF_BLOCK 843 extern void LOGGER(
const char *sFmt, ...);
858 extern void LOGGER_CALL(
const char *sPreface,
int nLevel,
859 const char *sFile,
int nLine,
860 const char *sFuncName, ...);
#define LOG_SET_LOGFILE
set output log file function name
#define LOG_SET_THRESHOLD
set threshold function name
#define LOG_GET_THRESHOLD
get threshold function name
#define LOG_SET_TIMESTAMP_ENABLE
enable/disable logging timestamps func name
#define LOG_GET_LOGFP
get current logging out stream file pointer
#define C_DECLS_BEGIN
C declaration block begin in C.
#define LOG_VAR_COLOR_EN
logging in color is [not] enabled
#define LOG_ATTACH_LOGFP
attach file pointer as logging out stream
RoadNarrows Robotics common configuration file.
#define LOG_VAR_THRESHOLD
current threshold variable name
#define C_DECLS_END
C declaration block end in C.
#define LOG_GET_LOGFILE
get output log file function name
#define LOG_SET_COLOR_ENABLE
enable/disable logging in color func name
#define LOGGER
logger function name
#define LOGGER_CALL
logger of "function call" function name