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:
Roberto E. Vargas Caballero 2016-01-06 22:04:29 +01:00 committed by sin
parent 0fb1c6fd60
commit 78fd6ff239

25
ed.c
View File

@ -167,20 +167,20 @@ makeline(char *s, int *off)
}
lp = zero + lastidx;
while ((c = *s) && *s != '\n')
++s;
if (c == '\n')
++s;
if (!s) {
lp->seek = -1;
len = 0;
} else {
while ((c = *s++) != '\n')
/* nothing */;
len = s - begin;
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");
}
}
if (off)
*off = len;
++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();