diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-11 01:00:21 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-11 01:00:21 +0100 |
commit | 7b7c34011150c4db92220924d02e7e70eda3a8a7 (patch) | |
tree | 32c0cbc109bfca783b87ab9cdef94dbd9808cf36 | |
parent | d51f1d3e9307124c93d3a8ca9c26f48420c10c50 (diff) |
adapted Reader class to use CharReader instead of BufferedCharReader
-rw-r--r-- | src/core/utils/CharReader.hpp | 6 | ||||
-rw-r--r-- | src/core/variant/Reader.cpp | 32 | ||||
-rw-r--r-- | src/core/variant/Reader.hpp | 32 | ||||
-rw-r--r-- | src/plugins/css/CSSParser.cpp | 13 | ||||
-rw-r--r-- | test/core/variant/ReaderTest.cpp | 68 |
5 files changed, 79 insertions, 72 deletions
diff --git a/src/core/utils/CharReader.hpp b/src/core/utils/CharReader.hpp index 5daa21d..86f09db 100644 --- a/src/core/utils/CharReader.hpp +++ b/src/core/utils/CharReader.hpp @@ -652,6 +652,12 @@ public: void commit(); }; } + +/** + * Alias of the commonly used CharReader class. + */ +using CharReader = utils::CharReader; + } #endif /* _OUSIA_CHAR_READER_HPP_ */ diff --git a/src/core/variant/Reader.cpp b/src/core/variant/Reader.cpp index ba857af..3f1934e 100644 --- a/src/core/variant/Reader.cpp +++ b/src/core/variant/Reader.cpp @@ -32,7 +32,7 @@ namespace variant { // TODO: Replace delims with single char delim where possible // TODO: Use custom return value instead of std::pair // TODO: Allow buffered char reader to "fork" -// TODO: Rename BufferedCharReader to shorter CharReader +// TODO: Rename CharReader to shorter CharReader // TODO: Implement context in CharReader (to allow error messages to extract the // current line) @@ -97,7 +97,7 @@ private: * Appends the value of the character c to the internal number * representation and reports any errors that might occur. */ - bool appendChar(char c, int base, Part p, BufferedCharReader &reader, + bool appendChar(char c, int base, Part p, CharReader &reader, Logger &logger) { // Check whether the given character is valid @@ -176,7 +176,7 @@ public: * the given logger instance. Numbers are terminated by one of the given * delimiters. */ - bool parse(BufferedCharReader &reader, Logger &logger, + bool parse(CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { State state = State::INIT; @@ -186,7 +186,7 @@ public: reader.consumeWhitespace(); // Iterate over the FSM to extract numbers - while (reader.peek(&c)) { + while (reader.peek(c)) { // Abort, once a delimiter or whitespace is reached if (Utils::isWhitespace(c) || delims.count(c)) { reader.resetPeek(); @@ -317,7 +317,7 @@ static const int STATE_WHITESPACE = 5; static const int STATE_RESYNC = 6; template <class T> -static std::pair<bool, T> error(BufferedCharReader &reader, Logger &logger, +static std::pair<bool, T> error(CharReader &reader, Logger &logger, const char *err, T res) { logger.errorAt(err, reader); @@ -325,7 +325,7 @@ static std::pair<bool, T> error(BufferedCharReader &reader, Logger &logger, } std::pair<bool, std::string> Reader::parseString( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> *delims) { // Initialize the internal state @@ -339,9 +339,9 @@ std::pair<bool, std::string> Reader::parseString( // Statemachine whic iterates over each character in the stream // TODO: Combination of peeking and consumePeek is stupid as consumePeek is // the default (read and putBack would obviously be better, yet the latter - // is not trivial to implement in the current BufferedCharReader). + // is not trivial to implement in the current CharReader). char c; - while (reader.peek(&c)) { + while (reader.peek(c)) { switch (state) { case STATE_INIT: if (c == '"' || c == '\'') { @@ -423,7 +423,7 @@ std::pair<bool, std::string> Reader::parseString( } std::pair<bool, Variant::arrayType> Reader::parseArray( - BufferedCharReader &reader, Logger &logger, char delim) + CharReader &reader, Logger &logger, char delim) { Variant::arrayType res; bool hadError = false; @@ -436,7 +436,7 @@ std::pair<bool, Variant::arrayType> Reader::parseArray( // Iterate over the characters, use the parseGeneric function to read the // pairs - while (reader.peek(&c)) { + while (reader.peek(c)) { // Generically handle the end of the array if (state != STATE_INIT && c == delim) { reader.consumePeek(); @@ -491,7 +491,7 @@ std::pair<bool, Variant::arrayType> Reader::parseArray( } std::pair<bool, std::string> Reader::parseUnescapedString( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { std::stringstream res; @@ -503,7 +503,7 @@ std::pair<bool, std::string> Reader::parseUnescapedString( // Copy all characters, skip whitespace at the end int state = STATE_IN_STRING; - while (reader.peek(&c)) { + while (reader.peek(c)) { if (delims.count(c)) { reader.resetPeek(); return std::make_pair(true, res.str()); @@ -528,7 +528,7 @@ std::pair<bool, std::string> Reader::parseUnescapedString( } std::pair<bool, int64_t> Reader::parseInteger( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { Number n; @@ -545,7 +545,7 @@ std::pair<bool, int64_t> Reader::parseInteger( } std::pair<bool, double> Reader::parseDouble( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { Number n; @@ -554,14 +554,14 @@ std::pair<bool, double> Reader::parseDouble( } std::pair<bool, Variant> Reader::parseGeneric( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { char c; // Skip all whitespace characters reader.consumeWhitespace(); - while (reader.peek(&c)) { + while (reader.peek(c)) { // Stop if a delimiter is reached if (delims.count(c)) { return error(reader, logger, ERR_UNEXPECTED_END, nullptr); diff --git a/src/core/variant/Reader.hpp b/src/core/variant/Reader.hpp index 710f7c4..4114d46 100644 --- a/src/core/variant/Reader.hpp +++ b/src/core/variant/Reader.hpp @@ -32,7 +32,7 @@ #include <unordered_set> #include <utility> -#include <core/BufferedCharReader.hpp> +#include <core/utils/CharReader.hpp> #include <core/Logger.hpp> #include "Variant.hpp" @@ -46,7 +46,7 @@ private: * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * - * @param reader is a reference to the BufferedCharReader instance which is + * @param reader is a reference to the CharReader instance which is * the source for the character data. The reader will be positioned after * the terminating quote character or at the terminating delimiting * character. @@ -58,7 +58,7 @@ private: * is read. */ static std::pair<bool, std::string> parseString( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> *delims); public: @@ -66,7 +66,7 @@ public: * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * - * @param reader is a reference to the BufferedCharReader instance which is + * @param reader is a reference to the CharReader instance which is * the source for the character data. The reader will be positioned after * the terminating quote character or at the terminating delimiting * character. @@ -77,7 +77,7 @@ public: * outside). */ static std::pair<bool, std::string> parseString( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims) { return parseString(reader, logger, &delims); @@ -87,14 +87,14 @@ public: * Parses a string which may either be enclosed by " or ', unescapes * entities in the string as specified for JavaScript. * - * @param reader is a reference to the BufferedCharReader instance which is + * @param reader is a reference to the CharReader instance which is * the source for the character data. The reader will be positioned after * the terminating quote character or at the terminating delimiting * character. * @param logger is the logger instance that should be used to log error * messages and warnings. */ - static std::pair<bool, std::string> parseString(BufferedCharReader &reader, + static std::pair<bool, std::string> parseString(CharReader &reader, Logger &logger) { return parseString(reader, logger, nullptr); @@ -105,61 +105,61 @@ public: * instance. This function just reads text until one of the given delimiter * characters is reached. * - * @param reader is a reference to the BufferedCharReader instance which is + * @param reader is a reference to the CharReader instance which is * the source for the character data. The reader will be positioned at the * terminating delimiting character. * @param delims is a set of characters which will terminate the string. * These characters are not included in the result. May not be nullptr. */ static std::pair<bool, std::string> parseUnescapedString( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims); /** * Parses an integer from the given buffered char reader instance until one * of the given delimiter characters is reached. * - * @param reader is a reference to the BufferedCharReader instance from + * @param reader is a reference to the CharReader instance from * which the character data should been reader. The reader will be * positioned at the terminating delimiting character or directly after the * integer. */ static std::pair<bool, int64_t> parseInteger( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims); /** * Parses an double from the given buffered char reader instance until one * of the given delimiter characters is reached. * - * @param reader is a reference to the BufferedCharReader instance from + * @param reader is a reference to the CharReader instance from * which the character data should been reader. The reader will be * positioned at the terminating delimiting character or directly after the * integer. */ static std::pair<bool, double> parseDouble( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims); /** * Parses an array of values. */ static std::pair<bool, Variant::arrayType> parseArray( - BufferedCharReader &reader, Logger &logger, char delim = 0); + CharReader &reader, Logger &logger, char delim = 0); /** * Tries to parse the most specific item from the given stream until one of * the given delimiters is reached or a meaningful literal has been read. * The resulting variant represents the value that has been read. * - * @param reader is a reference to the BufferedCharReader instance which is + * @param reader is a reference to the CharReader instance which is * the source for the character data. The reader will be positioned at the * terminating delimiting character. * @param delims is a set of characters which will terminate the string. * These characters are not included in the result. May not be nullptr. */ static std::pair<bool, Variant> parseGeneric( - BufferedCharReader &reader, Logger &logger, + CharReader &reader, Logger &logger, const std::unordered_set<char> &delims); }; } diff --git a/src/plugins/css/CSSParser.cpp b/src/plugins/css/CSSParser.cpp index 4bbcc18..4cbe93f 100644 --- a/src/plugins/css/CSSParser.cpp +++ b/src/plugins/css/CSSParser.cpp @@ -227,14 +227,15 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer, // parse the argument list. Variant::arrayType args; // we require at least one argument, if parantheses are used - args.push_back(variant::Reader::parseGeneric(tokenizer.getInput(), + // XXX + /*args.push_back(variant::Reader::parseGeneric(tokenizer.getInput(), ctx.logger, - {',', ')'}).second); + {',', ')'}).second);*/ while (expect(COMMA, tokenizer, t, false, ctx)) { // as long as we find commas we expect new arguments. - args.push_back( + /*args.push_back( variant::Reader::parseGeneric( - tokenizer.getInput(), ctx.logger, {',', ')'}).second); + tokenizer.getInput(), ctx.logger, {',', ')'}).second);*/ } expect(PAREN_CLOSE, tokenizer, t, true, ctx); // and we return with the finished Selector. @@ -333,8 +334,8 @@ bool CSSParser::parseRule(CodeTokenizer &tokenizer, ParserContext &ctx, expect(COLON, tokenizer, t, true, ctx); // then the value // TODO: Resolve key for appropriate parsing function here. - value = variant::Reader::parseGeneric(tokenizer.getInput(), ctx.logger, - {';'}).second; + /*value = variant::Reader::parseGeneric(tokenizer.getInput(), ctx.logger, + {';'}).second;*/ // and a ; expect(SEMICOLON, tokenizer, t, true, ctx); return true; diff --git a/test/core/variant/ReaderTest.cpp b/test/core/variant/ReaderTest.cpp index 595bb57..7349856 100644 --- a/test/core/variant/ReaderTest.cpp +++ b/test/core/variant/ReaderTest.cpp @@ -31,7 +31,7 @@ TEST(Reader, readString) { // Simple, double quoted string { - BufferedCharReader reader("\"hello world\""); + CharReader reader("\"hello world\""); auto res = Reader::parseString(reader, logger); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -39,7 +39,7 @@ TEST(Reader, readString) // Simple, double quoted string with whitespace { - BufferedCharReader reader(" \"hello world\" "); + CharReader reader(" \"hello world\" "); auto res = Reader::parseString(reader, logger); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -47,7 +47,7 @@ TEST(Reader, readString) // Simple, single quoted string { - BufferedCharReader reader("'hello world'"); + CharReader reader("'hello world'"); auto res = Reader::parseString(reader, logger); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -55,7 +55,7 @@ TEST(Reader, readString) // Escape characters { - BufferedCharReader reader("'\\'\\\"\\b\\f\\n\\r\\t\\v'"); + CharReader reader("'\\'\\\"\\b\\f\\n\\r\\t\\v'"); auto res = Reader::parseString(reader, logger); ASSERT_TRUE(res.first); ASSERT_EQ("'\"\b\f\n\r\t\v", res.second); @@ -66,7 +66,7 @@ TEST(Reader, parseUnescapedString) { // Simple case { - BufferedCharReader reader("hello world;"); + CharReader reader("hello world;"); auto res = Reader::parseUnescapedString(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -74,7 +74,7 @@ TEST(Reader, parseUnescapedString) // Simple case with whitespace { - BufferedCharReader reader(" hello world ; "); + CharReader reader(" hello world ; "); auto res = Reader::parseUnescapedString(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -82,7 +82,7 @@ TEST(Reader, parseUnescapedString) // Linebreaks { - BufferedCharReader reader(" hello\nworld ; "); + CharReader reader(" hello\nworld ; "); auto res = Reader::parseUnescapedString(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_EQ("hello\nworld", res.second); @@ -90,7 +90,7 @@ TEST(Reader, parseUnescapedString) // End of stream { - BufferedCharReader reader(" hello world "); + CharReader reader(" hello world "); auto res = Reader::parseUnescapedString(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_EQ("hello world", res.second); @@ -103,49 +103,49 @@ TEST(Reader, parseInteger) { // Valid integers { - BufferedCharReader reader("0 "); + CharReader reader("0 "); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(0, res.second); } { - BufferedCharReader reader("42 "); + CharReader reader("42 "); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(42, res.second); } { - BufferedCharReader reader("-42"); + CharReader reader("-42"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-42, res.second); } { - BufferedCharReader reader(" -0x4A2 "); + CharReader reader(" -0x4A2 "); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-0x4A2, res.second); } { - BufferedCharReader reader(" 0Xaffe"); + CharReader reader(" 0Xaffe"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(0xAFFE, res.second); } { - BufferedCharReader reader("0x7FFFFFFFFFFFFFFF"); + CharReader reader("0x7FFFFFFFFFFFFFFF"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(0x7FFFFFFFFFFFFFFFL, res.second); } { - BufferedCharReader reader("-0x7FFFFFFFFFFFFFFF"); + CharReader reader("-0x7FFFFFFFFFFFFFFF"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-0x7FFFFFFFFFFFFFFFL, res.second); @@ -153,25 +153,25 @@ TEST(Reader, parseInteger) // Invalid integers { - BufferedCharReader reader("-"); + CharReader reader("-"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_FALSE(res.first); } { - BufferedCharReader reader("0a"); + CharReader reader("0a"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_FALSE(res.first); } { - BufferedCharReader reader("-0xag"); + CharReader reader("-0xag"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_FALSE(res.first); } { - BufferedCharReader reader("0x8000000000000000"); + CharReader reader("0x8000000000000000"); auto res = Reader::parseInteger(reader, logger, noDelim); ASSERT_FALSE(res.first); } @@ -181,49 +181,49 @@ TEST(Reader, parseDouble) { // Valid doubles { - BufferedCharReader reader("1.25"); + CharReader reader("1.25"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(1.25, res.second); } { - BufferedCharReader reader(".25"); + CharReader reader(".25"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(.25, res.second); } { - BufferedCharReader reader(".25e1"); + CharReader reader(".25e1"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(2.5, res.second); } { - BufferedCharReader reader("-2.5e-1"); + CharReader reader("-2.5e-1"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-0.25, res.second); } { - BufferedCharReader reader("-50e-2"); + CharReader reader("-50e-2"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-0.5, res.second); } { - BufferedCharReader reader("-1."); + CharReader reader("-1."); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_TRUE(res.first); ASSERT_EQ(-1., res.second); } { - BufferedCharReader reader("-50.e-2"); + CharReader reader("-50.e-2"); auto res = Reader::parseDouble(reader, logger, {'.'}); ASSERT_TRUE(res.first); ASSERT_EQ(-50, res.second); @@ -231,13 +231,13 @@ TEST(Reader, parseDouble) // Invalid doubles { - BufferedCharReader reader(".e1"); + CharReader reader(".e1"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_FALSE(res.first); } { - BufferedCharReader reader("0e100000"); + CharReader reader("0e100000"); auto res = Reader::parseDouble(reader, logger, noDelim); ASSERT_FALSE(res.first); } @@ -247,7 +247,7 @@ TEST(Reader, parseArray) { // Simple case (only primitive data types) { - BufferedCharReader reader("[\"Hello, World\", unescaped\n string ,\n" + CharReader reader("[\"Hello, World\", unescaped\n string ,\n" "1234, 0.56, true, false, null]"); auto res = Reader::parseArray(reader, logger); ASSERT_TRUE(res.first); @@ -275,7 +275,7 @@ TEST(Reader, parseArray) // Ending with comma { - BufferedCharReader reader("[ 'test' ,]"); + CharReader reader("[ 'test' ,]"); auto res = Reader::parseArray(reader, logger); ASSERT_TRUE(res.first); @@ -293,7 +293,7 @@ TEST(Reader, parseArray) // TODO: Actually parseGeneric should fall back to returning a simple string // if parsing of a special (non-string) type failed { - BufferedCharReader reader("[ 0invalidNumber, str, 1invalid]"); + CharReader reader("[ 0invalidNumber, str, 1invalid]"); auto res = Reader::parseArray(reader, logger); ASSERT_FALSE(res.first); @@ -313,7 +313,7 @@ TEST(Reader, parseGeneric) { // Simple case, unescaped string { - BufferedCharReader reader("hello world"); + CharReader reader("hello world"); auto res = Reader::parseGeneric(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_TRUE(res.second.isString()); @@ -322,7 +322,7 @@ TEST(Reader, parseGeneric) // Simple case, double quoted string { - BufferedCharReader reader(" \"hello world\" "); + CharReader reader(" \"hello world\" "); auto res = Reader::parseGeneric(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_TRUE(res.second.isString()); @@ -331,7 +331,7 @@ TEST(Reader, parseGeneric) // Simple case, single quoted string { - BufferedCharReader reader(" 'hello world' "); + CharReader reader(" 'hello world' "); auto res = Reader::parseGeneric(reader, logger, {';'}); ASSERT_TRUE(res.first); ASSERT_TRUE(res.second.isString()); |