43#include "gtest/gtest-printers.h"
54#include "gtest/internal/gtest-port.h"
64GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_
65GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
66GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
67GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
68void PrintByteSegmentInObjectTo(
const unsigned char* obj_bytes,
size_t start,
69 size_t count, ostream* os) {
71 for (
size_t i = 0; i != count; i++) {
72 const size_t j = start + i;
81 GTEST_SNPRINTF_(text,
sizeof(text),
"%02X", obj_bytes[j]);
87void PrintBytesInObjectToImpl(
const unsigned char* obj_bytes,
size_t count,
90 *os << count <<
"-byte object <";
92 const size_t kThreshold = 132;
93 const size_t kChunkSize = 64;
97 if (count < kThreshold) {
98 PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
100 PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
103 const size_t resume_pos = (count - kChunkSize + 1) / 2 * 2;
104 PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
113template <
typename CharType>
114char32_t ToChar32(CharType in) {
115 return static_cast<char32_t>(
116 static_cast<typename std::make_unsigned<CharType>::type
>(in));
130 PrintBytesInObjectToImpl(obj_bytes, count, os);
148template <
typename Char>
150 const char32_t u_c = ToChar32(c);
184 *os << static_cast<char>(c);
187 ostream::fmtflags flags = os->flags();
188 *os <<
"\\x" << std::hex << std::uppercase << static_cast<int>(u_c);
250template <
typename Char>
261 *os <<
" (" <<
static_cast<int>(c);
266 if (format ==
kHexEscape || (1 <= c && c <= 9)) {
269 *os <<
", 0x" << String::FormatHexInt(
static_cast<int>(c));
283 *os << std::hex <<
"U+" << std::uppercase << std::setfill(
'0') << std::setw(4)
284 <<
static_cast<uint32_t
>(c);
288#if defined(__SIZEOF_INT128__)
289void PrintTo(__uint128_t v, ::std::ostream* os) {
297 char* p = buf +
sizeof(buf);
302 uint64_t high =
static_cast<uint64_t
>(v >> 64);
303 uint64_t low =
static_cast<uint64_t
>(v);
306 while (high != 0 || low != 0) {
307 uint64_t high_mod = high % 10;
314 const uint64_t carry = 6 * high_mod + low % 10;
315 low = low / 10 + high_mod * 1844674407370955161 + carry / 10;
317 char digit =
static_cast<char>(carry % 10);
322void PrintTo(__int128_t v, ::std::ostream* os) {
323 __uint128_t uv =
static_cast<__uint128_t
>(v);
336template <
typename CharType>
337GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
338 GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
339 GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
static CharFormat
342 *os << quote_prefix <<
"\"";
343 bool is_previous_hex =
false;
345 for (
size_t index = 0; index < len; ++index) {
346 const CharType cur = begin[index];
347 if (is_previous_hex && IsXDigit(cur)) {
351 *os <<
"\" " << quote_prefix <<
"\"";
355 if (is_previous_hex) {
365template <
typename CharType>
366GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_
367 GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_
368 GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_
static void
378 if (len > 0 && begin[len - 1] ==
'\0') {
388 *os <<
" (no terminating NUL)";
425template <
typename Char>
426void PrintCStringTo(
const Char* s, ostream* os) {
430 *os << ImplicitCast_<const void*>(s) <<
" pointing to ";
437void PrintTo(
const char* s, ostream* os) { PrintCStringTo(s, os); }
440void PrintTo(
const char8_t* s, ostream* os) { PrintCStringTo(s, os); }
443void PrintTo(
const char16_t* s, ostream* os) { PrintCStringTo(s, os); }
445void PrintTo(
const char32_t* s, ostream* os) { PrintCStringTo(s, os); }
453#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
455void PrintTo(
const wchar_t* s, ostream* os) { PrintCStringTo(s, os); }
460bool ContainsUnprintableControlCodes(
const char* str,
size_t length) {
461 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(str);
463 for (
size_t i = 0; i < length; i++) {
464 unsigned char ch = *s++;
465 if (std::iscntrl(ch)) {
479bool IsUTF8TrailByte(
unsigned char t) {
return 0x80 <= t && t <= 0xbf; }
481bool IsValidUTF8(
const char* str,
size_t length) {
482 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(str);
484 for (
size_t i = 0; i < length;) {
485 unsigned char lead = s[i++];
492 }
else if (lead <= 0xdf && (i + 1) <= length && IsUTF8TrailByte(s[i])) {
494 }
else if (0xe0 <= lead && lead <= 0xef && (i + 2) <= length &&
495 IsUTF8TrailByte(s[i]) && IsUTF8TrailByte(s[i + 1]) &&
497 (lead != 0xe0 || s[i] >= 0xa0) &&
498 (lead != 0xed || s[i] < 0xa0)) {
500 }
else if (0xf0 <= lead && lead <= 0xf4 && (i + 3) <= length &&
501 IsUTF8TrailByte(s[i]) && IsUTF8TrailByte(s[i + 1]) &&
502 IsUTF8TrailByte(s[i + 2]) &&
504 (lead != 0xf0 || s[i] >= 0x90) &&
505 (lead != 0xf4 || s[i] < 0x90)) {
514void ConditionalPrintAsText(
const char* str,
size_t length, ostream* os) {
515 if (!ContainsUnprintableControlCodes(str, length) &&
516 IsValidUTF8(str, length)) {
517 *os <<
"\n As Text: \"" << str <<
"\"";
525 if (GTEST_FLAG_GET(print_utf8)) {
526 ConditionalPrintAsText(s.data(), s.size(), os);
532void PrintU8StringTo(const ::std::u8string& s, ostream* os) {
545#if GTEST_HAS_STD_WSTRING
546void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
bool IsPrintableAscii(char32_t c)
void UniversalPrintArray(const char *begin, size_t len, ostream *os)
void PrintU16StringTo(const ::std::u16string &s, ostream *os)
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ void UniversalPrintCharArray(const CharType *begin, size_t len, ostream *os)
static CharFormat PrintAsCharLiteralTo(Char c, ostream *os)
void PrintBytesInObjectTo(const unsigned char *obj_bytes, size_t count, ostream *os)
GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ static GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ CharFormat PrintCharsAsStringTo(const CharType *begin, size_t len, ostream *os)
void PrintTo(unsigned char c, ::std::ostream *os)
static CharFormat PrintAsStringLiteralTo(char32_t c, ostream *os)
static const char * GetCharWidthPrefix(char)
void PrintStringTo(const ::std::string &s, ostream *os)
void PrintCharAndCodeTo(Char c, ostream *os)
void PrintU32StringTo(const ::std::u32string &s, ostream *os)