From 853ad681620e9a031f41549a39c78d11b2da8990 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 25 Jun 2009 16:02:37 +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 | 14 +++++++++++++- grid.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- tmux.h | 4 +++- window.c | 53 ++++++++++++++++------------------------------------- 4 files changed, 79 insertions(+), 40 deletions(-) diff --git a/grid-view.c b/grid-view.c index c6a56af8..77becddd 100644 --- a/grid-view.c +++ b/grid-view.c @@ -1,4 +1,4 @@ -/* $Id: grid-view.c,v 1.11 2009-03-28 20:17:29 nicm Exp $ */ +/* $OpenBSD: grid-view.c,v 1.2 2009/06/24 22:04:18 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -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 0d8adb8a..2512a847 100644 --- a/grid.c +++ b/grid.c @@ -1,4 +1,4 @@ -/* $Id: grid.c,v 1.16 2009-05-04 17:58:26 nicm Exp $ */ +/* $OpenBSD: grid.c,v 1.3 2009/06/24 22:04:18 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -494,4 +494,50 @@ grid_move_cells(struct grid *gd, u_int dx, u_int px, u_int py, u_int nx) } } +/* 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 eac4df76..7946f424 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.8 2009/06/24 16:01:02 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.9 2009/06/24 22:04:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1448,6 +1448,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); @@ -1469,6 +1470,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 c1bab68b..568c1342 100644 --- a/window.c +++ b/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.3 2009/06/23 20:17:30 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.4 2009/06/24 22:04:18 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -604,42 +604,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); }