1 /* Copyright (C) 2016-2017 Shengyu Zhang <i@silverrainz.me>
2  *
3  * This file is part of Srain.
4  *
5  * Srain is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #ifndef __LOG_H
20 #define __LOG_H
21 
22 #include <glib.h>
23 
24 #include "srain.h"
25 #include "ret.h"
26 
27 typedef enum _SrnLogLevel SrnLogLevel;
28 typedef struct _SrnLoggerConfig SrnLoggerConfig;
29 typedef struct _SrnLogger SrnLogger;
30 
31 enum _SrnLogLevel {
32     LOG_DEBUG,
33     LOG_INFO,
34     LOG_WARN,
35     LOG_ERROR,
36     LOG_MAX,
37 };
38 
39 struct _SrnLoggerConfig {
40     bool prompt_color;
41     bool prompt_file;
42     bool prompt_function;
43     bool prompt_line;
44 
45     GList *debug_targets;
46     GList *info_targets;
47     GList *warn_targets;
48     GList *error_targets;
49 };
50 
51 /* Debug output */
52 #define DBG_FR(...) \
53     srn_logger_log(srn_logger_get_default(), LOG_DEBUG, TRUE, TRUE, \
54             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
55 
56 #define DBG_F(...) \
57     srn_logger_log(srn_logger_get_default(), LOG_DEBUG, TRUE, FALSE, \
58             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
59 
60 #define DBG(...) \
61     srn_logger_log(srn_logger_get_default(), LOG_DEBUG, FALSE, FALSE, \
62             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
63 
64 /* Info output */
65 #define LOG_FR(...) \
66     srn_logger_log(srn_logger_get_default(), LOG_INFO, TRUE, TRUE, \
67             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
68 
69 #define LOG_F(...) \
70     srn_logger_log(srn_logger_get_default(), LOG_INFO, TRUE, FALSE, \
71             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
72 
73 #define LOG(...) \
74     srn_logger_log(srn_logger_get_default(), LOG_INFO, FALSE, FALSE, \
75             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
76 
77 /* Warn output */
78 #define WARN_FR(...) \
79     srn_logger_log(srn_logger_get_default(), LOG_WARN, TRUE, TRUE, \
80             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
81 
82 #define WARN_F(...) \
83     srn_logger_log(srn_logger_get_default(), LOG_WARN, TRUE, FALSE, \
84             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
85 
86 #define WARN(...) \
87     srn_logger_log(srn_logger_get_default(), LOG_WARN, FALSE, FALSE \
88             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
89 
90 #define ERR_FR(...) \
91     srn_logger_log(srn_logger_get_default(), LOG_ERROR, TRUE, TRUE, \
92             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
93 
94 #define ERR_F(...) \
95     srn_logger_log(srn_logger_get_default(), LOG_ERROR, TRUE, FALSE, \
96             __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
97 
98 SrnLogger *srn_logger_get_default(void);
99 void srn_logger_set_default(SrnLogger *logger);
100 
101 SrnLogger *srn_logger_new(SrnLoggerConfig *cfg);
102 void srn_logger_free(SrnLogger *logger);
103 void srn_logger_set_config(SrnLogger *logger, SrnLoggerConfig *cfg);
104 SrnLoggerConfig *srn_logger_get_config(SrnLogger *logger);
105 void srn_logger_log(SrnLogger *logger, SrnLogLevel lv, bool print_prompt,
106         bool new_line, const char *file, const char *func, int line,
107         const char *fmt, ...);
108 
109 SrnLoggerConfig *srn_logger_config_new(void);
110 void srn_logger_config_free(SrnLoggerConfig *cfg);
111 SrnRet srn_logger_config_check(SrnLoggerConfig *cfg);
112 
113 #endif /* __LOG_H */
114