BSD 1 development
[unix-history] / s6 / iul.c
CommitLineData
987467a7
BJ
1#
2#define BACKSPACE 0
3#define UPPERCASE 0
4#define QUOTE 0200
5/*
6 * iul - a cat like program to indicate underlining for graphic terminals
7 *
8 * Bill Joy UCB June 22, 1977
9 *
10 * This program is actually a piece of the editor ex.
11 */
12
13#define LBSIZE 512
14
15char linebuf[LBSIZE], genbuf[LBSIZE];
16int ibuf[259];
17extern int fout;
18
19main(argc, argv)
20 int argc;
21 char *argv[];
22{
23 register c;
24 register char *lp;
25
26 fout = dup(1);
27 argc--;
28 argv++;
29 do {
30 if (argc > 0) {
31 close(ibuf[0]);
32 if (fopen(argv[0], ibuf) < 0) {
33 perror(argv[0]);
34 flush();
35 exit(1);
36 }
37 argc--;
38 argv++;
39 }
40 lp = linebuf;
41 for (;;) {
42 c = getc(ibuf);
43 if (c < 0)
44 break;
45 if (c == '\n') {
46 *lp = 0;
47 doulg();
48 dographic();
49 if (genbuf[0])
50 printf("\n%s", genbuf);
51 putchar('\n');
52 lp = linebuf;
53 continue;
54 }
55 if (lp >= &linebuf[LBSIZE - 2]) {
56 flush();
57 printf("Input line exceeds 500 characters\n");
58 flush();
59 exit(1);
60 }
61 *lp++ = c;
62 }
63 flush();
64 } while (argc > 0);
65 flush();
66}
67
68dographic()
69{
70 register char *lp;
71 register c;
72
73 for (lp = linebuf; c = *lp++;) {
74 switch (c) {
75 case '\b':
76 if (BACKSPACE == 0)
77 c = '?';
78 break;
79 default:
80 if (c < ' ' || c == 0177)
81 c = '?';
82/*
83 else if (UPPERCASE && ucletter(c)) {
84 putchar('\\');
85 c = letter(c);
86 }
87*/
88 break;
89 case '\t':
90 break;
91 }
92 putchar(c);
93 }
94}
95
96doulg()
97{
98 register char *lp, *gp;
99 char *maxgp;
100 register c;
101 char csw;
102 int col;
103
104 gp = genbuf;
105 *gp = 0;
106 maxgp = gp;
107 col = 0;
108 for (lp = linebuf; c = *lp++;) {
109 switch (c) {
110 case '\t':
111 while ((col & 7) != 7) {
112 *gp++ = ' ';
113 if (gp >= &genbuf[LBSIZE - 2])
114 goto ovflo;
115 col++;
116 }
117 break;
118 default:
119 if (gp >= maxgp)
120 break;
121 c =| (*gp & QUOTE);
122 break;
123 case '_':
124 if (gp >= maxgp)
125 c = QUOTE;
126 else
127 c = *gp | QUOTE;
128 break;
129 case '\b':
130 if (gp > genbuf) {
131 gp--;
132 col--;
133 }
134 continue;
135 }
136 if (gp >= &genbuf[LBSIZE - 2]) {
137ovflo:
138 flush();
139 printf("Line too long for this filter\n");
140 flush();
141 exit(1);
142 }
143 *gp++ = c;
144 if (gp > maxgp)
145 maxgp = gp;
146 col++;
147 }
148 *maxgp = 0;
149 strcpy(linebuf, genbuf);
150 for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
151 if (c & QUOTE) {
152 c =& 0177;
153 if (c == 0)
154 *lp = '_', *gp = ' ';
155 else
156 *lp = c, *gp = '-';
157 } else
158 *gp = ' ';
159 --gp;
160 while (gp >= genbuf && *gp == ' ')
161 --gp;
162 gp[1] = 0;
163}
164
165strcpy(oto, from)
166 char *oto;
167 register char *from;
168{
169 register char *to;
170
171 to = oto;
172 while (*to++ = *from++)
173 continue;
174 return (oto);
175}