summaryrefslogtreecommitdiff
path: root/src/command_manager.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2018-02-15 21:23:12 +1100
committerMaxime Coste <mawww@kakoune.org>2018-02-15 23:24:19 +1100
commitbde1f5349d218298de04ee453b304de3c053800e (patch)
treec3a3e50c2e0c1430ad96feed0eaeb6666b694ec5 /src/command_manager.hh
parentd95530b1715d959a08e899796149f6d152f543cf (diff)
CommandManager: refactor parsing of commands to iterate through tokens
Avoid storing a big vector of tokens, read them one by one, and store only the current command.
Diffstat (limited to 'src/command_manager.hh')
-rw-r--r--src/command_manager.hh36
1 files changed, 31 insertions, 5 deletions
diff --git a/src/command_manager.hh b/src/command_manager.hh
index 87ce3f1c..b5b49dd9 100644
--- a/src/command_manager.hh
+++ b/src/command_manager.hh
@@ -55,16 +55,42 @@ struct Token
};
Type type;
- ByteCount begin;
- ByteCount end;
+ ByteCount pos;
BufferCoord coord;
String content;
};
-using TokenList = Vector<Token>;
+struct Reader
+{
+public:
+ Reader(StringView s) : str{s}, pos{s.begin()}, line_start{s.begin()}, line{} {}
+
+ Codepoint operator*() const;
+ Reader& operator++();
+
+ explicit operator bool() const { return pos < str.end(); }
+ StringView substr_from(const char* start) const { return {start, pos}; }
+ BufferCoord coord() const { return {line, (int)(pos - line_start)}; }
+
+ StringView str;
+ const char* pos;
+ const char* line_start;
+ LineCount line;
+};
-template<bool throw_on_unterminated>
-TokenList parse(StringView line);
+class CommandParser
+{
+public:
+ CommandParser(StringView command_line);
+ Optional<Token> read_token(bool throw_on_unterminated);
+
+ const char* pos() const { return m_reader.pos; }
+ BufferCoord coord() const { return m_reader.coord(); }
+ bool done() const { return not m_reader; }
+
+private:
+ Reader m_reader;
+};
class CommandManager : public Singleton<CommandManager>
{