2c38703677b8a6e076a1a581500fd526ee732c83
* 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
[] = "@(#)forward.c 5.6 (Berkeley) %G%";
static void rlines
__P((FILE *, long, struct stat
*));
* forward -- display the file, from an offset, forward.
* There are eight separate cases for this -- regular and non-regular
* files, by bytes or lines and from the beginning or end of the file.
* FBYTES byte offset from the beginning of the file
* NOREG read, counting bytes
* FLINES line offset from the beginning of the file
* REG read, counting lines
* NOREG read, counting lines
* RBYTES byte offset from the end of the file
* NOREG cyclically read characters into a wrap-around buffer
* REG mmap the file and step back until reach the correct offset.
* NOREG cyclically read lines into a wrap-around array of buffers
forward(fp
, style
, off
, sbp
)
if (S_ISREG(sbp
->st_mode
)) {
if (fseek(fp
, off
, SEEK_SET
) == -1) {
if ((ch
= getc(fp
)) == EOF
) {
if ((ch
= getc(fp
)) == EOF
) {
if (ch
== '\n' && !--off
)
if (S_ISREG(sbp
->st_mode
)) {
if (sbp
->st_size
>= off
&&
fseek(fp
, -off
, SEEK_END
) == -1) {
if (S_ISREG(sbp
->st_mode
))
if (fseek(fp
, 0L, SEEK_END
) == -1) {
* We pause for one second after displaying any data that has
* accumulated since we read the file.
while ((ch
= getc(fp
)) != EOF
)
/* Sleep(3) is eight system calls. Do it fast. */
if (select(0, &zero
, &zero
, &zero
, &second
) == -1)
err(1, "select: %s", strerror(errno
));
* rlines -- display the last offset lines of the file.
if (!(size
= sbp
->st_size
))
size
, PROT_READ
, MAP_FILE
, fileno(fp
), (off_t
)0)) == (caddr_t
)-1) {
err(0, "%s", strerror(errno
));
/* Last char is special, ignore whether newline or not. */
for (p
+= size
- 1; --size
;)
if (*--p
== '\n' && !--off
) {
/* Set the file pointer to reflect the length displayed. */
size
= sbp
->st_size
- size
;
if (fseek(fp
, sbp
->st_size
, SEEK_SET
) == -1) {