mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	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:
		@@ -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;
 | 
				
			||||||
@@ -3601,10 +3606,11 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd,
 | 
				
			|||||||
    struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap,
 | 
					    struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap,
 | 
				
			||||||
    int direction, int regex)
 | 
					    int direction, int regex)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_int	 i, px, sx, ssize = 1;
 | 
						u_int			 i, px, sx, ssize = 1;
 | 
				
			||||||
	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, ®);
 | 
									    &px, &sx, i, fx, gd->sx, ®);
 | 
				
			||||||
@@ -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, ®);
 | 
									    &px, &sx, i - 1, 0, fx + 1, ®);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user