/*---------------------------------------------------------------------------* Project: Horizon File: dbg_Logger.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 18508 $ *---------------------------------------------------------------------------*/ /*! @file :include nn/dbg.h */ #ifndef NN_DBG_DBG_LOGGER_H_ #define NN_DBG_DBG_LOGGER_H_ #ifdef __cplusplus #include #include #include #define NN_LOG_LEVEL_DEBUG 0 #define NN_LOG_LEVEL_INFO 1 #define NN_LOG_LEVEL_WARN 2 #define NN_LOG_LEVEL_ERROR 3 #define NN_LOG_LEVEL_FATAL 4 #define NN_LOG_LEVEL_FORCE 5 #define NN_LOG_LEVEL_DISABLE 6 #define NN_LOG_LEVEL_DEFAULT NN_LOG_LEVEL_WARN #ifndef NN_LOG_LEVEL #define NN_LOG_LEVEL NN_LOG_LEVEL_DEFAULT #endif #ifdef NN_SWITCH_DISABLE_DEBUG_PRINT #undef NN_LOG_LEVEL #define NN_LOG_LEVEL NN_LOG_LEVEL_DISABLE #endif #if NN_LOG_LEVEL <= NN_LOG_LEVEL_DEBUG #define NN_LOG_DEBUG_ENABLE #endif #if NN_LOG_LEVEL <= NN_LOG_LEVEL_INFO #define NN_LOG_INFO_ENABLE #endif #if NN_LOG_LEVEL <= NN_LOG_LEVEL_WARN #define NN_LOG_WARN_ENABLE #endif #if NN_LOG_LEVEL <= NN_LOG_LEVEL_ERROR #define NN_LOG_ERROR_ENABLE #endif #if NN_LOG_LEVEL <= NN_LOG_LEVEL_FATAL #define NN_LOG_FATAL_ENABLE #endif #ifndef NN_LOG_BASE #define NN_LOG_BASE(level, ...) \ ::nn::dbg::detail::Logger::PrintLog(::nn::dbg::detail::Logger::LEVEL_ ## level, \ NN_FUNCTION, NN_FILE_NAME, __LINE__, __VA_ARGS__) #endif /* @def NN_LOG_NAMESPACE @brief ログ出力時に namespace を表示するかどうかを設定します。 @param[in] x namespace を表示するならば true、そうでなければ false */ #define NN_LOG_NAMESPACE(x) ::nn::dbg::detail::Logger::SetNameSpace(x) /* @def NN_LOG_SIGNATURE @brief ログ出力時に関数の引数を表示するかどうかを設定します。 @param[in] x 関数の引数を表示するならば true、そうでなければ false */ #define NN_LOG_SIGNATURE(x) ::nn::dbg::detail::Logger::SetSignature(x) /* @def NN_LOG_LONGPATH @brief ログ出力時にファイル名のフルパスを表示するかどうかを設定します。 @param[in] x ファイル名のフルパスを表示するならば true、そうでなければ false */ #define NN_LOG_LONGPATH(x) ::nn::dbg::detail::Logger::SetLongpath(x) #define NN_LOG_SET_UPPER_LOG_LEVEL(x) ::nn::dbg::detail::Logger::SetUpperLevel(x) #define NN_LOG_SET_LOWER_LOG_LEVEL(x) ::nn::dbg::detail::Logger::SetLowerLevel(x) #define NN_LOG_SET_LOG_LEVEL(x) NN_LOG_SET_LOWER_LOG_LEVEL(x) /* @def NN_LOG_DEBUG @brief nn::dbg::detail::Logger::LEVEL_DEBUG レベルでログ出力を行います。 */ #ifdef NN_LOG_DEBUG_ENABLE #define NN_LOG_DEBUG(...) NN_LOG_BASE(DEBUG, __VA_ARGS__) #else #define NN_LOG_DEBUG(...) ((void)0) #endif /* @def NN_LOG_INFO @brief nn::dbg::detail::Logger::LEVEL_INFO レベルでログ出力を行います。 */ #ifdef NN_LOG_INFO_ENABLE #define NN_LOG_INFO(...) NN_LOG_BASE(INFO, __VA_ARGS__) #else #define NN_LOG_INFO(...) ((void)0) #endif /* @def NN_LOG_WARN @brief nn::dbg::detail::Logger::LEVEL_WARN レベルでログ出力を行います。 */ #ifdef NN_LOG_WARN_ENABLE #define NN_LOG_WARN(...) NN_LOG_BASE(WARN, __VA_ARGS__) #else #define NN_LOG_WARN(...) ((void)0) #endif /* @def NN_LOG_ERROR @brief nn::dbg::detail::Logger::LEVEL_ERROR レベルでログ出力を行います。 */ #ifdef NN_LOG_ERROR_ENABLE #define NN_LOG_ERROR(...) NN_LOG_BASE(ERROR, __VA_ARGS__) #else #define NN_LOG_ERROR(...) ((void)0) #endif /* @def NN_LOG_FATAL @brief nn::dbg::detail::Logger::LEVEL_FATAL レベルでログ出力を行います。 */ #ifdef NN_LOG_FATAL_ENABLE #define NN_LOG_FATAL(...) NN_LOG_BASE(FATAL, __VA_ARGS__) #else #define NN_LOG_FATAL(...) ((void)0) #endif /* @def NN_LOG_FATAL @brief nn::dbg::detail::Logger::LEVEL_FORCE レベルでログ出力を行います。 */ #ifndef NN_SWITCH_DISABLE_DEBUG_PRINT #define NN_LOG_FORCE(...) NN_LOG_BASE(FORCE, __VA_ARGS__) #else #define NN_LOG_FORCE(...) ((void)0) #endif namespace nn { namespace dbg { namespace detail { class Logger { private: static u32 s_UpperLevel; //!< 表示するログレベルの上限 static u32 s_LowerLevel; //!< 表示するログレベルの下限 static u8 s_ShowFlag; //!< 表示オプション static bool s_Initialized; //!< ログレベルの下限が初期化済みかどうか static const u8 ENABLE_NAMESPACE = 1; //!< namespace を表示するかを決定するフラグ static const u8 ENABLE_SIGNATURE = 2; //!< 関数の引数部分を表示するかを決定するフラグ static const u8 ENABLE_LONGPATH = 4; //!< ファイル名をフルパスで表示するかどうかを決定するフラグ #ifdef NN_SYSTEM_KERNEL static const u32 BUF_SIZE = NN_DBG_TPRINTF_BUFFER_LENGTH; #else static const u32 BUF_SIZE = NN_DBG_PRINTF_BUFFER_LENGTH; #endif public: static const u32 LEVEL_DEBUG = NN_LOG_LEVEL_DEBUG; //!< デバッグ出力 static const u32 LEVEL_INFO = NN_LOG_LEVEL_INFO; //!< 情報 static const u32 LEVEL_WARN = NN_LOG_LEVEL_WARN; //!< 警告 static const u32 LEVEL_ERROR = NN_LOG_LEVEL_ERROR; //!< エラー static const u32 LEVEL_FATAL = NN_LOG_LEVEL_FATAL; //!< 深刻なエラー static const u32 LEVEL_FORCE = NN_LOG_LEVEL_FORCE; //!< 強制的に表示 /* @brief ログ出力を行います。 @param[in] level ログレベル @param[in] funcName 関数名 @param[in] fileName ファイル名 @param[in] line 行番号 @param[in] fmt 表示するメッセージのフォーマット文字列 */ static void PrintLog(const u32 level, const char8* funcName, const char8* fileName, const int line, const char8* fmt, ...); /* @brief 表示オプションに従って関数名を変換します。 @param[in] src 元となる関数名 @param[out] dst 変換後の文字列を書き込むバッファ @param[in] length 変換後の文字列バッファのサイズ @return 変換後の文字列の長さを返します。 CHECK: private に移動することを推奨します。 */ static size_t MakeFuncName(const char8* src, char8* dest, size_t length); /* @brief ログ出力を行うレベルの上限を設定します。 @param[in] level ログ出力を行うレベルの上限 */ static void SetUpperLevel(u32 level) { s_UpperLevel = level; s_Initialized = true; } /* @brief ログ出力を行うレベルの下限を設定します。 @param[in] level ログ出力を行うレベルの下限 */ static void SetLowerLevel(u32 level) { s_LowerLevel = level; s_Initialized = true; } /* @brief ログ出力を行うレベルの下限を設定します。 @param[in] level ログ出力を行うレベルの下限 */ static void SetLevel(u32 level) { SetLowerLevel(level); } /* @brief ログ出力時の表示オプションを設定します。 @param[in] type 表示するオプション nn::dbg::detail::ENABLE_NAMESPACE や nn::dbg::detail::ENABLE_SIGNATURE などのビットマスクを指定します。 @param[in] value オプションを有効にするならば true、そうでなければ false */ static void SetFlag(u8 type, bool value) { if(value) { s_ShowFlag |= type; } else { s_ShowFlag &= (0xff ^ type); } } /* @brief ログ出力時に namespace を表示するかどうかを設定します。 @param[in] f namespace を表示するならば true、そうでなければ false */ static void SetNameSpace(bool f) { SetFlag(ENABLE_NAMESPACE, f); } /* @brief ログ出力時に関数の引数を表示するかどうかを設定します。 @param[in] f 関数の引数を表示するならば true、そうでなければ false */ static void SetSignature(bool f) { SetFlag(ENABLE_SIGNATURE, f); } /* @brief ログ出力時にファイル名のフルパスを表示するかどうかを設定します。 @param[in] f ファイル名のフルパスを表示するならば true、そうでなければ false */ static void SetLongpath(bool f) { SetFlag(ENABLE_LONGPATH , f); } static char8* s_LevelStrings[]; //!< ログレベルを文字列化したテーブル }; }}} #endif // __cplusplus #endif