forward.c revision 05d495417696d1b637b12ffc2c027668de52c7a2
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Copyright (c) 1991, 1993
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * The Regents of the University of California. All rights reserved.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * This code is derived from software contributed to Berkeley by
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Edward Sze-Tyan Wang.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Redistribution and use in source and binary forms, with or without
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * modification, are permitted provided that the following conditions
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * are met:
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * 1. Redistributions of source code must retain the above copyright
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * notice, this list of conditions and the following disclaimer.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * 2. Redistributions in binary form must reproduce the above copyright
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * notice, this list of conditions and the following disclaimer in the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * documentation and/or other materials provided with the distribution.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * 4. Neither the name of the University nor the names of its contributors
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * may be used to endorse or promote products derived from this software
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * without specific prior written permission.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * SUCH DAMAGE.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Solaris porting notes: the original FreeBSD version made use of the
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * BSD kqueue event notification framework; this
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * was changed to use usleep()
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void rlines(FILE *, const char *fn, off_t, struct stat *);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica/* defines for inner loop actions */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * forward -- display the file, from an offset, forward.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * There are eight separate cases for this -- regular and non-regular
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * files, by bytes or lines and from the beginning or end of the file.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * FBYTES byte offset from the beginning of the file
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REG seek
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * NOREG read, counting bytes
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * FLINES line offset from the beginning of the file
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REG read, counting lines
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * NOREG read, counting lines
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * RBYTES byte offset from the end of the file
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REG seek
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * NOREG cyclically read characters into a wrap-around buffer
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * REG mmap the file and step back until reach the correct offset.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * NOREG cyclically read lines into a wrap-around array of buffers
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricaforward(FILE *fp, const char *fn, enum STYLE style, off_t off, struct stat *sbp)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else while (off--)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica for (;;) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica } else if (off == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica else if (off == 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * rlines -- display the last offset lines of the file.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricarlines(FILE *fp, const char *fn, off_t off, struct stat *sbp)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * Last char is special, ignore whether newline or not. Note that
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * size == 0 is dealt with above, and size == 1 sets curoff to -1.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica while (curoff >= 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (curoff < map.mapoff && maparound(&map, curoff) != 0) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* `i' is either the map offset of a '\n', or -1. */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (i >= 0)
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Set the file pointer to reflect the length displayed. */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica if (map.start != NULL && munmap(map.start, map.maplen)) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (0);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica return (1);
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01ricastatic void
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica * follow -- display the file, from an offset, forward.
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica /* Position each of the files */
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica for (;;) {
f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01rica sizeof (struct stat));