* Copyright (c) 1991 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)read.c 5.3 (Berkeley) %G%";
* bytes -- read bytes to an offset from the end and display.
* This is the function that reads to a byte offset from the end of the input,
* storing the data in a wrap-around buffer which is then displayed. If the
* rflag is set, the data is displayed in lines in reverse order, and this
* routine has the usual nastiness of trying to find the newlines. Otherwise,
* it is displayed from the character closest to the beginning of the input to
register int ch
, len
, tlen
;
register char *ep
, *p
, *t
;
if ((sp
= p
= malloc(off
)) == NULL
)
err(1, "%s", strerror(errno
));
for (wrap
= 0, ep
= p
+ off
; (ch
= getc(fp
)) != EOF
;) {
for (t
= p
- 1, len
= 0; t
>= sp
; --t
, ++len
)
for (t
= ep
- 1, len
= 0; t
>= p
; --t
, ++len
)
if (wrap
&& (len
= ep
- p
))
* lines -- read lines to an offset from the end and display.
* This is the function that reads to a line offset from the end of the input,
* storing the data in an array of buffers which is then displayed. If the
* rflag is set, the data is displayed in lines in reverse order, and this
* routine has the usual nastiness of trying to find the newlines. Otherwise,
* it is displayed from the line closest to the beginning of the input to
int blen
, cnt
, recno
, wrap
;
if ((lines
= malloc(off
* sizeof(*lines
))) == NULL
)
err(1, "%s", strerror(errno
));
blen
= cnt
= recno
= wrap
= 0;
while ((ch
= getc(fp
)) != EOF
) {
if ((sp
= realloc(sp
, blen
+= 1024)) == NULL
)
err(1, "%s", strerror(errno
));
if (lines
[recno
].blen
< cnt
) {
lines
[recno
].blen
= cnt
+ 256;
if ((lines
[recno
].l
= realloc(lines
[recno
].l
,
lines
[recno
].blen
)) == NULL
)
err(1, "%s", strerror(errno
));
bcopy(sp
, lines
[recno
].l
, lines
[recno
].len
= cnt
);
for (cnt
= recno
- 1; cnt
>= 0; --cnt
)
WR(lines
[cnt
].l
, lines
[cnt
].len
);
for (cnt
= off
- 1; cnt
>= recno
; --cnt
)
WR(lines
[cnt
].l
, lines
[cnt
].len
);
for (cnt
= recno
; cnt
< off
; ++cnt
)
WR(lines
[cnt
].l
, lines
[cnt
].len
);
for (cnt
= 0; cnt
< recno
; ++cnt
)
WR(lines
[cnt
].l
, lines
[cnt
].len
);