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