void ft_cut_select(t_it *it) { int length; int temp; int a; int b; tputs(tgetstr("me", NULL), 0, my_putchar); it->r_video = 0; length = ft_abs(it->i - it->saved_i) + 1; temp = it->i; a = it->i - it->offset; b = it->saved_i - it->offset; move_begin(it); if (temp > it->saved_i) { ft_memdel((void**)&it->tmp_buffer); it->tmp_buffer = ft_strsub(it->line, b, length); cut_selection(b, a, it); } else { ft_memdel((void**)&it->tmp_buffer); it->tmp_buffer = ft_strsub(it->line, a, length); cut_selection(a, b, it); } tputs(tgetstr("cd", NULL), 0, my_putchar); ft_putstr(it->line); it->i += ft_strlen(it->line); }
int readline(char *str_line) { int c; memset(line, 0, STR_LINE_SIZE); offset = 0; len = 0; do{ c = term_getc(); /* printf("c = %d\n", c); if( is_send_signal_int() ) { fprintf(stderr, "sig"); term_putc('\n'); str_line[0] = '\0'; return 0; } */ switch( c ) { case -1 : fprintf(stderr, "\n-1\n"); break; case '\n' : term_putc('\n'); break; case 1 : move_begin(); break; case 5 : move_end(); break; case 127 : backspace(); history_backup_current_line(line); break; case 27 : switch( (c = term_getc()) ) { case 91 : switch( (c = term_getc()) ) { case 65 : move_up(); break; case 66 : move_down(); break; case 68 : move_left(); break; case 67 : move_right(); break; default: //printf("c = %d\n", c); break; } break; } break; default : //printf("c = %d\n", c); if( c >= ' ' ) { append(c); history_backup_current_line(line); } break; } }while( c != '\n' ); history_add(line); history_backup_current_line(""); memcpy(str_line, line, len+1); return len; }
void MoveGenDefault::_get_all_moves(MoveList& moves) const { static bool capture[8][8] = {}; // Search for capture-moves first if (MT != NON_CAPTURE) { for (int i = 0; i < board.piece_count[turn_simple(TURN)]; ++i) { const auto& pos = board.piece_list[turn_simple(TURN)][i]; Move move(pos); move.set_original(board[pos.row][pos.column]); tmp_assign<Piece> move_begin(const_cast<Piece&> (board[pos.row][pos.column]), Piece(PT_EMPTY)); // Because this position is empty when we move from it _find_deep_capture<TURN>(moves, move, pos.row, pos.column, capture); } for (int i = 0; i < board.piece_count[turn_queen(TURN)]; ++i) { const auto& pos = board.piece_list[turn_queen(TURN)][i]; Move move(pos); move.set_original(board[pos.row][pos.column]); tmp_assign<Piece> move_begin(const_cast<Piece&> (board[pos.row][pos.column]), Piece(PT_EMPTY)); // Because this position is empty when we move from it _find_deep_capture_queen<TURN>(moves, move, pos.row, pos.column, capture); } } // Capture-move is mandatory, so we need to check non-capture moves only when we don't have any capture-moves if (MT == CAPTURE || !moves.empty()) return; for (int i = 0; i < board.piece_count[turn_simple(TURN)]; ++i) { const auto& pos = board.piece_list[turn_simple(TURN)][i]; if (pos.column < 7 && board[TURN == WHITE ? pos.row + 1 : pos.row - 1][pos.column + 1].get_type() == PT_EMPTY) { Move move(pos); move.set_original(board[pos.row][pos.column]); if (TURN == WHITE) { move.add_step(Position(pos.row + 1, pos.column + 1)); move.set_become(pos.row == 6 ? Piece(WHITE_QUEEN) : Piece(WHITE_SIMPLE)); } else { move.add_step(Position(pos.row - 1, pos.column + 1)); move.set_become(pos.row == 1 ? Piece(BLACK_QUEEN) : Piece(BLACK_SIMPLE)); } moves.emplace(std::move(move)); } if (pos.column > 0 && board[TURN == WHITE ? pos.row + 1 : pos.row - 1][pos.column - 1].get_type() == PT_EMPTY) { Move move(pos); move.set_original(board[pos.row][pos.column]); if (TURN == WHITE) { move.add_step(Position(pos.row + 1, pos.column - 1)); move.set_become(pos.row == 6 ? Piece(WHITE_QUEEN) : Piece(WHITE_SIMPLE)); } else { move.add_step(Position(pos.row - 1, pos.column - 1)); move.set_become(pos.row == 1 ? Piece(BLACK_QUEEN) : Piece(BLACK_SIMPLE)); } moves.emplace(std::move(move)); } } for (int i = 0; i < board.piece_count[turn_queen(TURN)]; ++i) { const auto& pos = board.piece_list[turn_queen(TURN)][i]; constexpr int dx[4] = { 1, 1, -1, -1 }, dy[4] = { 1, -1, 1, -1 }; for (size_t dir = 0; dir < 4; ++dir) for (int r = pos.row + dy[dir], c = pos.column + dx[dir]; r < 8 && c < 8 && r >= 0 && c >= 0 && board[r][c].get_type() == PT_EMPTY; r += dy[dir], c += dx[dir]) { Move move(pos); move.add_step(Position(r, c)); move.set_original(board[pos.row][pos.column]); move.set_become(TURN == WHITE ? Piece(WHITE_QUEEN) : Piece(BLACK_QUEEN)); moves.emplace(std::move(move)); } } }