BSD 1 development
[unix-history] / puman / csfix.c
CommitLineData
5bd13011
BJ
1/*
2 * csfix - fix constant spacing for error message flags in troff
3 *
4 * Bill Joy UCB September 11, 1977
5 *
6 * This would be better written in snobol!
7 *
8 * Normally fixes error flags in a pi listing
9 * Optional - causes fixing of '---' and initial blank widthin a pxp profile.
10 */
11
12char flag, dflag;
13
14main(argc, argv)
15 int argc;
16 char *argv[];
17{
18
19 argc--, argv++;
20 if (argc > 0 && argv[0][0] == '-' && argv[0][1] == 'd')
21 dflag++, argc--, argv++;
22 if (argc > 0 && argv[0][0] == '-')
23 flag++, argc--, argv++;
24 if (argc != 0) {
25 write(2, "Usage: csfix\n", 13);
26 exit(1);
27 }
28 while (getline()) {
29 if (errline()) {
30 flag ? fixpxp() : reformat();
31 continue;
32 }
33 if (flag) {
34 fixdigits();
35 continue;
36 }
37 if (spwarn())
38 continue;
39 if (nontriv())
40 save();
41 if (dflag)
42 fixdigits();
43 else
44 putline();
45 }
46 exit(0);
47}
48
49int ibuf[259];
50
51char line[160], flagee[160];
52
53getline()
54{
55 register char *cp, c;
56
57 for (cp = line, c = getc(ibuf); c != '\n' && c != -1; c = getc(ibuf))
58 *cp++ = c;
59 if (c == -1)
60 return (0);
61 *cp = 0;
62 return (1);
63}
64
65errline()
66{
67 register int i;
68 register char *cp;
69
70 for (cp = line; cp[0] && cp[1] && cp[2]; cp++)
71 if (cp[0] == '-' && cp[1] == '-' && cp[2] == '-')
72 return (1);
73 return (0);
74}
75
76reformat()
77{
78 register char *cp, c, *tail;
79
80 printf("%2.2s", line);
81 if (line[0] != 'w')
82 printf("\\l'\\w`w `u-\\w`%2.2s`u '", line);
83 for (cp = line; *cp != 0 && *cp != '^'; cp++)
84 continue;
85 tail = cp + 1;
86 if (cp[-1] == '\b' && cp[-2] == '|')
87 cp =- 2;
88 c = flagee[cp - line];
89 flagee[cp - line] = 0;
90 printf("\\l'\\w`%s`u-\\w`w `u\\&\\(rh'", flagee);
91 flagee[cp - line] = c;
92 printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
93 printf("\\(ua");
94 printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
95 printf("\\l'\\w`---`u\\&\\(rh'%s\n", tail+3);
96}
97
98nontriv()
99{
100
101 switch (line[0]) {
102 case 'E':
103 case 'e':
104 case 'w':
105 case 's':
106 case 0:
107 return (0);
108 }
109 return (1);
110}
111
112save()
113{
114
115 strcpy(flagee, line);
116}
117
118putline()
119{
120
121 printf("%s\n", flag ? digitty(0) : line);
122}
123
124spwarn()
125{
126
127 if (line[0] != ' ' || line[1] != ' ' || line[2] != 'w')
128 return (0);
129 printf(" \\l'(\\w`E`u-\\w`w`u)/2 'w\\l'(\\w`E`u-\\w`w`u)/2 '");
130 printf(&line[3]);
131 printf("\n");
132 return (1);
133}
134
135fixpxp()
136{
137 register char *cp;
138
139 for (cp = line; *cp != '-'; cp++)
140 continue;
141 *cp = 0;
142 printf("%s\\l'\\w`\\0\\0\\0\\0`u-\\w`.`u\\&\\(rh'%s\n", digitty(1), cp + 3);
143}
144
145digitty(yup)
146 char yup;
147{
148 register char *cp, *dp, *lp;
149
150 for (lp = line; *lp && *lp != '|'; lp++)
151 continue;
152 if (yup == 0 && !*lp)
153 return (line);
154 for (cp = line, dp = flagee; cp < lp; cp++)
155 if (*cp == ' ')
156 *dp++ = '\\', *dp++ = '0';
157 else
158 *dp++ = *cp;
159 strcpy(dp, cp);
160 return (flagee);
161}
162
163fixdigits()
164{
165 register char *cp, c;
166
167 for (cp = line; *cp == ' ' || *cp >= '0' && *cp <= '9'; cp++)
168 continue;
169 c = *cp, *cp = 0;
170 digitty(1);
171 *cp = c;
172 printf("%s%s\n", flagee, cp);
173}