| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // ================================================================================
- // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
- // == See tb_core.h for more information. ==
- // ================================================================================
- #ifndef TB_PARSER_H
- #define TB_PARSER_H
- #include "../tb_value.h"
- #include "../tb_tempbuffer.h"
- #include "../tb_str.h"
- namespace tb {
- /** Unescape backslash codes. This is done in place using the string both as source
- and destination. */
- void UnescapeString(char *str);
- /** Check if buf is pointing at a end quote. It may need to iterate
- buf backwards toward buf_start to check if any preceding backslashes
- make it a escaped quote (which should not be the end quote) */
- bool IsEndQuote(const char *buf_start, const char *buf, const char quote_type);
- class TBParserTarget
- {
- public:
- virtual ~TBParserTarget() {}
- virtual void OnError(int line_nr, const char *error) = 0;
- virtual void OnComment(int line_nr, const char *comment) = 0;
- virtual void OnToken(int line_nr, const char *name, TBValue &value) = 0;
- virtual void Enter() = 0;
- virtual void Leave() = 0;
- };
- class TBParserStream
- {
- public:
- virtual ~TBParserStream() {}
- virtual int GetMoreData(char *buf, int buf_len) = 0;
- };
- class TBParser
- {
- public:
- enum STATUS {
- STATUS_OK,
- STATUS_OUT_OF_MEMORY,
- STATUS_PARSE_ERROR
- };
- TBParser() { indent_spaces = -1; indent_tabs = false; }
- STATUS Read(TBParserStream *stream, TBParserTarget *target);
- private:
- int current_indent;
- int current_line_nr;
- TBStr multi_line_token;
- TBTempBuffer multi_line_value;
- int multi_line_sub_level;
- bool pending_multiline;
- void OnLine(char *line, TBParserTarget *target);
- void OnCompactLine(char *line, TBParserTarget *target);
- void OnMultiline(char *line, TBParserTarget *target);
- void ConsumeValue(TBValue &dst_value, char *&line);
- int indent_spaces;
- bool indent_tabs;
- };
- }; // namespace tb
- #endif // TB_PARSER_H
|