mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-03 15:10:48 +00:00
101 lines
2.2 KiB
C++
101 lines
2.2 KiB
C++
|
#include <DB/IO/ReadHelpers.h>
|
||
|
|
||
|
namespace DB
|
||
|
{
|
||
|
|
||
|
void assertString(const char * s, ReadBuffer & buf)
|
||
|
{
|
||
|
for (; *s; ++s)
|
||
|
{
|
||
|
if (buf.eof() || *buf.position() != *s)
|
||
|
throw Exception(String("Cannot parse input: expected ") + s, ErrorCodes::CANNOT_PARSE_INPUT_ASSERTION_FAILED);
|
||
|
++buf.position();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void readString(String & s, ReadBuffer & buf)
|
||
|
{
|
||
|
s = "";
|
||
|
while (!buf.eof())
|
||
|
{
|
||
|
size_t bytes = 0;
|
||
|
for (; buf.position() + bytes != buf.buffer().end(); ++bytes)
|
||
|
if (buf.position()[bytes] == '\t' || buf.position()[bytes] == '\n')
|
||
|
break;
|
||
|
|
||
|
s.append(buf.position(), bytes);
|
||
|
buf.position() += bytes;
|
||
|
|
||
|
if (buf.position() != buf.buffer().end())
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void readEscapedString(String & s, ReadBuffer & buf)
|
||
|
{
|
||
|
s = "";
|
||
|
while (!buf.eof())
|
||
|
{
|
||
|
size_t bytes = 0;
|
||
|
for (; buf.position() + bytes != buf.buffer().end(); ++bytes)
|
||
|
if (buf.position()[bytes] == '\\' || buf.position()[bytes] == '\t' || buf.position()[bytes] == '\n')
|
||
|
break;
|
||
|
|
||
|
s.append(buf.position(), bytes);
|
||
|
buf.position() += bytes;
|
||
|
|
||
|
if (*buf.position() == '\t' || *buf.position() == '\n')
|
||
|
return;
|
||
|
|
||
|
if (*buf.position() == '\\')
|
||
|
{
|
||
|
++buf.position();
|
||
|
if (buf.eof())
|
||
|
throw Exception("Cannot parse escape sequence", ErrorCodes::CANNOT_PARSE_ESCAPE_SEQUENCE);
|
||
|
s += parseEscapeSequence(*buf.position());
|
||
|
++buf.position();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void readQuotedString(String & s, ReadBuffer & buf)
|
||
|
{
|
||
|
s = "";
|
||
|
|
||
|
if (buf.eof() || *buf.position() != '\'')
|
||
|
throw Exception("Cannot parse quoted string: expected opening single quote",
|
||
|
ErrorCodes::CANNOT_PARSE_QUOTED_STRING);
|
||
|
++buf.position();
|
||
|
|
||
|
while (!buf.eof())
|
||
|
{
|
||
|
size_t bytes = 0;
|
||
|
for (; buf.position() + bytes != buf.buffer().end(); ++bytes)
|
||
|
if (buf.position()[bytes] == '\\' || buf.position()[bytes] == '\'')
|
||
|
break;
|
||
|
|
||
|
s.append(buf.position(), bytes);
|
||
|
buf.position() += bytes;
|
||
|
|
||
|
if (*buf.position() == '\'')
|
||
|
{
|
||
|
++buf.position();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (*buf.position() == '\\')
|
||
|
{
|
||
|
++buf.position();
|
||
|
if (buf.eof())
|
||
|
throw Exception("Cannot parse escape sequence", ErrorCodes::CANNOT_PARSE_ESCAPE_SEQUENCE);
|
||
|
s += parseEscapeSequence(*buf.position());
|
||
|
++buf.position();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
throw Exception("Cannot parse quoted string: expected closing single quote",
|
||
|
ErrorCodes::CANNOT_PARSE_QUOTED_STRING);
|
||
|
}
|
||
|
|
||
|
}
|