Beispiel #1
0
bool PgnStream::nextGame()
{
	char c;
	while ((c = readChar()) != 0)
	{
		if (c == '[')
		{
			rewindChar();
			m_phase = InTags;
			return true;
		}
	}

	return false;
}
Beispiel #2
0
bool PgnStream::nextGame()
{
	char c;
	while ((c = readChar()) != 0)
	{
		if (c == '[')
		{
			rewindChar();
			m_phase = InTags;
			return true;
		}
		else
			skipSection(this, c);
	}

	return false;
}
Beispiel #3
0
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;
}