void MoveInfoTable::decode(ByteStream& strm) { MoveInfo m; unsigned index = 0; m_table.clear(); while (strm.remaining()) { unsigned skip = m.decode(strm); m_table.resize((index += skip) + 1); m_table[index].add(m); } }
void Decoder::decodeVariation(ByteStream& data) { unsigned pieceNum = 0; // satisfies the compiler Move move; while (true) { Byte b; while ((b = m_strm.get()) > token::End_Marker) { if (move) m_position.doMove(move, pieceNum); pieceNum = decodeMove(b, move); MoveNode* node = new MoveNode(move); m_currentNode->setNext(node); m_currentNode = node; } switch (b) { case token::End_Marker: { MoveNode* node = new MoveNode; m_currentNode->setNext(node); switch (m_strm.get()) { case token::Comment: node->setCommentFlag(data.get()); break; case token::End_Marker: break; default: return; //IO_RAISE(Game, Corrupted, "unexpected token"); } } return; case token::Start_Marker: { MoveNode* current = m_currentNode; m_position.push(); m_position.board().undoMove(move); current->addVariation(m_currentNode = new MoveNode); decodeVariation(data); m_currentNode = current; m_position.pop(); } break; case token::Nag: static_assert(Annotation::Max_Nags >= 7, "Scidb needs at least seven entries"); { nag::ID nag = nag::ID(m_strm.get()); if (nag == 0) move.setLegalMove(false); else m_currentNode->addAnnotation(nag); } break; case token::Mark: if (data.peek() & 0x80) { MoveInfo info; info.decode(data); m_currentNode->addMoveInfo(info); } else { Mark mark; mark.decode(data); m_currentNode->addMark(mark); } break; case token::Comment: m_currentNode->setCommentFlag(data.get()); break; } } }