home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
OSKBox.lzh
/
MAILBOX
/
CC
/
tail.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-10
|
2KB
|
86 lines
#include <stdio.h>
#include <sgstat.h>
#include <errno.h>
#include <termcap.h>
#define NLINES 64
int nlines;
main (argc, argv)
char *argv[];
{
int f;
char *term_type, *getenv();
if (term_type = getenv ("TERM")) {
char tcapbuf[100], tcbuf[1024], *temp, *p = tcapbuf;
struct sgbuf opt;
if (tgetent (tcbuf, term_type) > 0) {
nlines = min (tgetnum ("li"), NLINES);
}
else
term_type = NULL;
}
else
nlines = 24;
if (argc < 2)
tail (0);
else if ((f = open (argv[1], 1)) < 0)
exit (errno);
else
tail (f);
}
tail (path)
{
struct sgbuf opt;
_gs_opt (path, &opt);
if (opt.sg_class != 1)
scf_tail (path);
else
rbf_tail (path);
}
char lines[NLINES][256];
scf_tail (f)
{
int pos, count, i, len;
for (count = pos = 0; (len = readln (f, lines[pos], 256)) > 0; count++) {
lines[pos][len] = '\0';
pos = (pos + 1) % nlines;
}
if (count < NLINES) pos = 0;
for (i = 0; i < min (count, nlines); i++) {
writeln (1, lines[pos], 256);
pos = (pos + 1) % nlines;
}
}
rbf_tail (f)
{
int i;
long len, pos;
long lines[NLINES];
char buff[256];
len = _gs_size (f);
if ((pos = len - (nlines+1)*80) < 0) pos = 0;
lseek (f, pos, 0);
for (i = 0; i < nlines; i++) lines[i] = -1;
for (i = 0; readln (f, buff, 256); i = (i + 1) % nlines)
lines[i] = _gs_pos (f);
if (i == 0 && lines[i] == -1) return;
do i = (i + 1) % nlines; while (lines[i] == -1);
lseek (f, lines[i], 0);
while (len = readln (f, buff, 256))
writeln (1, buff, len);
}
min (a, b)
{
return ((a < b) ? a : b);
}