* Copyright (c) 1991 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)read.c 5.1 (Berkeley) 7/21/91";
* 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("%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
if ((lines
= malloc(off
* sizeof(*lines
))) == NULL
)
err("%s", strerror(errno
));
blen
= cnt
= recno
= wrap
= 0;
while ((ch
= getc(fp
)) != EOF
) {
if ((sp
= realloc(sp
, blen
+= 1024)) == NULL
)
err("%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("%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
);