1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
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/.
8 */
9
10#ifndef INCLUDED_SAL_DETAIL_LOG_H
11#define INCLUDED_SAL_DETAIL_LOG_H
12
13#include <sal/config.h>
14
15#include <sal/saldllapi.h>
16#include <sal/types.h>
17
18/** @cond INTERNAL */
19
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
25 removed, too.
26
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>.
32
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
35 recursion.
36*/
37
38#if defined __cplusplus
39extern "C" {
40#endif
41
42/*
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)
45*/
46#if defined __cplusplus
47#define SAL_LOG_TRUE true
48#define SAL_LOG_FALSE false
49#else
50#define SAL_LOG_TRUE sal_True
51#define SAL_LOG_FALSE sal_False
52#endif
53
54enum sal_detail_LogLevel {
55 SAL_DETAIL_LOG_LEVEL_INFO, SAL_DETAIL_LOG_LEVEL_WARN,
56 SAL_DETAIL_LOG_LEVEL_DEBUG = SAL_MAX_ENUM
57};
58
59SAL_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)))
65#endif
66 ;
67
68#if defined __cplusplus
69}
70#endif
71
72#define SAL_DETAIL_LOG_FORMAT(condition, level, area, where, ...) \
73 do { \
74 if (condition) { \
75 sal_detail_logFormat((level), (area), (where), __VA_ARGS__); \
76 } \
77 } while (SAL_LOG_FALSE)
78
79#if defined SAL_LOG_INFO
80#define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_TRUE
81#else
82#define SAL_DETAIL_ENABLE_LOG_INFO SAL_LOG_FALSE
83#endif
84#if defined SAL_LOG_WARN
85#define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_TRUE
86#else
87#define SAL_DETAIL_ENABLE_LOG_WARN SAL_LOG_FALSE
88#endif
89
90#define SAL_DETAIL_WHERE __FILE__ ":" SAL_STRINGIFY(__LINE__) ": "
91
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__)
96
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__)
101
102/** @endcond */
103
104#endif
105
106/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
107