From 096cbf2ea558c0f66ee7bdaa8316e85c3e55ee69 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 24 Jun 2009 22:04:18 +0000 Subject: [PATCH] Add a dedicated function to convert a line into a string and use it to simplify the search window function. --- grid-view.c | 12 ++++++++++++ grid.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ tmux.h | 2 ++ window.c | 51 +++++++++++++++------------------------------------ 4 files changed, 75 insertions(+), 36 deletions(-) diff --git a/grid-view.c b/grid-view.c index f1224bf6..75dc686a 100644 --- a/grid-view.c +++ b/grid-view.c @@ -209,3 +209,15 @@ grid_view_delete_cells(struct grid *gd, u_int px, u_int py, u_int nx) grid_move_cells(gd, px, px + nx, py, (sx - 1) - (px + nx)); } + +/* Convert cells into a string. */ +char * +grid_view_string_cells(struct grid *gd, u_int px, u_int py, u_int nx) +{ + GRID_DEBUG(gd, "px=%u, py=%u, nx=%u", px, py, nx); + + px = grid_view_x(gd, px); + py = grid_view_y(gd, py); + + return (grid_string_cells(gd, px, py, nx)); +} diff --git a/grid.c b/grid.c index 71761afe..01bf7719 100644 --- a/grid.c +++ b/grid.c @@ -493,3 +493,49 @@ grid_move_cells(struct grid *gd, u_int dx, u_int px, u_int py, u_int nx) grid_put_cell(gd, xx, py, &grid_default_cell); } } + +/* Convert cells into a string. */ +char * +grid_string_cells(struct grid *gd, u_int px, u_int py, u_int nx) +{ + const struct grid_cell *gc; + const struct grid_utf8 *gu; + char *buf; + size_t len, off; + u_int xx; + + GRID_DEBUG(gd, "px=%u, py=%u, nx=%u", px, py, nx); + + len = 128; + buf = xmalloc(len); + off = 0; + + for (xx = px; xx < px + nx; xx++) { + gc = grid_peek_cell(gd, xx, py); + if (gc->flags & GRID_FLAG_PADDING) + continue; + + if (gc->flags & GRID_FLAG_UTF8) { + while (len < off + UTF8_SIZE + 1) { + buf = xrealloc(buf, 2, len); + len *= 2; + } + + gu = grid_peek_utf8(gd, xx, py); + memcpy(buf + off, gu->data, UTF8_SIZE); + off += UTF8_SIZE; + while (off > 0 && ((u_char) buf[off]) == 0xff) + off--; + } else { + while (len < off + 2) { + buf = xrealloc(buf, 2, len); + len *= 2; + } + + buf[off++] = gc->data; + } + } + + buf[off] = '\0'; + return (buf); +} diff --git a/tmux.h b/tmux.h index 2052b498..0bab2804 100644 --- a/tmux.h +++ b/tmux.h @@ -1327,6 +1327,7 @@ void grid_clear_lines(struct grid *, u_int, u_int); void grid_move_lines(struct grid *, u_int, u_int, u_int); void grid_clear_cells(struct grid *, u_int, u_int, u_int); void grid_move_cells(struct grid *, u_int, u_int, u_int, u_int); +char *grid_string_cells(struct grid *, u_int, u_int, u_int); /* grid-view.c */ const struct grid_cell *grid_view_peek_cell(struct grid *, u_int, u_int); @@ -1348,6 +1349,7 @@ void grid_view_delete_lines_region( struct grid *, u_int, u_int, u_int, u_int); void grid_view_insert_cells(struct grid *, u_int, u_int, u_int); void grid_view_delete_cells(struct grid *, u_int, u_int, u_int); +char *grid_view_string_cells(struct grid *, u_int, u_int, u_int); /* screen-write.c */ void screen_write_start( diff --git a/window.c b/window.c index b3dcd0f1..91606f53 100644 --- a/window.c +++ b/window.c @@ -590,42 +590,21 @@ window_pane_mouse( char * window_pane_search(struct window_pane *wp, const char *searchstr) { - const struct grid_cell *gc; - const struct grid_utf8 *gu; - char *buf, *s; - size_t off; - u_int i, j, k; + struct screen *s = &wp->base; + char *line, *ptr; + u_int i; - buf = xmalloc(1); - - for (j = 0; j < screen_size_y(&wp->base); j++) { - off = 0; - for (i = 0; i < screen_size_x(&wp->base); i++) { - gc = grid_view_peek_cell(wp->base.grid, i, j); - if (gc->flags & GRID_FLAG_UTF8) { - gu = grid_view_peek_utf8(wp->base.grid, i, j); - buf = xrealloc(buf, 1, off + 8); - for (k = 0; k < UTF8_SIZE; k++) { - if (gu->data[k] == 0xff) - break; - buf[off++] = gu->data[k]; - } - } else { - buf = xrealloc(buf, 1, off + 1); - buf[off++] = gc->data; - } - } - while (off > 0 && buf[off - 1] == ' ') - off--; - buf[off] = '\0'; - - if ((s = strstr(buf, searchstr)) != NULL) { - s = section_string(buf, off, s - buf, 40); - xfree(buf); - return (s); - } + ptr = NULL; + for (i = 0; i < screen_size_y(s); i++) { + line = grid_view_string_cells(s->grid, 0, i, screen_size_x(s)); + log_debug("XXX %s", line); + if ((ptr = strstr(line, searchstr)) != NULL) + break; + xfree(line); } - - xfree(buf); - return (NULL); + if (ptr != NULL) { + ptr = section_string(line, strlen(ptr), ptr - line, 40); + xfree(line); + } + return (ptr); }