- else {
- std::cout << "Unknown command: " << command << std::endl;
- while(!uip.at_end_of_line()) {
- std::cout << uip.get_next_token() << std::endl;
- }
- }
- }
-
-
- // set_position() is called when Glaurung receives the "position" UCI
- // command. The input parameter is a UCIInputParser. It is assumed
- // that this parser has consumed the first token of the UCI command
- // ("position"), and is ready to read the second token ("startpos"
- // or "fen", if the input is well-formed).
-
- void set_position(UCIInputParser &uip) {
- std::string token;
-
- token = uip.get_next_token();
- if(token == "startpos")
- RootPosition.from_fen(StartPosition);
- else if(token == "fen") {
- std::string fen;
- while(token != "moves" && !uip.at_end_of_line()) {
- token = uip.get_next_token();
- fen += token;
- fen += ' ';
- }
- RootPosition.from_fen(fen);
- }
-
- if(!uip.at_end_of_line()) {
- if(token != "moves")
- token = uip.get_next_token();
- if(token == "moves") {
- Move move;
- UndoInfo u;
- while(!uip.at_end_of_line()) {
- token = uip.get_next_token();
- move = move_from_string(RootPosition, token);
- RootPosition.do_move(move, u);
- if(RootPosition.rule_50_counter() == 0)
- RootPosition.reset_game_ply();
- }
- }
- }
- }
-
-
- // set_option() is called when Glaurung receives the "setoption" UCI
- // command. The input parameter is a UCIInputParser. It is assumed
- // that this parser has consumed the first token of the UCI command
- // ("setoption"), and is ready to read the second token ("name", if
- // the input is well-formed).
-
- void set_option(UCIInputParser &uip) {
- std::string token;
- if(!uip.at_end_of_line()) {
- token = uip.get_next_token();
- if(token == "name" && !uip.at_end_of_line()) {
- std::string name = uip.get_next_token();
- std::string nextToken;
- while(!uip.at_end_of_line()
- && (nextToken = uip.get_next_token()) != "value")
- name += (" " + nextToken);
- if(nextToken == "value")
- set_option_value(name, uip.get_rest_of_line());
- else
- push_button(name);
- }
- }
- }
-
-
- // 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;
- }
- }
-
- if(moveTime)
- infinite = true; // HACK