add keywords, update to version 4
[unix-history] / usr / src / usr.sbin / lpr / filters / lpf.c
CommitLineData
2d473371 1/* lpf.c 4.3 81/06/02 */
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;
35 for (col=0; col<LINELN; col++) {
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:
47 if (c>=' ') {
48 if (col < LINELN) {
49 if (linebuf[col]=='_') {
50 ov++;
51 ovbuf[col] = '_';
52 }
53 linebuf[col++] = c;
54 if (col > maxcol)
55 maxcol = col;
56 }
57 }
58 continue;
59
60 case ' ':
61 col++;
62 continue;
63
64 case '\t':
65 col = (col|07) + 1;
66 if (col>maxcol)
67 maxcol = col;
68 continue;
69
70 case '\r':
71 col = 0;
72 continue;
73
74 case '_':
75 if (col>=LINELN) {
76 col++;
77 continue;
78 }
79 if (linebuf[col]!=' ') {
80 ovbuf[col] = '_';
81 ov++;
82 } else
83 linebuf[col] = c;
84 col++;
85 if (col>maxcol)
86 maxcol = col;
87 continue;
88
2d473371
SL
89 case '\f':
90 ff = 1; /* force form feed */
3f5fc8d0
BJ
91 case '\n':
92 if (maxcol>=LINELN)
93 maxcol = LINELN;
94 linebuf[maxcol] = 0;
95 return(1);
96
97 case '\b':
98 if (col>0)
99 col--;
100 continue;
101 }
102}
103
104putline()
105{
106 register char *lp, *ep;
107 register int c;
2d473371 108
3f5fc8d0
BJ
109 lp = linebuf;
110 while (c = *lp++)
111 output(c);
112 if (ov) {
113 putchar('\r');
114 for (ep= &ovbuf[LINELN-1]; *ep == 0; ep--)
115 continue;
116 for (lp=ovbuf; lp <= ep; lp++)
117 output(*lp ? *lp : ' ');
118 }
119 putchar('\n');
2d473371
SL
120 if (ff) {
121 ff = 0;
122 putchar('\f');
123 }
3f5fc8d0
BJ
124 if (ferror(stdout))
125 exit(1);
126}
127
128output(c)
129register char c;
130{
131
132 if (c == -1)
133 return;
134 c &= 0177;
135 if (c == 0177)
136 putchar('^'), c = '?';
137 if (c == 033)
138 c = '$';
139 if (c < ' ') switch (c) {
140
141 case '\n':
142 break;
143
144 case '\f':
145 case '\b':
146 case '\t':
147 case '\r':
148 break;
149
150 default:
151 putchar('^');
2d473371 152 c |= 0100;
3f5fc8d0
BJ
153 }
154 putchar(c);
155}