xref: /csrg-svn/usr.bin/pascal/USD.doc/csfix.c (revision 48150)
1*48150Sbostic /*-
2*48150Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*48150Sbostic  * All rights reserved.
4*48150Sbostic  *
5*48150Sbostic  * %sccs.include.redist.c%
627789Smckusick  */
727789Smckusick 
827789Smckusick #ifndef lint
927789Smckusick char copyright[] =
10*48150Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
1127789Smckusick  All rights reserved.\n";
12*48150Sbostic #endif /* not lint */
1327789Smckusick 
1427789Smckusick #ifndef lint
15*48150Sbostic static char sccsid[] = "@(#)csfix.c	6.3 (Berkeley) 04/17/91";
16*48150Sbostic #endif /* not lint */
1727789Smckusick 
1827789Smckusick #include <stdio.h>
1927789Smckusick /*
2027789Smckusick  * csfix - fix constant spacing for error message flags in troff
2127789Smckusick  *
2227789Smckusick  * Bill Joy UCB September 11, 1977
2327789Smckusick  *
2427789Smckusick  * This would be better written in snobol!
2527789Smckusick  *
2627789Smckusick  * Normally fixes error flags in a pi listing
2727789Smckusick  * Optional - causes fixing of '---' and initial blank widthin a pxp profile.
2827789Smckusick  */
2927789Smckusick 
3027789Smckusick char	flag, dflag;
3127789Smckusick 
3227789Smckusick main(argc, argv)
3327789Smckusick 	int argc;
3427789Smckusick 	char *argv[];
3527789Smckusick {
3627789Smckusick 
3727789Smckusick 	argc--, argv++;
3827789Smckusick 	if (argc > 0 && argv[0][0] == '-' && argv[0][1] == 'd')
3927789Smckusick 		dflag++, argc--, argv++;
4027789Smckusick 	if (argc > 0 && argv[0][0] == '-')
4127789Smckusick 		flag++, argc--, argv++;
4227789Smckusick 	if (argc != 0) {
4327789Smckusick 		write(2, "Usage: csfix\n", 13);
4427789Smckusick 		exit(1);
4527789Smckusick 	}
4627789Smckusick 	while (getline()) {
4727789Smckusick 		if (errline()) {
4827789Smckusick 			flag ? fixpxp() : reformat();
4927789Smckusick 			continue;
5027789Smckusick 		}
5127789Smckusick 		if (flag) {
5227789Smckusick 			fixdigits();
5327789Smckusick 			continue;
5427789Smckusick 		}
5527789Smckusick 		if (spwarn())
5627789Smckusick 			continue;
5727789Smckusick 		if (nontriv())
5827789Smckusick 			save();
5927789Smckusick 		if (dflag)
6027789Smckusick 			fixdigits();
6127789Smckusick 		else
6227789Smckusick 			putline();
6327789Smckusick 	}
6427789Smckusick 	exit(0);
6527789Smckusick }
6627789Smckusick 
6727791Smckusick char	line[160], flagee[160], *digitty();
6827789Smckusick 
6927789Smckusick getline()
7027789Smckusick {
7127789Smckusick 	register char *cp, c;
7227789Smckusick 
7327789Smckusick 	for (cp = line, c = getchar(); c != '\n' && c != EOF; c = getchar())
7427789Smckusick 		*cp++ = c;
7527789Smckusick 	if (c == EOF)
7627789Smckusick 		return (0);
7727789Smckusick 	*cp = 0;
7827789Smckusick 	return (1);
7927789Smckusick }
8027789Smckusick 
8127789Smckusick errline()
8227789Smckusick {
8327789Smckusick 	register int i;
8427789Smckusick 	register char *cp;
8527789Smckusick 
8627789Smckusick 	for (cp = line; cp[0] && cp[1] && cp[2]; cp++)
8727789Smckusick 		if (cp[0] == '-' && cp[1] == '-' && cp[2] == '-')
8827789Smckusick 			return (1);
8927789Smckusick 	return (0);
9027789Smckusick }
9127789Smckusick 
9227789Smckusick reformat()
9327789Smckusick {
9427789Smckusick 	register char *cp, c, *tail;
9527789Smckusick 
9627789Smckusick 	printf("%2.2s", line);
9727789Smckusick 	if (line[0] != 'w')
9827789Smckusick 		printf("\\l'\\w`w `u-\\w`%2.2s`u '", line);
9927789Smckusick 	for (cp = line; *cp != 0 && *cp != '^'; cp++)
10027789Smckusick 		continue;
10127789Smckusick 	tail = cp + 1;
10227789Smckusick 	if (cp[-1] == '\b' && cp[-2] == '|')
10327791Smckusick 		cp -= 2;
10427789Smckusick 	c = flagee[cp - line];
10527789Smckusick 	flagee[cp - line] = 0;
10627789Smckusick 	printf("\\l'\\w`%s`u-\\w`w `u\\&\\(rh'", flagee);
10727789Smckusick 	flagee[cp - line] = c;
10827798Smckusick 	if (c == '\0')
10927798Smckusick 		c = flagee[cp - line - 1];
11027789Smckusick 	printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
11127789Smckusick 	printf("\\(ua");
11227789Smckusick 	printf("\\l'(\\w`%c`u-\\w`^`u)/2 '", c);
11327789Smckusick 	printf("\\l'\\w`---`u\\&\\(rh'%s\n", tail+3);
11427789Smckusick }
11527789Smckusick 
11627789Smckusick nontriv()
11727789Smckusick {
11827789Smckusick 
11927789Smckusick 	switch (line[0]) {
12027789Smckusick 		case 'E':
12127789Smckusick 		case 'e':
12227789Smckusick 		case 'w':
12327789Smckusick 		case 's':
12427789Smckusick 		case 0:
12527789Smckusick 			return (0);
12627789Smckusick 	}
12727789Smckusick 	return (1);
12827789Smckusick }
12927789Smckusick 
13027789Smckusick save()
13127789Smckusick {
13227789Smckusick 
13327789Smckusick 	strcpy(flagee, line);
13427789Smckusick }
13527789Smckusick 
13627789Smckusick putline()
13727789Smckusick {
13827789Smckusick 
13927789Smckusick 	printf("%s\n", flag ? digitty(0) : line);
14027789Smckusick }
14127789Smckusick 
14227789Smckusick spwarn()
14327789Smckusick {
14427789Smckusick 
14527789Smckusick 	if (line[0] != ' ' || line[1] != ' ' || line[2] != 'w')
14627789Smckusick 		return (0);
14727789Smckusick 	printf("  \\l'(\\w`E`u-\\w`w`u)/2 'w\\l'(\\w`E`u-\\w`w`u)/2 '");
14827789Smckusick 	printf(&line[3]);
14927789Smckusick 	printf("\n");
15027789Smckusick 	return (1);
15127789Smckusick }
15227789Smckusick 
15327789Smckusick fixpxp()
15427789Smckusick {
15527789Smckusick 	register char *cp;
15627789Smckusick 
15727789Smckusick 	for (cp = line; *cp != '-'; cp++)
15827789Smckusick 		continue;
15927789Smckusick 	*cp = 0;
16027789Smckusick 	printf("%s\\l'\\w`\\0\\0\\0\\0`u-\\w`.`u\\&\\(rh'%s\n", digitty(1), cp + 3);
16127789Smckusick }
16227789Smckusick 
16327791Smckusick char *
16427789Smckusick digitty(yup)
16527789Smckusick 	char yup;
16627789Smckusick {
16727789Smckusick 	register char *cp, *dp, *lp;
16827789Smckusick 
16927789Smckusick 	for (lp = line; *lp && *lp != '|'; lp++)
17027789Smckusick 		continue;
17127789Smckusick 	if (yup == 0 && !*lp)
17227789Smckusick 		return (line);
17327789Smckusick 	for (cp = line, dp = flagee; cp < lp; cp++)
17427789Smckusick 		if (*cp == ' ')
17527789Smckusick 			*dp++ = '\\', *dp++ = '0';
17627789Smckusick 		else
17727789Smckusick 			*dp++ = *cp;
17827789Smckusick 	strcpy(dp, cp);
17927789Smckusick 	return (flagee);
18027789Smckusick }
18127789Smckusick 
18227789Smckusick fixdigits()
18327789Smckusick {
18427789Smckusick 	register char *cp, c;
18527789Smckusick 
18627789Smckusick 	for (cp = line; *cp == ' ' || *cp >= '0' && *cp <= '9'; cp++)
18727789Smckusick 		continue;
18827789Smckusick 	c = *cp, *cp = 0;
18927789Smckusick 	digitty(1);
19027789Smckusick 	*cp = c;
19127789Smckusick 	printf("%s%s\n", flagee, cp);
19227789Smckusick }
193