From ada55c5d0a899a5ccfbb3abe9967cf9c2b29c363 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 12 Apr 2014 12:05:25 +0200 Subject: [PATCH] Reshuffle in uci.cpp Move function definitions before call site. No functional change. --- src/uci.cpp | 160 +++++++++++++++++++++++++--------------------------- 1 file changed, 77 insertions(+), 83 deletions(-) diff --git a/src/uci.cpp b/src/uci.cpp index 9b7ab033..df01836b 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -44,89 +44,6 @@ namespace { // draw detection code. Search::StateStackPtr SetupStates; - void setoption(istringstream& up); - void position(Position& pos, istringstream& up); - void go(const Position& pos, istringstream& up); -} - - -/// Wait for a command from the user, parse this text string as an UCI command, -/// and call the appropriate functions. Also intercepts EOF from stdin to ensure -/// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI -/// commands, the function also supports a few debug commands. - -void UCI::loop(const string& args) { - - Position pos(StartFEN, false, Threads.main()); // The root position - string token, cmd = args; - - do { - if (args.empty() && !getline(cin, cmd)) // Block here waiting for input - cmd = "quit"; - - istringstream is(cmd); - - is >> skipws >> token; - - if (token == "quit" || token == "stop" || token == "ponderhit") - { - // The GUI sends 'ponderhit' to tell us to ponder on the same move the - // opponent has played. In case Signals.stopOnPonderhit is set we are - // waiting for 'ponderhit' to stop the search (for instance because we - // already ran out of time), otherwise we should continue searching but - // switch from pondering to normal search. - if (token != "ponderhit" || Search::Signals.stopOnPonderhit) - { - Search::Signals.stop = true; - Threads.main()->notify_one(); // Could be sleeping - } - else - Search::Limits.ponder = false; - } - else if (token == "perft" && (is >> token)) // Read perft depth - { - stringstream ss; - - ss << Options["Hash"] << " " - << Options["Threads"] << " " << token << " current perft"; - - benchmark(pos, ss); - } - else if (token == "key") - sync_cout << hex << uppercase << setfill('0') - << "position key: " << setw(16) << pos.key() - << "\nmaterial key: " << setw(16) << pos.material_key() - << "\npawn key: " << setw(16) << pos.pawn_key() - << dec << sync_endl; - - else if (token == "uci") - sync_cout << "id name " << engine_info(true) - << "\n" << Options - << "\nuciok" << sync_endl; - - else if (token == "eval") - { - Search::RootColor = pos.side_to_move(); // Ensure it is set - sync_cout << Eval::trace(pos) << sync_endl; - } - else if (token == "ucinewgame") TT.clear(); - else if (token == "go") go(pos, is); - else if (token == "position") position(pos, is); - else if (token == "setoption") setoption(is); - else if (token == "flip") pos.flip(); - else if (token == "bench") benchmark(pos, is); - else if (token == "d") sync_cout << pos.pretty() << sync_endl; - else if (token == "isready") sync_cout << "readyok" << sync_endl; - else - sync_cout << "Unknown command: " << cmd << sync_endl; - - } while (token != "quit" && args.empty()); // Args have one-shot behaviour - - Threads.wait_for_think_finished(); // Cannot quit whilst the search is running -} - - -namespace { // position() is called when engine receives the "position" UCI command. // The function sets up the position described in the given FEN string ("fen") @@ -217,4 +134,81 @@ namespace { Threads.start_thinking(pos, limits, SetupStates); } + +} // namespace + + +/// Wait for a command from the user, parse this text string as an UCI command, +/// and call the appropriate functions. Also intercepts EOF from stdin to ensure +/// that we exit gracefully if the GUI dies unexpectedly. In addition to the UCI +/// commands, the function also supports a few debug commands. + +void UCI::loop(const string& args) { + + Position pos(StartFEN, false, Threads.main()); // The root position + string token, cmd = args; + + do { + if (args.empty() && !getline(cin, cmd)) // Block here waiting for input + cmd = "quit"; + + istringstream is(cmd); + + is >> skipws >> token; + + if (token == "quit" || token == "stop" || token == "ponderhit") + { + // The GUI sends 'ponderhit' to tell us to ponder on the same move the + // opponent has played. In case Signals.stopOnPonderhit is set we are + // waiting for 'ponderhit' to stop the search (for instance because we + // already ran out of time), otherwise we should continue searching but + // switch from pondering to normal search. + if (token != "ponderhit" || Search::Signals.stopOnPonderhit) + { + Search::Signals.stop = true; + Threads.main()->notify_one(); // Could be sleeping + } + else + Search::Limits.ponder = false; + } + else if (token == "perft" && (is >> token)) // Read perft depth + { + stringstream ss; + + ss << Options["Hash"] << " " + << Options["Threads"] << " " << token << " current perft"; + + benchmark(pos, ss); + } + else if (token == "key") + sync_cout << hex << uppercase << setfill('0') + << "position key: " << setw(16) << pos.key() + << "\nmaterial key: " << setw(16) << pos.material_key() + << "\npawn key: " << setw(16) << pos.pawn_key() + << dec << sync_endl; + + else if (token == "uci") + sync_cout << "id name " << engine_info(true) + << "\n" << Options + << "\nuciok" << sync_endl; + + else if (token == "eval") + { + Search::RootColor = pos.side_to_move(); // Ensure it is set + sync_cout << Eval::trace(pos) << sync_endl; + } + else if (token == "ucinewgame") TT.clear(); + else if (token == "go") go(pos, is); + else if (token == "position") position(pos, is); + else if (token == "setoption") setoption(is); + else if (token == "flip") pos.flip(); + else if (token == "bench") benchmark(pos, is); + else if (token == "d") sync_cout << pos.pretty() << sync_endl; + else if (token == "isready") sync_cout << "readyok" << sync_endl; + else + sync_cout << "Unknown command: " << cmd << sync_endl; + + } while (token != "quit" && args.empty()); // Args have one-shot behaviour + + Threads.wait_for_think_finished(); // Cannot quit whilst the search is running } -- 2.39.2