xref: /original-bsd/usr.bin/pascal/pxp/main.c (revision 4c4f737f)
1bc19982fSbostic /*-
2*4c4f737fSbostic  * Copyright (c) 1980, 1993
3*4c4f737fSbostic  *	The Regents of the University of California.  All rights reserved.
4bc19982fSbostic  *
5bc19982fSbostic  * %sccs.include.redist.c%
6062a16d5Sdist  */
7062a16d5Sdist 
8062a16d5Sdist #ifndef lint
9*4c4f737fSbostic static char copyright[] =
10*4c4f737fSbostic "@(#) Copyright (c) 1980, 1993\n\
11*4c4f737fSbostic 	The Regents of the University of California.  All rights reserved.\n";
12bc19982fSbostic #endif /* not lint */
13062a16d5Sdist 
14062a16d5Sdist #ifndef lint
15*4c4f737fSbostic static char sccsid[] = "@(#)main.c	8.1 (Berkeley) 06/06/93";
16bc19982fSbostic #endif /* not lint */
17062a16d5Sdist 
181f23bf53Speter /*
191f23bf53Speter  * pxp - Pascal execution profiler
201f23bf53Speter  *
211f23bf53Speter  * Bill Joy UCB
221f23bf53Speter  * Version 1.2 January 1979
231f23bf53Speter  */
241f23bf53Speter 
251f23bf53Speter #include "0.h"
261f23bf53Speter 
271f23bf53Speter /*
281f23bf53Speter  * This program is described in detail in the "PXP 1.0 Implementation Notes"
291f23bf53Speter  *
301f23bf53Speter  * The structure of pxp is very similar to that of the translator pi.
311f23bf53Speter  * The major new pieces here are a set of profile data maintenance
321f23bf53Speter  * routines in the file pmon.c and a set of pretty printing utility
331f23bf53Speter  * routines in the file pp.c.
341f23bf53Speter  * The semantic routines of pi have been rewritten to do a simple
351f23bf53Speter  * reformatting tree walk, the parsing and scanning remains
361f23bf53Speter  * the same.
371f23bf53Speter  *
381f23bf53Speter  * This version does not place more than one statement per line and
391f23bf53Speter  * is not very intelligent about folding long lines, with only
401f23bf53Speter  * an ad hoc way of folding case label list and enumerated type
411f23bf53Speter  * declarations being implemented.
421f23bf53Speter  */
431f23bf53Speter 
441f23bf53Speter char	usagestr[] =
451f23bf53Speter 	"pxp [ -acdefjntuw_ ] [ -23456789 ] [ -z [ name ... ] ] name.p";
461f23bf53Speter char	*howfile =	"/usr/lib/how_pxp";
4776c7d847Sdonn char	stdoutn[20] =	"Standard output";
481f23bf53Speter 
491f23bf53Speter int	unit =	4;
501f23bf53Speter 
511f23bf53Speter FILE	*ibuf;
521f23bf53Speter extern	char errout;
531f23bf53Speter 
541f23bf53Speter /*
551f23bf53Speter  * Main program for pxp.
561f23bf53Speter  * Process options, then call yymain
571f23bf53Speter  * to do all the real work.
581f23bf53Speter  */
591f23bf53Speter FILE *ibp;
main(argc,argv)601f23bf53Speter main(argc, argv)
611f23bf53Speter 	int argc;
621f23bf53Speter 	char *argv[];
631f23bf53Speter {
641f23bf53Speter 	register char *cp;
651f23bf53Speter 	register c;
661f23bf53Speter 
671f23bf53Speter 	if (argv[0][0] == 'a')
68175ce5f6Slepreau 		howfile += 9;
691f23bf53Speter 	argc--, argv++;
701f23bf53Speter 	if (argc == 0) {
711f23bf53Speter 		execl("/bin/cat", "cat", howfile, 0);
721f23bf53Speter 		goto usage;
731f23bf53Speter 	}
741f23bf53Speter 	while (argc > 0) {
751f23bf53Speter 		cp = argv[0];
761f23bf53Speter 		if (*cp++ != '-')
771f23bf53Speter 			break;
781f23bf53Speter 		while (c = *cp++) switch (c) {
791f23bf53Speter #ifdef DEBUG
801f23bf53Speter 			case 'T':
811f23bf53Speter 				typetest++;
821f23bf53Speter 				continue;
831f23bf53Speter 			case 'A':
841f23bf53Speter 				testtrace++;
851f23bf53Speter 			case 'F':
861f23bf53Speter 				fulltrace++;
871f23bf53Speter 			case 'E':
881f23bf53Speter 				errtrace++;
891f23bf53Speter 				continue;
901f23bf53Speter 			case 'C':
911f23bf53Speter 				yycosts();
921f23bf53Speter 				pexit(NOSTART);
931f23bf53Speter 			case 'U':
941f23bf53Speter 				yyunique++;
951f23bf53Speter 				continue;
961f23bf53Speter #endif
971f23bf53Speter 			case 'a':
981f23bf53Speter 				all++;
991f23bf53Speter 				continue;
1001f23bf53Speter 			case 'c':
1011f23bf53Speter 				core++;
1021f23bf53Speter 				continue;
1031f23bf53Speter 			case 'd':
1041f23bf53Speter 				nodecl++;
1051f23bf53Speter 				continue;
1061f23bf53Speter 			case 'e':
1071f23bf53Speter 				noinclude = -1;
1081f23bf53Speter 				continue;
1091f23bf53Speter 			case 'f':
1101f23bf53Speter 				full++;
1111f23bf53Speter 				continue;
1121f23bf53Speter 			case 'j':
1131f23bf53Speter 				justify++;
1141f23bf53Speter 				continue;
1151f23bf53Speter 			case 'l':
1161f23bf53Speter 			case 'n':
1171f23bf53Speter 				togopt(c);
1181f23bf53Speter 				continue;
1191f23bf53Speter 			case 'o':
1201f23bf53Speter 				onefile++;
1211f23bf53Speter 				continue;
1221f23bf53Speter 			case 's':
1231f23bf53Speter 				stripcomm++;
1241f23bf53Speter 				continue;
1251f23bf53Speter 			case 't':
1261f23bf53Speter 				table++;
1271f23bf53Speter 				continue;
1281f23bf53Speter 			case 'u':
1291f23bf53Speter 			case 'w':
1301f23bf53Speter 				togopt(c);
1311f23bf53Speter 				continue;
1321f23bf53Speter 			case 'z':
1331f23bf53Speter 				profile++;
1341f23bf53Speter 				pflist = argv + 1;
1351f23bf53Speter 				pflstc = 0;
1361f23bf53Speter 				while (argc > 1) {
1371f23bf53Speter 					if (dotted(argv[1], 'p'))
1381f23bf53Speter 						break;
1391f23bf53Speter 					pflstc++, argc--, argv++;
1401f23bf53Speter 				}
1411f23bf53Speter 				if (pflstc == 0)
1421f23bf53Speter 					togopt(c);
1431f23bf53Speter 				else
1441f23bf53Speter 					nojunk++;
1451f23bf53Speter 				continue;
1461f23bf53Speter 			case '_':
1471f23bf53Speter 				underline++;
1481f23bf53Speter 				continue;
149ea828454Speter #			ifdef RMOTHERS
150ea828454Speter 			case 'O':
151ea828454Speter 				rmothers++;
152ea828454Speter 				continue;
153ea828454Speter #			endif RMOTHERS
1541f23bf53Speter 			default:
1551f23bf53Speter 				if (c >= '2' && c <= '9') {
1561f23bf53Speter 					unit = c - '0';
1571f23bf53Speter 					continue;
1581f23bf53Speter 				}
1591f23bf53Speter usage:
1601f23bf53Speter 				Perror("Usage", usagestr);
1611f23bf53Speter 				exit(1);
1621f23bf53Speter 		}
1631f23bf53Speter 		argc--, argv++;
1641f23bf53Speter 	}
1651f23bf53Speter 	if (core && !profile && !table)
1661f23bf53Speter 		profile++;
1671f23bf53Speter 	if (argc == 0 || argc > 2)
1681f23bf53Speter 		goto usage;
1691f23bf53Speter 	if (profile || table) {
1701f23bf53Speter 		noinclude = 0;
1711f23bf53Speter 		if (argc == 2) {
1721f23bf53Speter 			argc--;
1731f23bf53Speter 			getit(argv[1]);
1741f23bf53Speter 		} else
1751f23bf53Speter 			getit(core ? "core" : "pmon.out");
1761f23bf53Speter 	} else
1771f23bf53Speter 		noinclude++;
1781f23bf53Speter 	if (argc != 1)
1791f23bf53Speter 		goto usage;
1801f23bf53Speter 	firstname = filename = argv[0];
1811f23bf53Speter 	if (dotted(filename, 'i')) {
1821f23bf53Speter 		if (profile || table)
1831f23bf53Speter 			goto usage;
1841f23bf53Speter 		noinclude = 1;
1851f23bf53Speter 		bracket++;
1861f23bf53Speter 	} else if (!dotted(filename, 'p')) {
1871f23bf53Speter 		Perror(filename, "Name must end in '.p'");
1881f23bf53Speter 		exit(1);
1891f23bf53Speter 	}
1901f23bf53Speter 	if ((ibuf = fopen(filename, "r")) == NULL)
1911f23bf53Speter 		perror(filename), pexit(NOSTART);
1921f23bf53Speter 	ibp = ibuf;
1931f23bf53Speter 	if (onefile) {
1941f23bf53Speter 		int onintr();
1951f23bf53Speter 
19676c7d847Sdonn 		cp = strcpy(stdoutn, "/tmp/pxp00000") + 13;
1971f23bf53Speter 		signal(2, onintr);
198175ce5f6Slepreau 		for (c = getpid(); c; c /= 10)
199175ce5f6Slepreau 			*--cp |= (c % 10);
2001f23bf53Speter 		if (freopen(stdoutn, "w", stdout) == NULL)
2011f23bf53Speter bad:
2021f23bf53Speter 			perror(stdoutn), exit(1);
2031f23bf53Speter 	}
2041f23bf53Speter 	if (profile || opt('l')) {
2051f23bf53Speter 		opt('n')++;
2061f23bf53Speter 		yysetfile(filename);
2071f23bf53Speter 		opt('n')--;
2081f23bf53Speter 	} else
2091f23bf53Speter 		lastname = filename;
2101f23bf53Speter 	errout = 2;
2111f23bf53Speter 	yymain();
2121f23bf53Speter 	/* No return */
2131f23bf53Speter }
2141f23bf53Speter 
2151f23bf53Speter /*
2161f23bf53Speter  * Put a header on a top of a page
2171f23bf53Speter  */
header()2181f23bf53Speter header()
2191f23bf53Speter {
2201f23bf53Speter 	extern char version[];
2211f23bf53Speter 	static char reenter;
2221f23bf53Speter 	extern int outcol;
2231f23bf53Speter 
224b1959515Smckusick 	gettime(filename);
2251f23bf53Speter 	if (reenter) {
2261f23bf53Speter 		if (outcol)
2271f23bf53Speter 			putchar('\n');
2281f23bf53Speter 		putchar('\f');
2291f23bf53Speter 	}
2301f23bf53Speter 	reenter++;
2311f23bf53Speter 	if (profile || table) {
23248908710Speter 		printf("Berkeley Pascal PXP -- Version %s\n\n%s  %s\n\n",
23348908710Speter 			version, myctime(&tvec), filename);
2341f23bf53Speter 		printf("Profiled %s\n\n", myctime(&ptvec));
2351f23bf53Speter 	}
2361f23bf53Speter }
2371f23bf53Speter 
2381f23bf53Speter char	ugh[] =	"Fatal error in pxp\n";
2391f23bf53Speter /*
2401f23bf53Speter  * Exit from the Pascal system.
2411f23bf53Speter  * We throw in an ungraceful termination
2421f23bf53Speter  * message if c > 1 indicating a severe
2431f23bf53Speter  * error such as running out of memory
2441f23bf53Speter  * or an internal inconsistency.
2451f23bf53Speter  */
pexit(c)2461f23bf53Speter pexit(c)
2471f23bf53Speter 	int c;
2481f23bf53Speter {
2491f23bf53Speter 	register char *cp;
2501f23bf53Speter 	extern int outcol;
2511f23bf53Speter 
2521f23bf53Speter 	if (stdoutn[0] == '/')
2531f23bf53Speter 		unlink(stdoutn);
2541f23bf53Speter 	if (outcol)
2551f23bf53Speter 		putchar('\n');
2561f23bf53Speter 	flush();
2571f23bf53Speter 	if (c == DIED)
2581f23bf53Speter 		write(2, ugh, sizeof ugh);
2591f23bf53Speter 	exit(c);
2601f23bf53Speter }
2611f23bf53Speter 
onintr()2621f23bf53Speter onintr()
2631f23bf53Speter {
2641f23bf53Speter 
2651f23bf53Speter 	pexit(DIED);
2661f23bf53Speter }
2671f23bf53Speter 
puthedr()2681f23bf53Speter puthedr()
2691f23bf53Speter {
2701f23bf53Speter 
2711f23bf53Speter 	yysetfile(filename);
2721f23bf53Speter }
273