- // go() is called when Glaurung receives the "go" UCI command. The
- // input parameter is a UCIInputParser. It is assumed that this
- // parser has consumed the first token of the UCI command ("go"),
- // and is ready to read the second token. The function sets the
- // thinking time and other parameters from the input string, and
- // calls think() (defined in search.cpp) with the appropriate
- // parameters.
-
- void go(UCIInputParser &uip) {
-
- std::string token;
-
- int time[2] = {0, 0}, inc[2] = {0, 0}, movesToGo = 0, depth = 0, nodes = 0;
- int moveTime = 0;
- bool infinite = false, ponder = false;
- Move searchMoves[500];
-
- searchMoves[0] = MOVE_NONE;
-
- while(!uip.at_end_of_line()) {
- token = uip.get_next_token();
-
- if(token == "infinite")
- infinite = true;
- else if(token == "ponder")
- ponder = true;
- else if(token == "wtime") {
- if(!uip.at_end_of_line())
- time[0] = atoi(uip.get_next_token().c_str());
- }
- else if(token == "btime") {
- if(!uip.at_end_of_line())
- time[1] = atoi(uip.get_next_token().c_str());
- }
- else if(token == "winc") {
- if(!uip.at_end_of_line())
- inc[0] = atoi(uip.get_next_token().c_str());
- }
- else if(token == "binc") {
- if(!uip.at_end_of_line())
- inc[1] = atoi(uip.get_next_token().c_str());
- }
- else if(token == "movestogo") {
- if(!uip.at_end_of_line())
- movesToGo = atoi(uip.get_next_token().c_str());
- }
- else if(token == "depth") {
- if(!uip.at_end_of_line())
- depth = atoi(uip.get_next_token().c_str());
- }
- else if(token == "nodes") {
- if(!uip.at_end_of_line())
- nodes = atoi(uip.get_next_token().c_str());
- }
- else if(token == "movetime") {
- if(!uip.at_end_of_line())
- moveTime = atoi(uip.get_next_token().c_str());
- }
- else if(token == "searchmoves" && !uip.at_end_of_line()) {
- int numOfMoves = 0;
- while(!uip.at_end_of_line()) {
- token = uip.get_next_token();
- searchMoves[numOfMoves++] = move_from_string(RootPosition, token);
- }
- searchMoves[numOfMoves] = MOVE_NONE;
- }
+ // go() is called when engine receives the "go" UCI command. The function sets
+ // the thinking time and other parameters from the input string, and starts
+ // the search.
+
+ void go(Position& pos, istringstream& is) {
+
+ Search::LimitsType limits;
+ vector<Move> searchMoves;
+ string token;
+
+ while (is >> token)
+ {
+ if (token == "searchmoves")
+ while (is >> token)
+ searchMoves.push_back(move_from_uci(pos, token));
+
+ else if (token == "wtime") is >> limits.time[WHITE];
+ else if (token == "btime") is >> limits.time[BLACK];
+ else if (token == "winc") is >> limits.inc[WHITE];
+ else if (token == "binc") is >> limits.inc[BLACK];
+ else if (token == "movestogo") is >> limits.movestogo;
+ else if (token == "depth") is >> limits.depth;
+ else if (token == "nodes") is >> limits.nodes;
+ else if (token == "movetime") is >> limits.movetime;
+ else if (token == "mate") is >> limits.mate;
+ else if (token == "infinite") limits.infinite = true;
+ else if (token == "ponder") limits.ponder = true;