bool PgnStream::nextGame() { char c; while ((c = readChar()) != 0) { if (c == '[') { rewindChar(); m_phase = InTags; return true; } } return false; }
bool PgnStream::nextGame() { char c; while ((c = readChar()) != 0) { if (c == '[') { rewindChar(); m_phase = InTags; return true; } else skipSection(this, c); } return false; }
PgnStream::TokenType PgnStream::readNext() { if (m_phase == OutOfGame) return NoToken; m_tokenType = NoToken; m_tokenString.clear(); char c; while ((c = readChar()) != 0) { switch (c) { case ' ': case '\t': case '\n': case '\r': case '.': break; case '%': // Escape mechanism (skip this line) parseUntil("\n\r"); m_tokenString.clear(); break; case '[': if (m_phase != InTags) { rewindChar(); m_phase = OutOfGame; return NoToken; } m_tokenType = PgnTag; parseTag(); return m_tokenType; case '(': case '{': m_tokenType = PgnComment; parseComment(c); return m_tokenType; case ';': m_tokenType = PgnLineComment; parseUntil("\n\r"); return m_tokenType; case '$': // NAG (Numeric Annotation Glyph) m_tokenType = PgnNag; parseUntil(" \t\n\r"); return m_tokenType; case '*': // Unfinished game m_tokenType = PgnResult; m_tokenString = "*"; m_phase = OutOfGame; return m_tokenType; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': // Move number or result m_tokenString.append(c); parseUntil(". \t\n\r"); if (m_tokenString == "1-0" || m_tokenString == "0-1" || m_tokenString == "1/2-1/2") { m_tokenType = PgnResult; m_phase = OutOfGame; } else { if (m_tokenString.endsWith('.')) m_tokenString.chop(1); m_tokenType = PgnMoveNumber; m_phase = InGame; } return m_tokenType; default: m_tokenType = PgnMove; m_tokenString.append(c); parseUntil(" \t\n\r"); m_phase = InGame; return m_tokenType; } } return NoToken; }