/* * Copyright (C) 2020 Linux Studio Plugins Project * (C) 2020 Vladimir Sadovnikov * * This file is part of lsp-runtime-lib * Created on: 14 окт. 2019 г. * * lsp-runtime-lib is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * lsp-runtime-lib is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with lsp-runtime-lib. If not, see . */ #ifndef LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_ #define LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_ #include #include #include #include namespace lsp { namespace json { class Tokenizer { private: Tokenizer & operator = (const Tokenizer &); friend class Serializer; protected: io::IInSequence *pIn; lsp_swchar_t cCurrent; token_t enToken; LSPString sValue; union { double fValue; ssize_t iValue; }; status_t nError; size_t nUnget; size_t nIoSize; size_t nIoOffset; bool bEscaping; // Escaping mode lsp_wchar_t *pIoBuf; protected: lsp_swchar_t skip_whitespace(); status_t fill_buffer(); lsp_swchar_t get_char(); inline lsp_swchar_t lookup(); token_t commit(token_t token); inline token_t skip(token_t token) { cCurrent = -1; return enToken = token; } lsp_swchar_t commit_lookup(token_t token); inline token_t set_error(status_t code); static bool is_reserved_word(const LSPString *text); static bool is_valid_identifier(const LSPString *text); static bool is_identifier_start(lsp_wchar_t ch); static bool is_identifier(lsp_wchar_t ch); static bool parse_digit(int *digit, lsp_wchar_t ch, int radix); token_t parse_string(token_t type); token_t parse_identifier(); token_t parse_single_line_comment(); token_t parse_multiline_comment(); token_t parse_number(); public: explicit Tokenizer(io::IInSequence *in); virtual ~Tokenizer(); public: /** * Get token * @param get force token lookup * @return current token value */ token_t get_token(bool get); /** * Unget token */ inline void unget() { ++nUnget; }; /** * Get current token * @return current token */ inline token_t current() const { return enToken; } /** * Get current token value for tokens that consist of characters * @return current token value */ inline const LSPString *text_value() const { return &sValue; } /** * Get floating-point value of the token * @return floating-point value of the token */ inline const double float_value() const { return fValue; } /** * Get integer value of the token * @return integer value of the token */ inline ssize_t int_value() const { return iValue; } /** * Get last error code * @return last error code */ inline status_t error() const { return nError; } }; } /* namespace json */ } /* namespace lsp */ #endif /* LSP_PLUG_IN_FMT_JSON_TOKENIZER_H_ */