if ( std::getline(is, token, '[') && std::getline(is, white_holdings, ']')
&& std::getline(is, token, '[') && std::getline(is, black_holdings, ']'))
{
- std::transform(black_holdings.begin(), black_holdings.end(), black_holdings.begin(), ::tolower);
- std::string fen = pos.fen(false, false, white_holdings + black_holdings);
+ std::string fen;
+ char color, pieceType;
+ // Use the obtained holding if available to avoid race conditions
+ if (is >> color && is >> pieceType)
+ {
+ fen = pos.fen();
+ fen.insert(fen.find(']'), 1, toupper(color) == 'B' ? tolower(pieceType) : toupper(pieceType));
+ }
+ else
+ {
+ std::transform(black_holdings.begin(), black_holdings.end(), black_holdings.begin(), ::tolower);
+ fen = pos.fen(false, false, white_holdings + black_holdings);
+ }
setboard(pos, states, fen);
}
// restart search