- // go() is called when Stockfish 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. Returns false if a quit command is received while
- // thinking, returns true otherwise.
+ do {
+ if (argc == 1 && !getline(cin, cmd)) // Block here waiting for input or EOF
+ cmd = "quit";
+
+ istringstream is(cmd);
+
+ token.clear(); // Avoid a stale if getline() returns empty or blank line
+ is >> skipws >> token;
+
+ if ( token == "quit"
+ || token == "stop")
+ Threads.stop = true;
+
+ // The GUI sends 'ponderhit' to tell us the user has played the expected move.
+ // So 'ponderhit' will be sent if we were told to ponder on the same move the
+ // user has played. We should continue searching but switch from pondering to
+ // normal search.
+ else if (token == "ponderhit")
+ Threads.main()->ponder = false; // Switch to normal search
+
+ else if (token == "uci")
+ sync_cout << "id name " << engine_info(true)
+ << "\n" << Options
+ << "\nuciok" << sync_endl;
+
+ else if (token == "setoption") setoption(is);
+ else if (token == "go") go(pos, is, states);
+ else if (token == "position") position(pos, is, states);
+ else if (token == "ucinewgame") Search::clear();
+ else if (token == "isready") sync_cout << "readyok" << sync_endl;
+
+ // Additional custom non-UCI commands, mainly for debugging.
+ // Do not use these commands during a search!
+ else if (token == "flip") pos.flip();
+ else if (token == "bench") bench(pos, is, states);
+ else if (token == "d") sync_cout << pos << sync_endl;
+ else if (token == "eval") sync_cout << Eval::trace(pos) << sync_endl;
+ else if (token == "compiler") sync_cout << compiler_info() << sync_endl;
+ else
+ sync_cout << "Unknown command: " << cmd << sync_endl;
+
+ } while (token != "quit" && argc == 1); // Command line args are one-shot
+}