SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
Text.h
Go to the documentation of this file.
1#pragma once
2
3#include <initializer_list>
4#include <string_view>
5#include <tuple>
6#include <unordered_map>
7
8#include <sourcepp/String.h>
9
10class BufferStream;
11
13
14constexpr std::string_view DEFAULT_SINGLE_LINE_COMMENT_START = "//";
15constexpr std::string_view DEFAULT_MULTI_LINE_COMMENT_START = "/*";
16constexpr std::string_view DEFAULT_MULTI_LINE_COMMENT_END = "*/";
17constexpr std::pair DEFAULT_QUOTES = {'\"', '\"'};
18
19using EscapeSequenceMap = std::unordered_map<char, char>;
20
21[[nodiscard]] const EscapeSequenceMap& getDefaultEscapeSequences();
22
23[[nodiscard]] const EscapeSequenceMap& getDefaultEscapeSequencesOrNone(bool useEscapes);
24
25class Tokenizer {
26public:
27 class Result {
28 friend Tokenizer;
29
30 public:
31 [[nodiscard]] const std::vector<std::string_view>& getTokens() const;
32
33 [[nodiscard]] uint64_t size() const;
34
35 [[nodiscard]] uint64_t tell() const;
36
37 void seek(uint64_t head_);
38
39 [[nodiscard]] std::string_view next();
40
41 template<typename T>
42 requires std::same_as<T, bool> || std::integral<T> || std::floating_point<T>
43 bool next(T& value) {
44 if constexpr (std::same_as<T, bool>) {
45 return string::toBool(this->next(), value);
46 } else if constexpr (std::integral<T>) {
47 return string::toInt(this->next(), value);
48 } else if constexpr (std::floating_point<T>) {
49 return string::toFloat(this->next(), value);
50 } else {
51 return false;
52 }
53 }
54
55 [[nodiscard]] std::string_view peek() const;
56
57 template<typename T>
58 requires std::same_as<T, bool> || std::integral<T> || std::floating_point<T>
59 bool peek(T& value) {
60 if constexpr (std::same_as<T, bool>) {
61 return string::toBool(this->peek(), value);
62 } else if constexpr (std::integral<T>) {
63 return string::toInt(this->peek(), value);
64 } else if constexpr (std::floating_point<T>) {
65 return string::toFloat(this->peek(), value);
66 } else {
67 return false;
68 }
69 }
70
71 void skip();
72
73 protected:
74 Result() = default;
75
76 std::vector<std::string_view> tokens;
77 uint64_t head = 0;
78 };
79
80 Tokenizer() = default;
81
82 Tokenizer& setSingleLineCommentStart(std::string_view singleLineCommentStart_);
83
84 Tokenizer& setMultiLineCommentStart(std::string_view multiLineCommentStart_);
85
86 Tokenizer& setMultiLineCommentEnd(std::string_view multiLineCommentEnd_);
87
88 //Tokenizer& setQuotes(std::initializer_list<std::pair<char, char>> quotes_);
89
90 Tokenizer& setEscapeSequences(const EscapeSequenceMap& escapeSequences_);
91
92 [[nodiscard]] Result parse(std::string_view text, std::string& backingString) const;
93
94protected:
98 // Disabled because MSVC is a garbage fire: "list initialization inside member initializer list or non-static data member initializer is not implemented"
99 //std::initializer_list<std::pair<char, char>> quotes{DEFAULT_QUOTES};
101};
102
109[[nodiscard]] std::string convertSpecialCharsToEscapes(std::string_view str, const EscapeSequenceMap& escapeSequences);
110
117[[nodiscard]] std::string convertEscapesToSpecialChars(std::string_view str, const EscapeSequenceMap& escapeSequences);
118
123void eatWhitespace(BufferStream& stream);
124
130void eatSingleLineComment(BufferStream& stream);
131
138void eatMultiLineComment(BufferStream& stream, std::string_view multiLineCommentEnd = DEFAULT_MULTI_LINE_COMMENT_END);
139
145void eatWhitespaceAndSingleLineComments(BufferStream& stream, std::string_view singleLineCommentStart = DEFAULT_SINGLE_LINE_COMMENT_START);
146
152void eatWhitespaceAndMultiLineComments(BufferStream& stream, std::string_view multiLineCommentStart = DEFAULT_MULTI_LINE_COMMENT_START);
153
160void eatWhitespaceAndComments(BufferStream& stream, std::string_view singleLineCommentStart = DEFAULT_SINGLE_LINE_COMMENT_START, std::string_view multiLineCommentStart = DEFAULT_MULTI_LINE_COMMENT_START);
161
168[[nodiscard]] bool tryToEatChar(BufferStream& stream, char c);
169
177[[nodiscard]] std::string readString(BufferStream& stream, std::initializer_list<std::pair<char, char>> quotes = {DEFAULT_QUOTES}, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
178
187std::string_view readStringToBuffer(BufferStream& stream, BufferStream& backing, std::initializer_list<std::pair<char, char>> quotes = {DEFAULT_QUOTES}, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
188
195[[nodiscard]] std::string readUnquotedString(BufferStream& stream, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
196
204std::string_view readUnquotedStringToBuffer(BufferStream& stream, BufferStream& backing, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
205
213[[nodiscard]] std::string readUnquotedString(BufferStream& stream, std::string_view end, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
214
223std::string_view readUnquotedStringToBuffer(BufferStream& stream, BufferStream& backing, std::string_view end, const EscapeSequenceMap& escapeSequences = getDefaultEscapeSequences());
224
225} // namespace sourcepp::parser::text
std::vector< std::string_view > tokens
Definition Text.h:76
const std::vector< std::string_view > & getTokens() const
Definition Text.cpp:31
std::string_view peek() const
Definition Text.cpp:54
Tokenizer & setEscapeSequences(const EscapeSequenceMap &escapeSequences_)
Definition Text.cpp:85
Tokenizer & setMultiLineCommentStart(std::string_view multiLineCommentStart_)
Definition Text.cpp:70
std::string_view singleLineCommentStart
Definition Text.h:95
Result parse(std::string_view text, std::string &backingString) const
Definition Text.cpp:90
EscapeSequenceMap escapeSequences
Definition Text.h:100
Tokenizer & setSingleLineCommentStart(std::string_view singleLineCommentStart_)
Definition Text.cpp:65
Tokenizer & setMultiLineCommentEnd(std::string_view multiLineCommentEnd_)
Definition Text.cpp:75
std::string_view multiLineCommentStart
Definition Text.h:96
std::string_view multiLineCommentEnd
Definition Text.h:97
std::string convertSpecialCharsToEscapes(std::string_view str, const EscapeSequenceMap &escapeSequences)
Convert special characters like \n to escaped special characters like \\n.
Definition Text.cpp:118
std::string convertEscapesToSpecialChars(std::string_view str, const EscapeSequenceMap &escapeSequences)
Convert escaped special characters like \\n to special characters like \n.
Definition Text.cpp:137
constexpr std::string_view DEFAULT_MULTI_LINE_COMMENT_END
Definition Text.h:16
void eatMultiLineComment(BufferStream &stream, std::string_view multiLineCommentEnd=DEFAULT_MULTI_LINE_COMMENT_END)
If a multi line comment is detected, eat its contents.
Definition Text.cpp:164
std::string readString(BufferStream &stream, std::initializer_list< std::pair< char, char > > quotes={DEFAULT_QUOTES}, const EscapeSequenceMap &escapeSequences=getDefaultEscapeSequences())
Read a string starting at the current stream position.
Definition Text.cpp:209
std::unordered_map< char, char > EscapeSequenceMap
Definition Text.h:19
void eatSingleLineComment(BufferStream &stream)
If a single line comment is detected, eat its contents.
Definition Text.cpp:160
void eatWhitespaceAndSingleLineComments(BufferStream &stream, std::string_view singleLineCommentStart=DEFAULT_SINGLE_LINE_COMMENT_START)
Eat all whitespace and single line comments after the current stream position.
Definition Text.cpp:170
void eatWhitespace(BufferStream &stream)
Eat all whitespace after the current stream position.
Definition Text.cpp:154
constexpr std::string_view DEFAULT_SINGLE_LINE_COMMENT_START
Definition Text.h:14
bool tryToEatChar(BufferStream &stream, char c)
If the given char exists at the current position, skip over it.
Definition Text.cpp:201
constexpr std::string_view DEFAULT_MULTI_LINE_COMMENT_START
Definition Text.h:15
constexpr std::pair DEFAULT_QUOTES
Definition Text.h:17
const EscapeSequenceMap & getDefaultEscapeSequencesOrNone(bool useEscapes)
Definition Text.cpp:26
std::string_view readUnquotedStringToBuffer(BufferStream &stream, BufferStream &backing, const EscapeSequenceMap &escapeSequences=getDefaultEscapeSequences())
Read a string starting at the current stream position.
Definition Text.cpp:292
std::string readUnquotedString(BufferStream &stream, const EscapeSequenceMap &escapeSequences=getDefaultEscapeSequences())
Read a string starting at the current stream position.
Definition Text.cpp:288
void eatWhitespaceAndComments(BufferStream &stream, std::string_view singleLineCommentStart=DEFAULT_SINGLE_LINE_COMMENT_START, std::string_view multiLineCommentStart=DEFAULT_MULTI_LINE_COMMENT_START)
Eat all whitespace and comments after the current stream position.
Definition Text.cpp:179
std::string_view readStringToBuffer(BufferStream &stream, BufferStream &backing, std::initializer_list< std::pair< char, char > > quotes={DEFAULT_QUOTES}, const EscapeSequenceMap &escapeSequences=getDefaultEscapeSequences())
Read a string starting at the current stream position.
Definition Text.cpp:248
const EscapeSequenceMap & getDefaultEscapeSequences()
Definition Text.cpp:9
void eatWhitespaceAndMultiLineComments(BufferStream &stream, std::string_view multiLineCommentStart=DEFAULT_MULTI_LINE_COMMENT_START)
Eat all whitespace and multi line comments after the current stream position.
Definition Text.cpp:174
bool toBool(std::string_view number, bool &out, int base=10)
Definition String.cpp:280
bool toFloat(std::string_view number, std::floating_point auto &out)
Definition String.h:152
bool toInt(std::string_view number, std::integral auto &out, int base=10)
Definition String.h:141