16#include "../string_func.h"
18#if defined(STRGEN) || defined(SETTINGSGEN)
19#include "../error_func.h"
24#include "../safeguards.h"
29 void StringConsumer::LogError(std::string &&msg)
31#if defined(STRGEN) || defined(SETTINGSGEN)
41 return static_cast<uint8_t
>(this->src[this->position]);
47 return static_cast<uint8_t
>(this->src[this->position]) |
48 static_cast<uint8_t
>(this->src[this->position + 1]) << 8;
54 return static_cast<uint8_t
>(this->src[this->position]) |
55 static_cast<uint8_t
>(this->src[this->position + 1]) << 8 |
56 static_cast<uint8_t
>(this->src[this->position + 2]) << 16 |
57 static_cast<uint8_t
>(this->src[this->position + 3]) << 24;
63 return static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position])) |
64 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 1])) << 8 |
65 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 2])) << 16 |
66 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 3])) << 24 |
67 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 4])) << 32 |
68 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 5])) << 40 |
69 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 6])) << 48 |
70 static_cast<uint64_t
>(
static_cast<uint8_t
>(this->src[this->position + 7])) << 56;
76 if (!result.has_value())
return {};
77 return static_cast<char>(*result);
82 auto buf = this->src.substr(this->position);
88 auto buf = this->src.substr(this->position);
89 if (len == std::string_view::npos) {
91 }
else if (len > buf.size()) {
94 return buf.substr(0, len);
99 if (len == std::string_view::npos) {
100 this->position = this->src.size();
101 }
else if (size_type max_len =
GetBytesLeft(); len > max_len) {
102 LogError(fmt::format(
"Source buffer too short: {} > {}", len, max_len));
103 this->position = this->src.size();
105 this->position += len;
111 assert(!str.empty());
112 auto buf = this->src.substr(this->position);
113 return buf.find(str);
119 return this->
Find({data, len});
124 assert(!chars.empty());
125 auto buf = this->src.substr(this->position);
126 return buf.find_first_of(chars);
131 assert(!chars.empty());
132 auto buf = this->src.substr(this->position);
133 return buf.find_first_not_of(chars);
138 assert(!str.empty());
139 auto buf = this->src.substr(this->position);
140 auto len = buf.find(str);
141 if (len != std::string_view::npos) {
144 if (buf.compare(len, str.size(), str) == 0) len += str.size();
147 while (buf.compare(len, str.size(), str) == 0) len += str.size();
153 return buf.substr(0, len);
std::string_view Peek(size_type len) const
Peek the next 'len' bytes.
SeparatorUsage
Treatment of separator characters.
@ READ_ALL_SEPARATORS
Read all consecutive separators, and include them all in the result.
@ READ_ONE_SEPARATOR
Read one separator, and include it in the result.
std::optional< uint32_t > PeekUint32LE() const
Peek binary uint32 using little endian.
size_type GetBytesLeft() const noexcept
Get number of bytes left to read.
std::string_view PeekUntil(std::string_view str, SeparatorUsage sep) const
Peek data until the first occurrence of 'str'.
static const std::string_view WHITESPACE_OR_NEWLINE
ASCII whitespace characters, including new-line.
std::string_view ReadUntil(std::string_view str, SeparatorUsage sep)
Read data until the first occurrence of 'str', and advance reader.
void SkipUntil(std::string_view str, SeparatorUsage sep)
Skip data until the first occurrence of 'str'.
static const std::string_view WHITESPACE_NO_NEWLINE
ASCII whitespace characters, excluding new-line.
std::optional< char > PeekChar() const
Peek 8-bit character.
bool ReadIf(std::string_view str)
Check whether the next data matches 'str', and skip it.
std::string_view PeekUntilUtf8(char32_t c, SeparatorUsage sep) const
Peek data until the first occurrence of UTF-8 char 'c'.
std::optional< uint64_t > PeekUint64LE() const
Peek binary uint64 using little endian.
void SkipUntilCharNotIn(std::string_view chars)
Skip 8-bit chars, while they are in 'chars', until they are not.
size_type FindCharNotIn(std::string_view chars) const
Find first occurrence of any 8-bit char not in 'chars'.
void SkipIf(std::string_view str)
If the next data matches 'str', then skip it.
std::optional< uint16_t > PeekUint16LE() const
Peek binary uint16 using little endian.
void SkipIntegerBase(int base)
Skip an integer in number 'base'.
void Skip(size_type len)
Discard some bytes.
size_type Find(std::string_view str) const
Find first occurrence of 'str'.
std::optional< uint8_t > PeekUint8() const
Peek binary uint8.
void SkipUntilUtf8(char32_t c, SeparatorUsage sep)
Skip data until the first occurrence of UTF-8 char 'c'.
std::string_view ReadUntilUtf8(char32_t c, SeparatorUsage sep)
Read data until the first occurrence of UTF-8 char 'c', and advance reader.
std::pair< size_type, char32_t > PeekUtf8() const
Peek UTF-8 character.
size_type FindCharIn(std::string_view chars) const
Find first occurrence of any 8-bit char in 'chars'.
size_type FindUtf8(char32_t c) const
Find first occurrence of UTF-8 char 'c'.
std::pair< size_t, char32_t > DecodeUtf8(std::string_view buf)
Decode a character from UTF-8.
std::pair< char[4], size_t > EncodeUtf8(char32_t c)
Encode a character to UTF-8.
void DebugPrint(std::string_view category, int level, std::string &&message)
Internal function for outputting the debug line.
void FatalErrorI(const std::string &str)
Error handling for fatal non-user errors.
Compose strings from textual and binary data.
Handling of UTF-8 encoded data.