1BSD/s6/cr3.c
#
/*
* cr3 - simulate chuck haley's cr3
* Bill Joy UCB July 1, 1977
*
* This filter simulates chuck haleys cr3,
* stopping output after each page (22 lines) to wait for
* a carriage return, sending 22 more lines, or a EOF, sending 10 more lines.
*
* Typing in a positive number will cause that many lines to be sent,
* a negative number that many lines to be skipped.
*/
#define ECHO 010
int otty[3], ntty[3], ibuf[259];
int left, nxtleft, onintr();
char ch;
extern fout;
main(argc, argv)
int argc;
char *argv[];
{
register c;
fout = dup(1);
gtty(1, otty);
ntty[0] = otty[0];
ntty[1] = otty[1];
ntty[2] = otty[2] &~ ECHO;
signal(2, onintr);
stty(1, ntty);
left = 23;
argc--;
argv++;
do {
if (argc > 0) {
close(0);
if (fopen(argv[0], ibuf) < 0) {
flush();
perror(argv[0]);
flush();
onintr();
}
argc--;
argv++;
}
for (;;) {
c = getc(ibuf);
if (c == -1)
break;
if (left < 0) {
left++;
if (left == 0)
left = nxtleft;
} else {
left--;
if (left == 0) {
flush();
getleft();
}
}
if (left > 0)
putchar(c);
while (c != '\n') {
c = getc(ibuf);
if (c == -1)
goto endfile;
if (left > 0)
putchar(c);
}
}
endfile:
flush();
} while (argc > 0);
stty(1, otty);
exit(0);
}
onintr()
{
signal(2, 1);
stty(1, otty);
exit(1);
}
getleft()
{
int i;
i = number();
if (i == 0) {
left = 22;
return;
}
left = i;
if (i < 0) {
if (ch == '\n')
nxtleft = 11;
else {
i = number();
nxtleft = i == 0 ? 11 : i;
}
}
}
char ch;
number()
{
int i, sign;
i = 0;
sign = 0;
while (read(2, &ch, 1) == 1) {
switch (ch) {
case ' ':
if (sign == 0)
continue;
case '\n':
return (i * sign);
case '-':
sign = -1;
continue;
default:
if (ch < '0' || ch > '9')
continue;
i =* 10;
i =+ ch - '0';
if (sign == 0)
sign = 1;
continue;
}
}
return (11);
}