2018-06-10 19:22:49 +00:00
|
|
|
#include <Formats/verbosePrintString.h>
|
2023-03-06 14:53:58 +00:00
|
|
|
#include <base/hex.h>
|
2017-04-01 09:19:00 +00:00
|
|
|
#include <IO/Operators.h>
|
2016-06-23 19:39:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2017-06-01 13:41:58 +00:00
|
|
|
void verbosePrintString(const char * begin, const char * end, WriteBuffer & out)
|
2016-06-23 19:39:20 +00:00
|
|
|
{
|
|
|
|
if (end == begin)
|
|
|
|
{
|
|
|
|
out << "<EMPTY>";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
out << "\"";
|
|
|
|
|
2020-04-22 06:34:20 +00:00
|
|
|
for (const char * pos = begin; pos < end; ++pos)
|
2016-06-23 19:39:20 +00:00
|
|
|
{
|
|
|
|
switch (*pos)
|
|
|
|
{
|
|
|
|
case '\0':
|
|
|
|
out << "<ASCII NUL>";
|
|
|
|
break;
|
|
|
|
case '\b':
|
|
|
|
out << "<BACKSPACE>";
|
|
|
|
break;
|
|
|
|
case '\f':
|
|
|
|
out << "<FORM FEED>";
|
|
|
|
break;
|
|
|
|
case '\n':
|
|
|
|
out << "<LINE FEED>";
|
|
|
|
break;
|
|
|
|
case '\r':
|
|
|
|
out << "<CARRIAGE RETURN>";
|
|
|
|
break;
|
|
|
|
case '\t':
|
|
|
|
out << "<TAB>";
|
|
|
|
break;
|
|
|
|
case '\\':
|
|
|
|
out << "<BACKSLASH>";
|
|
|
|
break;
|
|
|
|
case '"':
|
|
|
|
out << "<DOUBLE QUOTE>";
|
|
|
|
break;
|
|
|
|
case '\'':
|
|
|
|
out << "<SINGLE QUOTE>";
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
{
|
2017-12-28 16:51:53 +00:00
|
|
|
if (static_cast<unsigned char>(*pos) < 32) /// ASCII control characters
|
2017-07-23 06:53:28 +00:00
|
|
|
out << "<0x" << hexDigitUppercase(*pos / 16) << hexDigitUppercase(*pos % 16) << ">";
|
2016-06-23 19:39:20 +00:00
|
|
|
else
|
|
|
|
out << *pos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
out << "\"";
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|