1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
11 * This file is part of LibreOffice published API.
14 #ifndef INCLUDED_SAL_DETAIL_LOG_H
15 #define INCLUDED_SAL_DETAIL_LOG_H
17 #include "sal/config.h"
19 #include "sal/saldllapi.h"
20 #include "sal/types.h"
24 /* This header makes available replacements working in both C and C++ for the
25 obsolete osl/diagnose.h functionality that in turn is used from both C and
26 C++ code and the obsolete tools/debug.hxx functionality that uses printf-style
27 formatting. Once that obsolete functionality is removed, this header can be
30 This header uses variadic macros in both C (where they are officially only
31 supported since C99) and C++ (where they are officially only supported since
32 C++11). It appears that all relevant compilers (esp. GCC 4.0 and MS VS 2008
33 Express) already support them in their C and C++ dialects. See also
34 <http://wiki.apache.org/stdcxx/C++0xCompilerSupport>.
36 Avoid the use of other sal code in this header as much as possible, so that
37 this code can be called from other sal code without causing endless
41 #if defined __cplusplus
46 Clang warns about 'sal_True && sal_True' (those being integers and not booleans)
47 when it sees preprocessed source (-save-temps or using icecream)
49 #if defined __cplusplus
50 #define SAL_LOG_TRUE true
51 #define SAL_LOG_FALSE false
53 #define SAL_LOG_TRUE sal_True
54 #define SAL_LOG_FALSE sal_False
57 enum sal_detail_LogLevel
{
58 SAL_DETAIL_LOG_LEVEL_INFO
, SAL_DETAIL_LOG_LEVEL_WARN
,
59 SAL_DETAIL_LOG_LEVEL_DEBUG
= SAL_MAX_ENUM
62 SAL_DLLPUBLIC
void SAL_CALL
sal_detail_logFormat(
63 enum sal_detail_LogLevel level
, char const * area
, char const * where
,
64 char const * format
, ...)
66 __attribute__((format(printf
, 4, 5)))
70 #if defined __cplusplus
74 #define SAL_DETAIL_LOG_FORMAT(condition, level, area, where, ...) \
77 sal_detail_logFormat((level), (area), (where), __VA_ARGS__); \
79 } while (SAL_LOG_FALSE)
81 #if defined SAL_LOG_INFO
82 #define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_TRUE
84 #define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_FALSE
86 #if defined SAL_LOG_WARN
87 #define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_TRUE
89 #define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_FALSE
92 #define SAL_DETAIL_WHERE __FILE__ ":" SAL_STRINGIFY(__LINE__) ": "
94 #define SAL_DETAIL_INFO_IF_FORMAT(condition, area, ...) \
95 SAL_DETAIL_LOG_FORMAT( \
96 SAL_DETAIL_ENABLE_LOG_INFO && (condition), SAL_DETAIL_LOG_LEVEL_INFO, \
97 area, SAL_DETAIL_WHERE, __VA_ARGS__)
99 #define SAL_DETAIL_WARN_IF_FORMAT(condition, area, ...) \
100 SAL_DETAIL_LOG_FORMAT( \
101 SAL_DETAIL_ENABLE_LOG_WARN && (condition), SAL_DETAIL_LOG_LEVEL_WARN, \
102 area, SAL_DETAIL_WHERE, __VA_ARGS__)
108 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */