Handle explicitly the case of line 0
Line 0 is a special line added to allow operations with empty buffers, and we have to ensure that it is not going to match any regular expression. The code was written in a way that this case was handle implicitily, but this solution was working only for the first file loaded in ed, while the second file loaded in ed got a line with a dirty seek field. This solution check explicitily against invalid lines passed to makeline(), which allows to simplify the common case.
This commit is contained in:
		
				
					committed by
					
						
						sin
					
				
			
			
				
	
			
			
			
						parent
						
							0fb1c6fd60
						
					
				
				
					commit
					78fd6ff239
				
			
							
								
								
									
										31
									
								
								ed.c
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								ed.c
									
									
									
									
									
								
							@@ -167,20 +167,20 @@ makeline(char *s, int *off)
 | 
			
		||||
	}
 | 
			
		||||
	lp = zero + lastidx;
 | 
			
		||||
 | 
			
		||||
	while ((c = *s) && *s != '\n')
 | 
			
		||||
		++s;
 | 
			
		||||
	if (c == '\n')
 | 
			
		||||
		++s;
 | 
			
		||||
	len = s - begin;
 | 
			
		||||
	if (!s) {
 | 
			
		||||
		lp->seek = -1;
 | 
			
		||||
		len = 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		while ((c = *s++) != '\n')
 | 
			
		||||
			/* nothing */;
 | 
			
		||||
		len = s - begin;
 | 
			
		||||
		if ((lp->seek = lseek(scratch, 0, SEEK_END)) < 0 ||
 | 
			
		||||
		    write(scratch, begin, len) < 0) {
 | 
			
		||||
			error("input/output error");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (off)
 | 
			
		||||
		*off = len;
 | 
			
		||||
 | 
			
		||||
	if (len > 0)
 | 
			
		||||
	if ((lp->seek = lseek(scratch, 0, SEEK_END)) < 0 ||
 | 
			
		||||
	    write(scratch, begin, len) < 0) {
 | 
			
		||||
		error("input/output error");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	++lastidx;
 | 
			
		||||
	return lp - zero;
 | 
			
		||||
}
 | 
			
		||||
@@ -208,8 +208,11 @@ gettxt(int line)
 | 
			
		||||
	char *p;
 | 
			
		||||
 | 
			
		||||
	lp = zero + getindex(line);
 | 
			
		||||
	off = lp->seek;
 | 
			
		||||
	sizetxt = 0;
 | 
			
		||||
	off = lp->seek;
 | 
			
		||||
 | 
			
		||||
	if (off == (off_t) -1)
 | 
			
		||||
		return text = addchar('\0', text, &memtxt, &sizetxt);
 | 
			
		||||
 | 
			
		||||
repeat:
 | 
			
		||||
	if (!csize || off < lasto || off - lasto >= csize) {
 | 
			
		||||
@@ -339,7 +342,7 @@ setscratch()
 | 
			
		||||
		error("scratch filename too long");
 | 
			
		||||
	if ((scratch = mkstemp(tmpname)) < 0)
 | 
			
		||||
		error("failed to create scratch file");
 | 
			
		||||
	if ((k = makeline("", NULL)))
 | 
			
		||||
	if ((k = makeline(NULL, NULL)))
 | 
			
		||||
		error("input/output error in scratch file");
 | 
			
		||||
	relink(k, k, k, k);
 | 
			
		||||
	clearundo();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user