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