From 9117ebebef20693db695222e8b4fabc3af57f82b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 18 Apr 2022 12:31:07 +0200 Subject: [PATCH] =?UTF-8?q?search:=20find=5Fnext():=20pass=20an=20?= =?UTF-8?q?=E2=80=98end=E2=80=99=20coord,=20instead=20of=20a=20row=20count?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- search.c | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/search.c b/search.c index 3b6f85bf..c87f7f39 100644 --- a/search.c +++ b/search.c @@ -295,7 +295,7 @@ matches_cell(const struct terminal *term, const struct cell *cell, size_t search static bool find_next(struct terminal *term, enum search_direction direction, - struct coord abs_start, int row_count, struct range *match) + struct coord abs_start, struct coord abs_end, struct range *match) { #define ROW_DEC(_r) ((_r) = ((_r) - 1 + grid->num_rows) & (grid->num_rows - 1)) #define ROW_INC(_r) ((_r) = ((_r) + 1) & (grid->num_rows - 1)) @@ -305,6 +305,14 @@ find_next(struct terminal *term, enum search_direction direction, int start_row = abs_start.row; int start_col = abs_start.col; + /* TODO: fixme */ + int row_count = backward + ? abs_start.row - abs_end.row + : abs_end.row - abs_start.row; + + if (row_count <= 0) + row_count += grid->num_rows; + for (size_t r = 0; r < row_count; backward ? ROW_DEC(start_row) : ROW_INC(start_row), r++) @@ -413,8 +421,24 @@ search_find_next(struct terminal *term) backward ? "backward" : "forward", start.row, start.col, grid->offset, grid->view); + struct coord end = start; + if (backward) { + /* Search backards, until we reach the cell *after* current start */ + if (++end.col >= term->cols) { + end.col = 0; + end.row++; + } + } else { + /* Search forward, until we reach the cell *before* current start */ + if (--end.col < 0) { + end.col = term->cols - 1; + end.row += grid->num_rows - 1; + } + } + end.row &= grid->num_rows - 1; + struct range match; - bool found = find_next(term, direction, start, grid->num_rows, &match); + bool found = find_next(term, direction, start, end, &match); if (found) { LOG_DBG("primary match found at %dx%d", @@ -463,9 +487,11 @@ search_matches_next(struct search_match_iterator *iter) struct coord abs_start = iter->start; abs_start.row = grid_row_absolute_in_view(grid, abs_start.row); - found = find_next( - term, SEARCH_FORWARD, abs_start, - term->rows - iter->start.row, &match); + struct coord abs_end = { + term->cols - 1, + grid_row_absolute_in_view(grid, term->rows - 1)}; + + found = find_next(term, SEARCH_FORWARD, abs_start, abs_end, &match); } if (found) {