X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fio%2Ftoken.cpp;h=b462df778b593ee11927d6e80da46031b530b709;hb=33b37e7242e4cbfa76e4a0d6e5bb54223b541162;hp=5e734ad573b634ed4fcf101c89735f7c64dda4b2;hpb=ede25c0a2f59e21521d1cd962e6ea9d78169ca12;p=blank.git diff --git a/src/io/token.cpp b/src/io/token.cpp index 5e734ad..b462df7 100644 --- a/src/io/token.cpp +++ b/src/io/token.cpp @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; @@ -32,7 +33,7 @@ void Tokenizer::ReadToken() { istream::sentry s(in); if (!s) { - // TODO: error? + throw runtime_error("read past the end of stream"); return; } @@ -47,7 +48,7 @@ void Tokenizer::ReadToken() { case ',': case '=': current.type = Token::Type(c); break; - case '+': case '-': + case '+': case '-': case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': in.putback(c); @@ -71,7 +72,7 @@ void Tokenizer::ReadToken() { namespace { bool is_num_char(istream::char_type c) { - return isdigit(c) + return isxdigit(c) || c == '.' || c == '-' || c == '+' @@ -173,7 +174,7 @@ void Tokenizer::ReadIdentifier() { istream::char_type c; while (in.get(c)) { - if (isalnum(c) || c == '_') { + if (isalnum(c) || c == '_' || c == '.') { current.value += c; } else { in.putback(c); @@ -191,6 +192,9 @@ TokenStreamReader::TokenStreamReader(istream &in) bool TokenStreamReader::HasMore() { + if (cached) { + return true; + } while (in.HasMore()) { if (in.Next().type != Token::COMMENT) { cached = true; @@ -327,6 +331,18 @@ void TokenStreamReader::ReadVec(glm::ivec4 &v) { Skip(Token::BRACKET_CLOSE); } +void TokenStreamReader::ReadQuat(glm::quat &q) { + Skip(Token::BRACKET_OPEN); + ReadNumber(q.w); + Skip(Token::COMMA); + ReadNumber(q.x); + Skip(Token::COMMA); + ReadNumber(q.y); + Skip(Token::COMMA); + ReadNumber(q.z); + Skip(Token::BRACKET_CLOSE); +} + bool TokenStreamReader::GetBool() { Next();