UCIParser up(cmd);
string token;
- up >> token; // operator>>() skips any whitespace
+ up >> skipws >> token;
if (token == "quit")
return false;
void set_position(Position& pos, UCIParser& up) {
+ Move m;
string token, fen;
- up >> token; // operator>>() skips any whitespace
+ up >> token;
if (token == "startpos")
{
else return;
// Parse move list (if any)
- while (up >> token)
- pos.do_setup_move(move_from_uci(pos, token));
+ while (up >> token && (m = move_from_uci(pos, token)) != MOVE_NONE)
+ pos.do_setup_move(m);
}
void set_option(UCIParser& up) {
- string token, name;
- string value = "true"; // UCI buttons don't have a "value" field
+ string token, name, value;
up >> token; // Consume "name" token
- up >> name; // Read option name
- // Handle names with included spaces
+ // Read option name (can contain spaces)
while (up >> token && token != "value")
- name += " " + token;
-
- up >> value; // Read option value
+ name += string(" ", !name.empty()) + token;
- // Handle values with included spaces
+ // Read option value (can contain spaces)
while (up >> token)
- value += " " + token;
+ value += string(" ", !value.empty()) + token;
if (Options.find(name) != Options.end())
- Options[name].set_value(value);
+ Options[name].set_value(value.empty() ? "true" : value); // UCI buttons don't have "value"
else
cout << "No such option: " << name << endl;
}
limits.time = time[pos.side_to_move()];
limits.increment = inc[pos.side_to_move()];
- assert(pos.is_ok());
-
return think(pos, limits, searchMoves);
}
// perft() is called when engine receives the "perft" command.
// The function calls perft() passing the required search depth
- // then prints counted nodes and elapsed time.
+ // then prints counted leaf nodes and elapsed time.
void perft(Position& pos, UCIParser& up) {