/* Copyright (c) 1979 Regents of the University of California */ #include <retrofit.h> #include <stdio.h> #include <sgtty.h> /* * 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. */ struct sgttyb otty, ntty; int left, nxtleft, onintr(); char ch; char obuf[BUFSIZ]; main(argc, argv) int argc; char *argv[]; { register c; FILE *f; setbuf(stdout, obuf); gtty(1, &otty); gtty(1, &ntty); ntty.sg_flags &= ~ECHO; signal(2, onintr); stty(1, &ntty); left = 23; argc--; argv++; f = stdin; do { if (argc > 0) { close(0); if ((f=fopen(argv[0], "r")) == NULL) { fflush(stdout); perror(argv[0]); fflush(stdout); onintr(); } argc--; argv++; } for (;;) { c = getc(f); if (c == -1) break; if (left < 0) { left++; if (left == 0) left = nxtleft; } else { left--; if (left == 0) { fflush(stdout); getleft(); } } if (left > 0) putchar(c); while (c != '\n') { c = getc(f); if (c == -1) goto endfile; if (left > 0) putchar(c); } fflush(stdout); } endfile: fflush(stdout); } 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); }