globbing of local file names & mget and mput (ugly, needs more work)
[unix-history] / usr / src / usr.sbin / lpr / filters / lpf.c
CommitLineData
8f85bfee
RC
1/* lpf.c 4.5 83/02/10
2 * filter which reads the output of nroff and converts lines
3 * with ^H's to overwritten lines. Thus this works like 'ul'
4 * but is much better: it can handle more than 2 overwrites
5 * and it is written with some style.
6 * modified by kls to use register references instead of arrays
7 * to try to gain a little speed.
3f5fc8d0 8 */
3f5fc8d0
BJ
9#include <stdio.h>
10#include <signal.h>
11
8f85bfee
RC
12#define MAXWIDTH 132
13#define MAXREP 10
3f5fc8d0 14
8f85bfee
RC
15char buf[MAXREP][MAXWIDTH];
16int maxcol[MAXREP] = {-1};
3f5fc8d0
BJ
17
18main()
19{
8f85bfee
RC
20 register FILE *p = stdin, *o = stdout;
21 register int i, col;
22 register char *cp;
23 int done, linedone, maxrep;
24 char ch, *limit;
25
26 for (cp = buf[0], limit = buf[MAXREP]; cp < limit; *cp++ = ' ');
27 done = 0;
28
29 while (!done) {
30 col = 0;
31 maxrep = 0;
32 linedone = 0;
33 while (!linedone) {
34 switch (ch = getc(p)) {
35 case EOF:
36 linedone = done = 1;
37 ch = '\n';
38 break;
39
40 case '\031':
41 fflush(stdout);
42 kill(getpid(), SIGSTOP);
43 break;
44
45 case '\f':
46 case '\n':
47 linedone = 1;
48 break;
49
50 case '\b':
51 if (col-- < 0)
52 col = 0;
53 break;
54
55 case '\r':
56 col = 0;
57 break;
58
59 case '\t':
60 col = (col | 07) + 1;
61 break;
62
63 default:
64 if (col >= MAXWIDTH)
65 break;
66 cp = &buf[0][col];
67 for (i = 0; i < MAXREP; i++) {
68 if (i > maxrep)
69 maxrep = i;
70 if (*cp == ' ') {
71 *cp = ch;
72 if (col > maxcol[i])
73 maxcol[i] = col;
74 break;
75 }
76 cp += MAXWIDTH;
77 }
78 col++;
79 break;
3f5fc8d0
BJ
80 }
81 }
3f5fc8d0 82
8f85bfee
RC
83 /* print out lines */
84 for (i = 0; i <= maxrep; i++) {
85 for (cp = buf[i], limit = cp+maxcol[i]; cp <= limit;) {
86 putc(*cp, o);
87 *cp++ = ' ';
88 }
89 if (i < maxrep)
90 putc('\r', o);
91 else
92 putc(ch, o);
93 maxcol[i] = -1;
fdaeefb7 94 }
3f5fc8d0 95 }
3f5fc8d0 96}