const string Position::fen() const {
std::ostringstream ss;
- Square sq;
- int emptyCnt;
for (Rank rank = RANK_8; rank >= RANK_1; rank--)
{
- emptyCnt = 0;
-
for (File file = FILE_A; file <= FILE_H; file++)
{
- sq = file | rank;
+ Square sq = file | rank;
if (is_empty(sq))
- emptyCnt++;
- else
{
- if (emptyCnt > 0)
- {
- ss << emptyCnt;
- emptyCnt = 0;
- }
- ss << PieceToChar[piece_on(sq)];
+ int emptyCnt = 1;
+
+ for ( ; file < FILE_H && is_empty(sq++); file++)
+ emptyCnt++;
+
+ ss << emptyCnt;
}
+ else
+ ss << PieceToChar[piece_on(sq)];
}
- if (emptyCnt > 0)
- ss << emptyCnt;
-
if (rank > RANK_1)
ss << '/';
}
ss << (sideToMove == WHITE ? " w " : " b ");
if (can_castle(WHITE_OO))
- ss << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, KING_SIDE))))) : 'K');
+ ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE, KING_SIDE)), false) : 'K');
if (can_castle(WHITE_OOO))
- ss << (chess960 ? char(toupper(file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE))))) : 'Q');
+ ss << (chess960 ? file_to_char(file_of(castle_rook_square(WHITE, QUEEN_SIDE)), false) : 'Q');
if (can_castle(BLACK_OO))
- ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, KING_SIDE))) : 'k');
+ ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, KING_SIDE)), true) : 'k');
if (can_castle(BLACK_OOO))
- ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE))) : 'q');
+ ss << (chess960 ? file_to_char(file_of(castle_rook_square(BLACK, QUEEN_SIDE)), true) : 'q');
if (st->castleRights == CASTLES_NONE)
ss << '-';