Skip wrapped lines in top level search loop because they will be

combined in the inner loop (in window_copy_search_rl_regex and the
others), avoids searching the same text multiple times. Also add a line
length limit for regex searches. GitHub issue 3675.
This commit is contained in:
nicm 2023-09-04 08:01:43 +00:00
parent c767d62329
commit 43e5e80343

View File

@ -295,6 +295,7 @@ struct window_copy_mode_data {
int timeout; /* search has timed out */ int timeout; /* search has timed out */
#define WINDOW_COPY_SEARCH_TIMEOUT 10000 #define WINDOW_COPY_SEARCH_TIMEOUT 10000
#define WINDOW_COPY_SEARCH_ALL_TIMEOUT 200 #define WINDOW_COPY_SEARCH_ALL_TIMEOUT 200
#define WINDOW_COPY_SEARCH_MAX_LINE 2000
int jumptype; int jumptype;
struct utf8_data *jumpchar; struct utf8_data *jumpchar;
@ -3205,7 +3206,9 @@ window_copy_search_lr_regex(struct grid *gd, u_int *ppx, u_int *psx, u_int py,
len = gd->sx - first; len = gd->sx - first;
endline = gd->hsize + gd->sy - 1; endline = gd->hsize + gd->sy - 1;
pywrap = py; pywrap = py;
while (buf != NULL && pywrap <= endline) { while (buf != NULL &&
pywrap <= endline &&
len < WINDOW_COPY_SEARCH_MAX_LINE) {
gl = grid_get_line(gd, pywrap); gl = grid_get_line(gd, pywrap);
if (~gl->flags & GRID_LINE_WRAPPED) if (~gl->flags & GRID_LINE_WRAPPED)
break; break;
@ -3262,7 +3265,9 @@ window_copy_search_rl_regex(struct grid *gd, u_int *ppx, u_int *psx, u_int py,
len = gd->sx - first; len = gd->sx - first;
endline = gd->hsize + gd->sy - 1; endline = gd->hsize + gd->sy - 1;
pywrap = py; pywrap = py;
while (buf != NULL && (pywrap <= endline)) { while (buf != NULL &&
pywrap <= endline &&
len < WINDOW_COPY_SEARCH_MAX_LINE) {
gl = grid_get_line(gd, pywrap); gl = grid_get_line(gd, pywrap);
if (~gl->flags & GRID_LINE_WRAPPED) if (~gl->flags & GRID_LINE_WRAPPED)
break; break;
@ -3605,6 +3610,7 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
int found = 0, cflags = REG_EXTENDED; int found = 0, cflags = REG_EXTENDED;
char *sbuf; char *sbuf;
regex_t reg; regex_t reg;
struct grid_line *gl;
if (regex) { if (regex) {
sbuf = xmalloc(ssize); sbuf = xmalloc(ssize);
@ -3621,6 +3627,9 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
if (direction) { if (direction) {
for (i = fy; i <= endline; i++) { for (i = fy; i <= endline; i++) {
gl = grid_get_line(gd, i);
if (i != endline && gl->flags & GRID_LINE_WRAPPED)
continue;
if (regex) { if (regex) {
found = window_copy_search_lr_regex(gd, found = window_copy_search_lr_regex(gd,
&px, &sx, i, fx, gd->sx, &reg); &px, &sx, i, fx, gd->sx, &reg);
@ -3634,6 +3643,9 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
} }
} else { } else {
for (i = fy + 1; endline < i; i--) { for (i = fy + 1; endline < i; i--) {
gl = grid_get_line(gd, i - 1);
if (i != endline && gl->flags & GRID_LINE_WRAPPED)
continue;
if (regex) { if (regex) {
found = window_copy_search_rl_regex(gd, found = window_copy_search_rl_regex(gd,
&px, &sx, i - 1, 0, fx + 1, &reg); &px, &sx, i - 1, 0, fx + 1, &reg);