vi: allow backward search to specify line address
It should be possible to use a backward search as a line address in colon commands. function old new delta colon 3661 3701 +40 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 40/0) Total: 40 bytes Signed-off-by: Ron Yorston <rmy@pobox.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							d488def0e4
						
					
				
				
					commit
					47f78913f7
				
			
							
								
								
									
										21
									
								
								editors/vi.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								editors/vi.c
									
									
									
									
									
								
							@@ -2346,9 +2346,9 @@ static char *get_one_address(char *p, int *addr)	// get colon addr, if present
 | 
			
		||||
{
 | 
			
		||||
	int st;
 | 
			
		||||
# if ENABLE_FEATURE_VI_YANKMARK || ENABLE_FEATURE_VI_SEARCH
 | 
			
		||||
	char *q;
 | 
			
		||||
	char *q, c;
 | 
			
		||||
# endif
 | 
			
		||||
	IF_FEATURE_VI_YANKMARK(char c;)
 | 
			
		||||
	IF_FEATURE_VI_SEARCH(int dir;)
 | 
			
		||||
 | 
			
		||||
	*addr = -1;			// assume no addr
 | 
			
		||||
	if (*p == '.') {	// the current line
 | 
			
		||||
@@ -2372,18 +2372,25 @@ static char *get_one_address(char *p, int *addr)	// get colon addr, if present
 | 
			
		||||
	}
 | 
			
		||||
# endif
 | 
			
		||||
# if ENABLE_FEATURE_VI_SEARCH
 | 
			
		||||
	else if (*p == '/') {	// a search pattern
 | 
			
		||||
		q = strchrnul(p + 1, '/');
 | 
			
		||||
	else if (*p == '/' || *p == '?') {	// a search pattern
 | 
			
		||||
		c = *p;
 | 
			
		||||
		q = strchrnul(p + 1, c);
 | 
			
		||||
		if (p + 1 != q) {
 | 
			
		||||
			// save copy of new pattern
 | 
			
		||||
			free(last_search_pattern);
 | 
			
		||||
			last_search_pattern = xstrndup(p, q - p);
 | 
			
		||||
		}
 | 
			
		||||
		p = q;
 | 
			
		||||
		if (*p == '/')
 | 
			
		||||
		if (*p == c)
 | 
			
		||||
			p++;
 | 
			
		||||
		q = char_search(next_line(dot), last_search_pattern + 1,
 | 
			
		||||
						(FORWARD << 1) | FULL);
 | 
			
		||||
		if (c == '/') {
 | 
			
		||||
			q = next_line(dot);
 | 
			
		||||
			dir = (FORWARD << 1) | FULL;
 | 
			
		||||
		} else {
 | 
			
		||||
			q = begin_line(dot);
 | 
			
		||||
			dir = ((unsigned)BACK << 1) | FULL;
 | 
			
		||||
		}
 | 
			
		||||
		q = char_search(q, last_search_pattern + 1, dir);
 | 
			
		||||
		if (q == NULL)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		*addr = count_lines(text, q);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user