15 #ifndef INCG_IRIS_IUTEST_CONSOLE_HPP_DCAC5025_B7BB_424E_A849_9E6FE0A3B460_
16 #define INCG_IRIS_IUTEST_CONSOLE_HPP_DCAC5025_B7BB_424E_A849_9E6FE0A3B460_
29 #ifndef IUTEST_VPRINTF
30 # define IUTEST_VPRINTF(f, a) vprintf(f, a)
33 #ifndef IUTEST_HAS_COLORCONSOLE
34 # if defined(IUTEST_OS_WINDOWS_MOBILE) || defined(IUTEST_OS_NACL)
35 # define IUTEST_HAS_COLORCONSOLE 0
37 # define IUTEST_HAS_COLORCONSOLE 1
41 #ifndef IUTEST_FORCE_COLORCONSOLE
42 # define IUTEST_FORCE_COLORCONSOLE 0
55 virtual void output(
const char* fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 3)
62 virtual void voutput(
const char* fmt, va_list va) = 0;
88 static inline void output(
const char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
93 static inline
void voutput(const
char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);
99 static inline
void color_output(Color color, const
char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 3);
106 static inline
void nl_output(const
char *fmt, ...) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 2);
112 static inline
void nl_voutput(const
char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(1, 0);
116 static iuLogger* SetLogger(iuLogger* logger)
118 iuLogger* pre = GetLoggerInstanceVariable().pInstance;
119 GetLoggerInstanceVariable().pInstance = logger;
128 static bool IsColorModeOff()
130 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
140 static bool IsColorModeOn()
142 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
152 static bool IsColorModeAnsi()
154 #if defined(INCG_IRIS_IUTEST_HPP_) && !defined(IUTEST_USE_GTEST)
162 static inline void color_output_impl(Color color,
const char* fmt, va_list va) IUTEST_ATTRIBUTE_FORMAT_PRINTF(2, 0);
163 static inline bool IsShouldUseColor(
bool use_color);
164 static inline bool HasColorConsole();
165 #if IUTEST_HAS_COLORCONSOLE && !IUTEST_FORCE_COLORCONSOLE
166 static inline bool IsStringEqual(
const char* str1,
const char* str2) {
return strcmp(str1, str2) == 0; }
170 struct LoggerInstanceVariable
175 static LoggerInstanceVariable& GetLoggerInstanceVariable() {
static LoggerInstanceVariable sLogger;
return sLogger; }
176 static iuLogger* GetLogger() {
return GetLoggerInstanceVariable().pInstance; }
179 inline void iuConsole::output(
const char *fmt, ...)
186 inline void iuConsole::voutput(
const char* fmt, va_list va)
188 iuLogger* pLogger = GetLogger();
191 pLogger->voutput(fmt, va);
198 inline void iuConsole::color_output(Color color,
const char *fmt, ...)
203 if( IsShouldUseColor(
true) )
205 color_output_impl(color, fmt, va);
214 inline void iuConsole::nl_output(
const char *fmt, ...)
221 inline void iuConsole::nl_voutput(
const char* fmt, va_list va)
226 inline void iuConsole::color_output_impl(Color color,
const char* fmt, va_list va)
230 #if defined(IUTEST_OS_WINDOWS) && !defined(IUTEST_OS_WINDOWS_MOBILE) \
231 && !defined(IUTEST_OS_WINDOWS_PHONE) && !defined(IUTEST_OS_WINDOWS_RT)
232 if( !IsColorModeAnsi() )
234 const WORD attr[] = {
238 FOREGROUND_GREEN | FOREGROUND_RED,
240 FOREGROUND_RED | FOREGROUND_BLUE,
241 FOREGROUND_GREEN | FOREGROUND_BLUE,
242 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
244 const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
245 if( stdout_handle != INVALID_HANDLE_VALUE )
247 CONSOLE_SCREEN_BUFFER_INFO csbi;
248 if( ::GetConsoleScreenBufferInfo(stdout_handle, &csbi) )
250 const WORD wAttributes = csbi.wAttributes;
253 ::SetConsoleTextAttribute(stdout_handle, attr[color] | FOREGROUND_INTENSITY);
258 ::SetConsoleTextAttribute(stdout_handle, wAttributes);
265 output(
"\033[1;3%cm",
'0' + color);
271 inline bool iuConsole::IsShouldUseColor(
bool use_color)
273 if( IsColorModeOn() )
277 else if( IsColorModeOff() )
281 static bool has_color = HasColorConsole();
282 return use_color && has_color;
285 inline bool iuConsole::HasColorConsole()
287 #if !IUTEST_HAS_COLORCONSOLE
289 #elif IUTEST_FORCE_COLORCONSOLE
292 #if defined(IUTEST_OS_WINDOWS)
294 CONSOLE_SCREEN_BUFFER_INFO csbi;
295 if( ::GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) )
301 const char* env = internal::posix::GetEnv(
"TERM");
302 const bool term_conf = (env != NULL) && (
303 IsStringEqual(env,
"xterm")
304 || IsStringEqual(env,
"xterm-color")
305 || IsStringEqual(env,
"xterm-256color")
306 || IsStringEqual(env,
"screen")
307 || IsStringEqual(env,
"screen-256color")
308 || IsStringEqual(env,
"tmux")
309 || IsStringEqual(env,
"tmux-256color")
310 || IsStringEqual(env,
"rxvt-unicode")
311 || IsStringEqual(env,
"rxvt-unicode-256color")
312 || IsStringEqual(env,
"linux")
313 || IsStringEqual(env,
"cygwin")
320 if( internal::posix::GetEnv(
"GITHUB_ACTIONS") != NULL )
@ CONSOLE_COLOR_ANSI
エスケープシーケンスで出力
Definition: iutest_env.hpp:155
@ CONSOLE_COLOR_OFF
色つき出力OFF
Definition: iutest_env.hpp:154
@ CONSOLE_COLOR_ON
色つき出力ON
Definition: iutest_env.hpp:153
static bool IsEnableFlag(int flag)
フラグが立っているかどうか
Definition: iutest_env.hpp:210
#define IUTEST_FLAG(name)
フラグセット
Definition: iutest_env.hpp:57
#define IUTEST_CXX_DEFAULT_FUNCTION
default function
Definition: iutest_compiler.hpp:494
#define IUTEST_VPRINTF(f, a)
vprintf 呼び出しマクロ
Definition: iutest_console.hpp:31
iutest root namespace
Definition: iutest_charcode.hpp:33