put it back, not worth it
[unix-history] / usr / src / usr.sbin / lpr / filters / lpf.c
CommitLineData
fdaeefb7 1/* lpf.c 4.4 83/01/05 */
3f5fc8d0
BJ
2/*
3 * lpf -- Line printer filter: handles underlines for those printers/
4 * device drivers that won't
5 */
6
7#include <stdio.h>
8#include <signal.h>
9
10#define LINELN 132
11
12char linebuf[LINELN+2];
13int ov;
2d473371 14int ff;
3f5fc8d0
BJ
15char ovbuf[LINELN];
16
17main()
18{
19 extern char _sobuf[BUFSIZ];
20
21 setbuf(stdout, _sobuf);
22 while (getline())
23 putline();
24 fflush(stdout);
25 if (ferror(stdout))
26 exit(1);
27 exit(0);
28}
29
30getline()
31{
32 register int col, maxcol, c;
33
34 ov = 0;
fdaeefb7 35 for (col = 0; col < LINELN; col++) {
3f5fc8d0
BJ
36 linebuf[col] = ' ';
37 ovbuf[col] = 0;
38 }
39 col = 0;
40 maxcol = 0;
41 for (;;) switch (c = getchar()) {
42
43 case EOF:
44 return(0);
45
46 default:
fdaeefb7 47 if (c >= ' ') {
3f5fc8d0 48 if (col < LINELN) {
fdaeefb7 49 if (linebuf[col] != ' ') {
3f5fc8d0 50 ov++;
fdaeefb7
BJ
51 ovbuf[col] = c;
52 } else
53 linebuf[col] = c;
54 if (++col > maxcol)
3f5fc8d0
BJ
55 maxcol = col;
56 }
57 }
58 continue;
59
60 case ' ':
61 col++;
62 continue;
63
64 case '\t':
65 col = (col|07) + 1;
fdaeefb7 66 if (col > maxcol)
3f5fc8d0
BJ
67 maxcol = col;
68 continue;
69
70 case '\r':
71 col = 0;
72 continue;
73
2d473371
SL
74 case '\f':
75 ff = 1; /* force form feed */
3f5fc8d0 76 case '\n':
fdaeefb7 77 if (maxcol >= LINELN)
3f5fc8d0
BJ
78 maxcol = LINELN;
79 linebuf[maxcol] = 0;
80 return(1);
81
82 case '\b':
fdaeefb7 83 if (col > 0)
3f5fc8d0
BJ
84 col--;
85 continue;
86 }
87}
88
89putline()
90{
fdaeefb7 91 register char c, *lp;
2d473371 92
3f5fc8d0
BJ
93 lp = linebuf;
94 while (c = *lp++)
95 output(c);
96 if (ov) {
97 putchar('\r');
fdaeefb7
BJ
98 lp = ovbuf;
99 while (ov) {
100 if (c = *lp++) {
101 output(c);
102 ov--;
103 } else
104 output(' ');
105 }
3f5fc8d0
BJ
106 }
107 putchar('\n');
2d473371
SL
108 if (ff) {
109 ff = 0;
110 putchar('\f');
111 }
3f5fc8d0
BJ
112 if (ferror(stdout))
113 exit(1);
114}
115
116output(c)
117register char c;
118{
119
120 if (c == -1)
121 return;
122 c &= 0177;
123 if (c == 0177)
124 putchar('^'), c = '?';
125 if (c == 033)
126 c = '$';
127 if (c < ' ') switch (c) {
128
129 case '\n':
130 break;
131
132 case '\f':
133 case '\b':
134 case '\t':
135 case '\r':
136 break;
137
138 default:
139 putchar('^');
2d473371 140 c |= 0100;
3f5fc8d0
BJ
141 }
142 putchar(c);
143}