From: Marco Costalba Date: Sat, 8 Jan 2011 15:23:46 +0000 (+0100) Subject: Retire move_from_san() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=c82906a2c3bbc140d900aad6be11212c340db0e8 Retire move_from_san() It is unused and it is big. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/san.cpp b/src/san.cpp index 46ff536c..1fc8d13c 100644 --- a/src/san.cpp +++ b/src/san.cpp @@ -174,166 +174,6 @@ const string move_to_san(Position& pos, Move m) { } -/// move_from_san() takes a position and a string as input, and tries to -/// interpret the string as a move in short algebraic notation. On success, -/// the move is returned. On failure (i.e. if the string is unparsable, or -/// if the move is illegal or ambiguous), MOVE_NONE is returned. - -Move move_from_san(const Position& pos, const string& movestr) { - - assert(pos.is_ok()); - - enum { START, TO_FILE, TO_RANK, PROMOTION_OR_CHECK, PROMOTION, CHECK, END }; - static const string pieceLetters = "KQRBN"; - - MoveStack mlist[MOVES_MAX], *last; - PieceType pt = PIECE_TYPE_NONE, promotion = PIECE_TYPE_NONE; - File fromFile = FILE_NONE, toFile = FILE_NONE; - Rank fromRank = RANK_NONE, toRank = RANK_NONE; - Move move = MOVE_NONE; - Square from, to; - int matches, state = START; - - // Generate all legal moves for the given position - last = generate(pos, mlist); - - // Castling moves - if (movestr == "O-O-O" || movestr == "O-O-O+") - { - for (MoveStack* cur = mlist; cur != last; cur++) - if (move_is_long_castle(cur->move)) - return cur->move; - - return MOVE_NONE; - } - else if (movestr == "O-O" || movestr == "O-O+") - { - for (MoveStack* cur = mlist; cur != last; cur++) - if (move_is_short_castle(cur->move)) - return cur->move; - - return MOVE_NONE; - } - - // Normal moves. We use a simple FSM to parse the san string - for (size_t i = 0; i < movestr.length(); i++) - { - char type, c = movestr[i]; - - if (pieceLetters.find(c) != string::npos) - type = 'P'; - else if (c >= 'a' && c <= 'h') - type = 'F'; - else if (c >= '1' && c <= '8') - type = 'R'; - else - type = c; - - switch (type) { - case 'P': - if (state == START) - { - pt = piece_type_from_char(c); - state = TO_FILE; - } - else if (state == PROMOTION) - { - promotion = piece_type_from_char(c); - state = (i < movestr.length() - 1 ? CHECK : END); - } - else - return MOVE_NONE; - break; - case 'F': - if (state == START) - { - pt = PAWN; - fromFile = toFile = file_from_char(c); - state = TO_RANK; - } - else if (state == TO_FILE) - { - toFile = file_from_char(c); - state = TO_RANK; - } - else if (state == TO_RANK && toFile != FILE_NONE) - { - // Previous file was for disambiguation - fromFile = toFile; - toFile = file_from_char(c); - } - else - return MOVE_NONE; - break; - case 'R': - if (state == TO_RANK) - { - toRank = rank_from_char(c); - state = (i < movestr.length() - 1) ? PROMOTION_OR_CHECK : END; - } - else if (state == TO_FILE && fromRank == RANK_NONE) - { - // It's a disambiguation rank instead of a file - fromRank = rank_from_char(c); - } - else - return MOVE_NONE; - break; - case 'x': - case 'X': - if (state == TO_RANK) - { - // Previous file was for disambiguation, or it's a pawn capture - fromFile = toFile; - state = TO_FILE; - } - else if (state != TO_FILE) - return MOVE_NONE; - break; - case '=': - if (state == PROMOTION_OR_CHECK) - state = PROMOTION; - else - return MOVE_NONE; - break; - case '+': - case '#': - if (state == PROMOTION_OR_CHECK || state == CHECK) - state = END; - else - return MOVE_NONE; - break; - default: - return MOVE_NONE; - break; - } - } - - if (state != END) - return MOVE_NONE; - - // Look for an unambiguous matching move - to = make_square(toFile, toRank); - matches = 0; - - for (MoveStack* cur = mlist; cur != last; cur++) - { - from = move_from(cur->move); - - if ( pos.type_of_piece_on(from) == pt - && move_to(cur->move) == to - && move_promotion_piece(cur->move) == promotion - && (fromFile == FILE_NONE || fromFile == square_file(from)) - && (fromRank == RANK_NONE || fromRank == square_rank(from))) - { - move = cur->move; - matches++; - } - } - return matches == 1 ? move : MOVE_NONE; -} - - /// line_to_san() takes a position and a line (an array of moves representing /// a sequence of legal moves from the position) as input, and returns a /// string containing the line in short algebraic notation. If the boolean diff --git a/src/san.h b/src/san.h index 71aaabe2..13c1f653 100644 --- a/src/san.h +++ b/src/san.h @@ -39,7 +39,6 @@ extern const std::string move_to_uci(Move m, bool chess960); extern Move move_from_uci(const Position& pos, const std::string& str); extern const std::string move_to_san(Position& pos, Move m); -extern Move move_from_san(const Position& pos, const std::string& str); extern const std::string line_to_san(const Position& pos, Move line[], int startColumn, bool breakLines); extern const std::string pretty_pv(const Position& pos, int time, int depth, Value score, ValueType type, Move pv[]);