1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     dbg_Logger.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 18508 $
14  *---------------------------------------------------------------------------*/
15 
16 /*!
17     @file
18 
19     :include nn/dbg.h
20 */
21 
22 #ifndef NN_DBG_DBG_LOGGER_H_
23 #define NN_DBG_DBG_LOGGER_H_
24 
25 #ifdef __cplusplus
26 
27 #include <nn/types.h>
28 #include <nn/dbg/dbg_DebugString.h>
29 #include <nn/config.h>
30 
31 #define NN_LOG_LEVEL_DEBUG      0
32 #define NN_LOG_LEVEL_INFO       1
33 #define NN_LOG_LEVEL_WARN       2
34 #define NN_LOG_LEVEL_ERROR      3
35 #define NN_LOG_LEVEL_FATAL      4
36 #define NN_LOG_LEVEL_FORCE      5
37 #define NN_LOG_LEVEL_DISABLE    6
38 
39 #define NN_LOG_LEVEL_DEFAULT NN_LOG_LEVEL_WARN
40 
41 #ifndef NN_LOG_LEVEL
42 #define NN_LOG_LEVEL NN_LOG_LEVEL_DEFAULT
43 #endif
44 
45 #ifdef NN_SWITCH_DISABLE_DEBUG_PRINT
46 #undef NN_LOG_LEVEL
47 #define NN_LOG_LEVEL NN_LOG_LEVEL_DISABLE
48 #endif
49 
50 #if NN_LOG_LEVEL <= NN_LOG_LEVEL_DEBUG
51     #define NN_LOG_DEBUG_ENABLE
52 #endif
53 
54 #if NN_LOG_LEVEL <= NN_LOG_LEVEL_INFO
55     #define NN_LOG_INFO_ENABLE
56 #endif
57 
58 #if NN_LOG_LEVEL <= NN_LOG_LEVEL_WARN
59     #define NN_LOG_WARN_ENABLE
60 #endif
61 
62 #if NN_LOG_LEVEL <= NN_LOG_LEVEL_ERROR
63     #define NN_LOG_ERROR_ENABLE
64 #endif
65 
66 #if NN_LOG_LEVEL <= NN_LOG_LEVEL_FATAL
67     #define NN_LOG_FATAL_ENABLE
68 #endif
69 
70 #ifndef NN_LOG_BASE
71 #define NN_LOG_BASE(level, ...)                                     \
72     ::nn::dbg::detail::Logger::PrintLog(::nn::dbg::detail::Logger::LEVEL_ ## level,   \
73         NN_FUNCTION, NN_FILE_NAME, __LINE__, __VA_ARGS__)
74 #endif
75 
76 /*
77     @def NN_LOG_NAMESPACE
78 
79     @brief ログ出力時に namespace を表示するかどうかを設定します。
80 
81     @param[in] x namespace を表示するならば true、そうでなければ false
82 */
83 #define NN_LOG_NAMESPACE(x)             ::nn::dbg::detail::Logger::SetNameSpace(x)
84 
85 /*
86     @def NN_LOG_SIGNATURE
87 
88     @brief ログ出力時に関数の引数を表示するかどうかを設定します。
89 
90     @param[in] x 関数の引数を表示するならば true、そうでなければ false
91 */
92 #define NN_LOG_SIGNATURE(x)             ::nn::dbg::detail::Logger::SetSignature(x)
93 
94 /*
95     @def NN_LOG_LONGPATH
96 
97     @brief ログ出力時にファイル名のフルパスを表示するかどうかを設定します。
98 
99     @param[in] x ファイル名のフルパスを表示するならば true、そうでなければ false
100 */
101 #define NN_LOG_LONGPATH(x)              ::nn::dbg::detail::Logger::SetLongpath(x)
102 
103 #define NN_LOG_SET_UPPER_LOG_LEVEL(x)   ::nn::dbg::detail::Logger::SetUpperLevel(x)
104 #define NN_LOG_SET_LOWER_LOG_LEVEL(x)   ::nn::dbg::detail::Logger::SetLowerLevel(x)
105 #define NN_LOG_SET_LOG_LEVEL(x)         NN_LOG_SET_LOWER_LOG_LEVEL(x)
106 
107 /*
108     @def NN_LOG_DEBUG
109 
110     @brief nn::dbg::detail::Logger::LEVEL_DEBUG レベルでログ出力を行います。
111 */
112 #ifdef NN_LOG_DEBUG_ENABLE
113 #define NN_LOG_DEBUG(...)  NN_LOG_BASE(DEBUG, __VA_ARGS__)
114 #else
115 #define NN_LOG_DEBUG(...) ((void)0)
116 #endif
117 
118 /*
119     @def NN_LOG_INFO
120 
121     @brief nn::dbg::detail::Logger::LEVEL_INFO レベルでログ出力を行います。
122 */
123 #ifdef NN_LOG_INFO_ENABLE
124 #define NN_LOG_INFO(...)  NN_LOG_BASE(INFO, __VA_ARGS__)
125 #else
126 #define NN_LOG_INFO(...) ((void)0)
127 #endif
128 
129 /*
130     @def NN_LOG_WARN
131 
132     @brief nn::dbg::detail::Logger::LEVEL_WARN レベルでログ出力を行います。
133 */
134 #ifdef NN_LOG_WARN_ENABLE
135 #define NN_LOG_WARN(...)  NN_LOG_BASE(WARN, __VA_ARGS__)
136 #else
137 #define NN_LOG_WARN(...) ((void)0)
138 #endif
139 
140 /*
141     @def NN_LOG_ERROR
142 
143     @brief nn::dbg::detail::Logger::LEVEL_ERROR レベルでログ出力を行います。
144 */
145 #ifdef NN_LOG_ERROR_ENABLE
146 #define NN_LOG_ERROR(...)  NN_LOG_BASE(ERROR, __VA_ARGS__)
147 #else
148 #define NN_LOG_ERROR(...) ((void)0)
149 #endif
150 
151 /*
152     @def NN_LOG_FATAL
153 
154     @brief nn::dbg::detail::Logger::LEVEL_FATAL レベルでログ出力を行います。
155 */
156 #ifdef NN_LOG_FATAL_ENABLE
157 #define NN_LOG_FATAL(...)  NN_LOG_BASE(FATAL, __VA_ARGS__)
158 #else
159 #define NN_LOG_FATAL(...) ((void)0)
160 #endif
161 
162 /*
163     @def NN_LOG_FATAL
164 
165     @brief nn::dbg::detail::Logger::LEVEL_FORCE レベルでログ出力を行います。
166 */
167 #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT
168 #define NN_LOG_FORCE(...)   NN_LOG_BASE(FORCE, __VA_ARGS__)
169 #else
170 #define NN_LOG_FORCE(...) ((void)0)
171 #endif
172 
173 namespace nn { namespace dbg { namespace detail {
174 
175 class Logger
176 {
177 private:
178     static u32 s_UpperLevel;                 //!< 表示するログレベルの上限
179     static u32 s_LowerLevel;                 //!< 表示するログレベルの下限
180     static u8 s_ShowFlag;                    //!< 表示オプション
181     static bool s_Initialized;               //!< ログレベルの下限が初期化済みかどうか
182     static const u8 ENABLE_NAMESPACE = 1;    //!< namespace を表示するかを決定するフラグ
183     static const u8 ENABLE_SIGNATURE = 2;    //!< 関数の引数部分を表示するかを決定するフラグ
184     static const u8 ENABLE_LONGPATH  = 4;    //!< ファイル名をフルパスで表示するかどうかを決定するフラグ
185 #ifdef NN_SYSTEM_KERNEL
186     static const u32 BUF_SIZE = NN_DBG_TPRINTF_BUFFER_LENGTH;
187 #else
188     static const u32 BUF_SIZE = NN_DBG_PRINTF_BUFFER_LENGTH;
189 #endif
190 
191 public:
192     static const u32 LEVEL_DEBUG = NN_LOG_LEVEL_DEBUG;     //!< デバッグ出力
193     static const u32 LEVEL_INFO  = NN_LOG_LEVEL_INFO;      //!< 情報
194     static const u32 LEVEL_WARN  = NN_LOG_LEVEL_WARN;      //!< 警告
195     static const u32 LEVEL_ERROR = NN_LOG_LEVEL_ERROR;     //!< エラー
196     static const u32 LEVEL_FATAL = NN_LOG_LEVEL_FATAL;     //!< 深刻なエラー
197     static const u32 LEVEL_FORCE = NN_LOG_LEVEL_FORCE;     //!< 強制的に表示
198 
199     /*
200         @brief ログ出力を行います。
201 
202         @param[in] level ログレベル
203         @param[in] funcName 関数名
204         @param[in] fileName ファイル名
205         @param[in] line 行番号
206         @param[in] fmt 表示するメッセージのフォーマット文字列
207     */
208     static void PrintLog(const u32 level, const char8* funcName, const char8* fileName,
209                             const int line, const char8* fmt, ...);
210 
211     /*
212         @brief 表示オプションに従って関数名を変換します。
213 
214         @param[in] src 元となる関数名
215         @param[out] dst 変換後の文字列を書き込むバッファ
216         @param[in] length 変換後の文字列バッファのサイズ
217 
218         @return 変換後の文字列の長さを返します。
219 
220         CHECK: private に移動することを推奨します。
221     */
222     static size_t MakeFuncName(const char8* src, char8* dest, size_t length);
223 
224     /*
225         @brief ログ出力を行うレベルの上限を設定します。
226 
227         @param[in] level ログ出力を行うレベルの上限
228     */
SetUpperLevel(u32 level)229     static void SetUpperLevel(u32 level) { s_UpperLevel = level; s_Initialized = true; }
230 
231     /*
232         @brief ログ出力を行うレベルの下限を設定します。
233 
234         @param[in] level ログ出力を行うレベルの下限
235     */
SetLowerLevel(u32 level)236     static void SetLowerLevel(u32 level) { s_LowerLevel = level; s_Initialized = true; }
237 
238     /*
239         @brief ログ出力を行うレベルの下限を設定します。
240 
241         @param[in] level ログ出力を行うレベルの下限
242     */
SetLevel(u32 level)243     static void SetLevel(u32 level) { SetLowerLevel(level); }
244 
245     /*
246         @brief ログ出力時の表示オプションを設定します。
247 
248         @param[in] type 表示するオプション
249 
250                         nn::dbg::detail::ENABLE_NAMESPACE や nn::dbg::detail::ENABLE_SIGNATURE などのビットマスクを指定します。
251 
252         @param[in] value オプションを有効にするならば true、そうでなければ false
253     */
SetFlag(u8 type,bool value)254     static void SetFlag(u8 type, bool value)
255     {
256         if(value)
257         {
258             s_ShowFlag |= type;
259         }
260         else
261         {
262             s_ShowFlag &= (0xff ^ type);
263         }
264     }
265 
266     /*
267         @brief ログ出力時に namespace を表示するかどうかを設定します。
268 
269         @param[in] f namespace を表示するならば true、そうでなければ false
270     */
SetNameSpace(bool f)271     static void SetNameSpace(bool f) { SetFlag(ENABLE_NAMESPACE, f); }
272 
273     /*
274         @brief ログ出力時に関数の引数を表示するかどうかを設定します。
275 
276         @param[in] f 関数の引数を表示するならば true、そうでなければ false
277     */
SetSignature(bool f)278     static void SetSignature(bool f) { SetFlag(ENABLE_SIGNATURE, f); }
279 
280     /*
281         @brief ログ出力時にファイル名のフルパスを表示するかどうかを設定します。
282 
283         @param[in] f ファイル名のフルパスを表示するならば true、そうでなければ false
284     */
SetLongpath(bool f)285     static void  SetLongpath(bool f) { SetFlag(ENABLE_LONGPATH , f); }
286 
287 
288     static char8* s_LevelStrings[];    //!< ログレベルを文字列化したテーブル
289 };
290 
291 }}}
292 
293 
294 #endif // __cplusplus
295 
296 #endif
297