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:
parent
0fb1c6fd60
commit
78fd6ff239
31
ed.c
31
ed.c
@ -167,20 +167,20 @@ makeline(char *s, int *off)
|
|||||||
}
|
}
|
||||||
lp = zero + lastidx;
|
lp = zero + lastidx;
|
||||||
|
|
||||||
while ((c = *s) && *s != '\n')
|
if (!s) {
|
||||||
++s;
|
lp->seek = -1;
|
||||||
if (c == '\n')
|
len = 0;
|
||||||
++s;
|
} else {
|
||||||
len = s - begin;
|
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)
|
if (off)
|
||||||
*off = len;
|
*off = len;
|
||||||
|
|
||||||
if (len > 0)
|
|
||||||
if ((lp->seek = lseek(scratch, 0, SEEK_END)) < 0 ||
|
|
||||||
write(scratch, begin, len) < 0) {
|
|
||||||
error("input/output error");
|
|
||||||
}
|
|
||||||
|
|
||||||
++lastidx;
|
++lastidx;
|
||||||
return lp - zero;
|
return lp - zero;
|
||||||
}
|
}
|
||||||
@ -208,8 +208,11 @@ gettxt(int line)
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
lp = zero + getindex(line);
|
lp = zero + getindex(line);
|
||||||
off = lp->seek;
|
|
||||||
sizetxt = 0;
|
sizetxt = 0;
|
||||||
|
off = lp->seek;
|
||||||
|
|
||||||
|
if (off == (off_t) -1)
|
||||||
|
return text = addchar('\0', text, &memtxt, &sizetxt);
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
if (!csize || off < lasto || off - lasto >= csize) {
|
if (!csize || off < lasto || off - lasto >= csize) {
|
||||||
@ -339,7 +342,7 @@ setscratch()
|
|||||||
error("scratch filename too long");
|
error("scratch filename too long");
|
||||||
if ((scratch = mkstemp(tmpname)) < 0)
|
if ((scratch = mkstemp(tmpname)) < 0)
|
||||||
error("failed to create scratch file");
|
error("failed to create scratch file");
|
||||||
if ((k = makeline("", NULL)))
|
if ((k = makeline(NULL, NULL)))
|
||||||
error("input/output error in scratch file");
|
error("input/output error in scratch file");
|
||||||
relink(k, k, k, k);
|
relink(k, k, k, k);
|
||||||
clearundo();
|
clearundo();
|
||||||
|
Loading…
Reference in New Issue
Block a user