diff options
| author | Maxime Coste <mawww@kakoune.org> | 2018-02-15 21:23:12 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2018-02-15 23:24:19 +1100 |
| commit | bde1f5349d218298de04ee453b304de3c053800e (patch) | |
| tree | c3a3e50c2e0c1430ad96feed0eaeb6666b694ec5 /src/command_manager.hh | |
| parent | d95530b1715d959a08e899796149f6d152f543cf (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.hh | 36 |
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> { |
