Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F376142
terminal_colors.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Size
2 KB
Referenced Files
None
Subscribers
None
terminal_colors.cpp
View Options
//===-- support/terminal_colors.cpp -----------------------------*- C++ -*-===//
//
// The RoSA Framework
//
// Distributed under the terms and conditions of the Boost Software License 1.0.
// See accompanying file LICENSE.
//
// If you did not receive a copy of the license file, see
// http://www.boost.org/LICENSE_1_0.txt.
//
//===----------------------------------------------------------------------===//
///
/// \file support/terminal_colors.cpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Implementation for rosa/support/terminal_colors.h.
///
//===----------------------------------------------------------------------===//
#include
"rosa/support/terminal_colors.h"
#include
"rosa/config/config.h"
#include
"rosa/support/debug.hpp"
#include
<array>
#ifdef ROSA_POSIX
#include
<unistd.h>
#endif
// defined(ROSA_POSIX)
namespace
rosa
{
namespace
terminal
{
/// ANSI color codes for POSIX terminals.
///
/// \note Use \c std::array for runtime efficiency, though static casting is
/// necessary for indexing.
///
/// \note Do not index with \c rosa::Color::NumColors!
constexpr
std
::
array
<
const
char
*
,
static_cast
<
size_t
>
(
Color
::
NumColors
)
>
ANSIColorCodes
{{
"0"
,
///< Default - Attribute reset
"30"
,
///< Black
"31"
,
///< Red
"32"
,
///< Green
"33"
,
///< Yelow
"34"
,
///< Blue
"35"
,
///< Magenta
"36"
,
///< Cyan
"37"
,
///< Lightgrey
"90"
,
///< Darkgrey
"91"
,
///< Lightred
"92"
,
///< Lightgreen
"93"
,
///< Lightyellow
"94"
,
///< Lightblue
"95"
,
///< Lightmagenta
"96"
,
///< Lightcyan
"97"
///< White
}};
std
::
ostream
&
operator
<<
(
std
::
ostream
&
os
,
const
Color
color
)
{
ASSERT
(
color
!=
Color
::
NumColors
);
// Handle color only when printing to terminal and it supports colors.
#ifdef ROSA_POSIX
// Identify terminal by checking if the stream is buffered as one of the
// standard outputs, and the corresponding C standard output stream is
// pointing to a terminal.
//
// \note This implementation may be tricked so that it does not print color
// to terminal, but should never print color codes to a non-terminal output.
if
((
os
.
rdbuf
()
==
std
::
cout
.
rdbuf
()
&&
isatty
(
fileno
(
stdin
)))
||
((
os
.
rdbuf
()
==
std
::
cerr
.
rdbuf
()
||
os
.
rdbuf
()
==
std
::
clog
.
rdbuf
())
&&
isatty
(
fileno
(
stderr
))))
{
os
<<
"
\033
["
<<
ANSIColorCodes
[
static_cast
<
size_t
>
(
color
)]
<<
"m"
;
}
#elif defined(ROSA_WINDOWS)
// \todo Windows terminals support ANSI color codes from Windows 10
// Threshold 2, custom stuff is required for earlier versions.
(
void
)
ANSIColorCodes
;
// To shut up compiler warning.
#endif
// defined(ROSA_POSIX) || defined(ROSA_WINDOWS)
return
os
;
}
}
// End namespace terminal
}
// End namespace rosa
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sun, Jun 8, 7:37 PM (22 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
150511
Default Alt Text
terminal_colors.cpp (2 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment