BSD 3 development
[unix-history] / .ref-BSD-2 / src / iul.c
CommitLineData
cc6679ee
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#include <stdio.h>
3
4#define BACKSPACE 0
5#define QUOTE 0200
6/*
7 * iul - a cat like program to indicate underlining for graphic terminals
8 *
9 * Bill Joy UCB June 22, 1977
10 *
11 * This program was a piece of the editor ex.
12 */
13
14#define LBSIZE 512
15
16char linebuf[LBSIZE], genbuf[LBSIZE];
17char *strcpy();
18
19main(argc, argv)
20 int argc;
21 char *argv[];
22{
23 register c;
24 register char *lp;
25 char obuf[BUFSIZ];
26
27 setbuf(stdout, obuf);
28 argc--;
29 argv++;
30 do {
31 if (argc > 0) {
32 if (freopen(argv[0], "r", stdin) == NULL) {
33 perror(argv[0]);
34 exit(1);
35 }
36 argc--; argv++;
37 }
38 while (fgets(linebuf, sizeof linebuf, stdin) != 0) {
39 for (lp = linebuf; *lp; lp++)
40 continue;
41 *--lp = 0;
42 doulg();
43 dographic();
44 if (genbuf[0])
45 printf("\n%s", genbuf);
46 putchar('\n');
47 fflush(stdout);
48 }
49 } while (argc > 0);
50 exit(0);
51}
52
53dographic()
54{
55 register char *lp;
56 register c;
57
58 for (lp = linebuf; c = *lp++;) {
59 switch (c) {
60 case '\b':
61 if (BACKSPACE == 0)
62 c = '?';
63 break;
64 default:
65 if (c < ' ' || c == 0177)
66 c = '?';
67 break;
68 case '\t':
69 break;
70 }
71 putchar(c);
72 }
73}
74
75doulg()
76{
77 register char *lp, *gp;
78 char *maxgp;
79 register c;
80 char csw;
81 int col;
82
83 gp = genbuf;
84 *gp = 0;
85 maxgp = gp;
86 col = 0;
87 for (lp = linebuf; c = *lp++;) {
88 switch (c) {
89 case '\t':
90 while ((col & 7) != 7) {
91 *gp++ = ' ';
92 if (gp >= &genbuf[LBSIZE - 2])
93 goto ovflo;
94 col++;
95 }
96 break;
97 default:
98 if (gp >= maxgp)
99 break;
100 c =| (*gp & QUOTE);
101 break;
102 case '_':
103 if (gp >= maxgp)
104 c = QUOTE;
105 else
106 c = *gp | QUOTE;
107 break;
108 case '\b':
109 if (gp > genbuf) {
110 gp--;
111 col--;
112 }
113 continue;
114 }
115 if (gp >= &genbuf[LBSIZE - 2]) {
116ovflo:
117 fprintf(stderr, "Line too long\n");
118 exit(1);
119 }
120 *gp++ = c;
121 if (gp > maxgp)
122 maxgp = gp;
123 col++;
124 }
125 *maxgp = 0;
126 strcpy(linebuf, genbuf);
127 for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
128 if (c & QUOTE) {
129 c =& 0177;
130 if (c == 0)
131 *lp = '_', *gp = ' ';
132 else
133 *lp = c, *gp = '-';
134 } else
135 *gp = ' ';
136 --gp;
137 while (gp >= genbuf && *gp == ' ')
138 --gp;
139 gp[1] = 0;
140}