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/.
10 #ifndef INCLUDED_SAL_DETAIL_LOG_H
11 #define INCLUDED_SAL_DETAIL_LOG_H
13 #include "sal/config.h"
15 #include "sal/saldllapi.h"
16 #include "sal/types.h"
20 /* This header makes available replacements working in both C and C++ for the
21 obsolete osl/diagnose.h functionality that in turn is used from both C and
22 C++ code and the obsolete tools/debug.hxx and
23 canvas/inc/canvas/verbosetrace.hxx functionality that uses printf-style
24 formatting. Once that obsolete functionality is removed, this header can be
27 This header uses variadic macros in both C (where they are officially only
28 supported since C99) and C++ (where they are officially only supported since
29 C++11). It appears that all relevant compilers (esp. GCC 4.0 and MS VS 2008
30 Express) already support them in their C and C++ dialects. See also
31 <http://wiki.apache.org/stdcxx/C++0xCompilerSupport>.
33 Avoid the use of other sal code in this header as much as possible, so that
34 this code can be called from other sal code without causing endless
38 #if defined __cplusplus
43 Clang warns about 'sal_True && sal_True' (those being integers and not booleans)
44 when it sees preprocessed source (-save-temps or using icecream)
46 #if defined __cplusplus
47 #define SAL_LOG_TRUE true
48 #define SAL_LOG_FALSE false
50 #define SAL_LOG_TRUE sal_True
51 #define SAL_LOG_FALSE sal_False
54 enum sal_detail_LogLevel
{
55 SAL_DETAIL_LOG_LEVEL_INFO
, SAL_DETAIL_LOG_LEVEL_WARN
,
56 SAL_DETAIL_LOG_LEVEL_DEBUG
= SAL_MAX_ENUM
59 SAL_DLLPUBLIC
void SAL_CALL
sal_detail_logFormat(
60 enum sal_detail_LogLevel level
, char const * area
, char const * where
,
61 char const * format
, ...)
62 /* TODO: enabling this will produce a huge amount of -Werror=format errors: */
63 #if defined __GNUC__ && 0
64 __attribute__((format(printf
, 4, 5)))
68 #if defined __cplusplus
72 #define SAL_DETAIL_LOG_FORMAT(condition, level, area, where, ...) \
75 sal_detail_logFormat((level), (area), (where), __VA_ARGS__); \
77 } while (SAL_LOG_FALSE)
79 #if defined SAL_LOG_INFO
80 #define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_TRUE
82 #define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_FALSE
84 #if defined SAL_LOG_WARN
85 #define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_TRUE
87 #define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_FALSE
90 #define SAL_DETAIL_WHERE __FILE__ ":" SAL_STRINGIFY(__LINE__) ": "
92 #define SAL_DETAIL_INFO_IF_FORMAT(condition, area, ...) \
93 SAL_DETAIL_LOG_FORMAT( \
94 SAL_DETAIL_ENABLE_LOG_INFO && (condition), SAL_DETAIL_LOG_LEVEL_INFO, \
95 area, SAL_DETAIL_WHERE, __VA_ARGS__)
97 #define SAL_DETAIL_WARN_IF_FORMAT(condition, area, ...) \
98 SAL_DETAIL_LOG_FORMAT( \
99 SAL_DETAIL_ENABLE_LOG_WARN && (condition), SAL_DETAIL_LOG_LEVEL_WARN, \
100 area, SAL_DETAIL_WHERE, __VA_ARGS__)
106 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */